Changeset 1c5ebc5 in rtems


Ignore:
Timestamp:
Apr 28, 2009, 6:20:35 AM (11 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
010e9336
Parents:
c0ec0d8
Message:

2009-04-28 Chris Johns <chrisj@…>

  • Makefile.am: Add bspcmdline.c.
  • include/bsp.h: Add boot command line interfaces.
  • start/start.c: Save the multiboot command line. Pass the command line to boot_card.
  • start/start.S: Update for boot_card command line change.
  • startup/bspstart.c: Initialise the command line.
  • startup/bspcmdline.c: New.
  • console/console.c, ide/idecfg.c: Add boot command line support.
Location:
c/src/lib/libbsp/i386/pc386
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/i386/pc386/ChangeLog

    rc0ec0d8 r1c5ebc5  
     12009-04-28      Chris Johns <chrisj@rtems.org>
     2
     3        * Makefile.am: Add bspcmdline.c.
     4        * include/bsp.h: Add boot command line interfaces.
     5        * start/start.c: Save the multiboot command line. Pass the command
     6        line to boot_card.
     7        * start/start.S: Update for boot_card command line change.
     8        * startup/bspstart.c: Initialise the command line.
     9        * startup/bspcmdline.c: New.
     10        * console/console.c, ide/idecfg.c: Add boot command line support.
     11        * ide/ide.cfg: Add prints for errors to help resolve problems.
     12
    1132009-02-11      Joel Sherrill <joel.sherrill@oarcorp.com>
    214
  • c/src/lib/libbsp/i386/pc386/Makefile.am

    rc0ec0d8 r1c5ebc5  
    9090libbsp_a_SOURCES += ../../shared/bsplibc.c ../../shared/bsppost.c \
    9191    ../../shared/bsppredriverhook.c startup/bspgetworkarea.c \
    92     ../../shared/bsppretaskinghook.c startup/bspstart.c \
     92    ../../shared/bsppretaskinghook.c startup/bspstart.c startup/bspcmdline.c \
    9393    ../../shared/bspclean.c startup/bspreset.c ../../i386/shared/irq/idt.c \
    9494    ../../i386/shared/irq/irq.c ../../i386/shared/irq/irq_init.c \
    95     ../../shared/bootcard.c ../../shared/sbrk.c \
     95    ../../shared/bootcard.c ../../shared/bspinit.c ../../shared/sbrk.c \
    9696    startup/ldsegs.S ../../i386/shared/irq/irq_asm.S
    9797
  • c/src/lib/libbsp/i386/pc386/console/console.c

    rc0ec0d8 r1c5ebc5  
    150150{
    151151  rtems_status_code status;
    152 
     152  const char* mode;
     153 
     154  /*
     155   * Check the command line for the type of mode
     156   * the consol is.
     157   */
     158  mode = bsp_cmdline_arg ("--console=");
     159
     160  if (mode)
     161  {
     162    mode += sizeof ("--console=") - 1;
     163    if (strncmp (mode, "console", sizeof ("console") - 1) == 0)
     164    {
     165      BSPConsolePort = BSP_CONSOLE_PORT_CONSOLE;
     166      BSPPrintkPort  = BSP_CONSOLE_PORT_CONSOLE;
     167    }
     168    else if (strncmp (mode, "com1", sizeof ("com1") - 1) == 0)
     169    {
     170      BSPConsolePort = BSP_UART_COM1;
     171      BSPPrintkPort  = BSP_UART_COM1;
     172    }
     173    else if (strncmp (mode, "com2", sizeof ("com2") - 1) == 0)
     174    {
     175      BSPConsolePort = BSP_UART_COM2;
     176      BSPPrintkPort  = BSP_UART_COM2;
     177    }
     178  }
     179 
    153180  /* Initialize the KBD interface */
    154181  kbd_init();
  • c/src/lib/libbsp/i386/pc386/ide/ide.c

    rc0ec0d8 r1c5ebc5  
    3131
    3232/* #define DEBUG_OUT */
     33
     34static bool pc386_ide_status_busy (uint32_t port,
     35                                   uint32_t timeout,
     36                                   uint8_t* status_val)
     37{
     38  do
     39  {
     40    inport_byte (port + IDE_REGISTER_STATUS, *status_val);
     41    if ((*status_val & IDE_REGISTER_STATUS_BSY) == 0)
     42      return true;
     43
     44    if (timeout)
     45    {
     46      timeout--;
     47      rtems_task_wake_after (TOD_MICROSECONDS_TO_TICKS (1000));
     48    }
     49  }
     50  while (timeout);
     51
     52  return false;
     53}
     54
     55static bool pc386_ide_status_data_ready (uint32_t port,
     56                                         uint32_t timeout,
     57                                         uint8_t* status_val)
     58{
     59  do
     60  {
     61    inport_byte (port + IDE_REGISTER_STATUS, *status_val);
     62   
     63    if (((*status_val & IDE_REGISTER_STATUS_BSY) == 0) &&
     64        (*status_val & IDE_REGISTER_STATUS_DRQ))
     65      return true;
     66
     67    if (timeout)
     68    {
     69      timeout--;
     70      rtems_task_wake_after (TOD_MICROSECONDS_TO_TICKS (1000));
     71    }
     72  }
     73  while (timeout);
     74
     75  return false;
     76}
     77
    3378/*
    3479 * support functions for IDE harddisk IF
     
    175220  uint16_t    cnt = 0;
    176221  uint32_t    llength = bufs[(*cbuf)].length;
    177   uint8_t   status_val;
     222  uint8_t     status_val;
    178223  uint16_t   *lbuf = (uint16_t*)
    179224    ((uint8_t*)(bufs[(*cbuf)].buffer) + (*pos));
    180225
    181   inport_byte(port+IDE_REGISTER_STATUS,status_val);
    182   while ((status_val & IDE_REGISTER_STATUS_DRQ) &&
    183          (cnt < block_size)) {
     226  while (cnt < block_size)
     227  {
     228    if (!pc386_ide_status_data_ready (port, 100, &status_val))
     229    {
     230      printk ("pc386_ide_read_block: status=%02x, cnt=%d bs=%d\n", status_val, cnt, block_size);
     231      /* FIXME: add an error here. */
     232      return;
     233    }
     234   
     235    if (status_val & IDE_REGISTER_STATUS_ERR)
     236      printk("pc386_ide_read_block: error: %02x\n", status_val);
     237   
    184238    inport_word(port+IDE_REGISTER_DATA,*lbuf);
    185239
     
    187241    printk("0x%x ",*lbuf);
    188242#endif
     243
    189244    lbuf++;
    190245    cnt    += sizeof(*lbuf);
     
    196251      llength = bufs[(*cbuf)].length;
    197252    }
    198     inport_byte(port+IDE_REGISTER_STATUS,status_val);
    199   }
    200 #ifdef DEBUG_OUT
    201   printk("pc386_ide_read_block()\r\n");
    202 #endif
     253  }
    203254}
    204255
     
    231282  uint16_t   *lbuf = (uint16_t*)
    232283    ((uint8_t*)(bufs[(*cbuf)].buffer) + (*pos));
    233 
    234 #ifdef DEBUG_OUT
    235   printk("pc386_ide_write_block()\r\n");
    236 #endif
    237   inport_byte(port+IDE_REGISTER_STATUS,status_val);
    238   while ((status_val & IDE_REGISTER_STATUS_DRQ) &&
    239          (cnt < block_size)) {
     284 
     285#ifdef DEBUG_OUT
     286  printk("pc386_ide_write_block()\n");
     287#endif
     288
     289  while (cnt < block_size)
     290  {
     291    if (!pc386_ide_status_data_ready (port, 100, &status_val))
     292    {
     293      printk ("pc386_ide_write_block: status=%02x, cnt=%d bs=%d\n", status_val, cnt, block_size);
     294      /* FIXME: add an error here. */
     295      return;
     296    }
     297   
     298    if (status_val & IDE_REGISTER_STATUS_ERR)
     299      printk("pc386_ide_write_block: error: %02x\n", status_val);
     300   
    240301#ifdef DEBUG_OUT
    241302    printk("0x%x ",*lbuf);
     
    251312      llength = bufs[(*cbuf)].length;
    252313    }
    253     inport_byte(port+IDE_REGISTER_STATUS,status_val);
    254314  }
    255315}
  • c/src/lib/libbsp/i386/pc386/ide/idecfg.c

    rc0ec0d8 r1c5ebc5  
    3636/* IDE controllers Table */
    3737ide_controller_bsp_table_t IDE_Controller_Table[] = {
    38 #if IDE_USE_PRIMARY_INTERFACE
    3938  {"/dev/ide0",
    4039   IDE_STD, /* standard IDE controller */
     
    4645   NULL
    4746  }
    48 #if IDE_USE_SECONDARY_INTERFACE
    4947  , /* colon only needed when both interfaces present */
    50 #endif
    51 #endif
    52 #if IDE_USE_SECONDARY_INTERFACE
    5348  {"/dev/ide1",
    5449   IDE_STD, /* standard IDE controller */
     
    6055   NULL
    6156  }
    62 #endif
    6357};
    6458
    65 /* Number of rows in IDE_Controller_Table */
    66 unsigned long IDE_Controller_Count =
    67    sizeof(IDE_Controller_Table)/sizeof(IDE_Controller_Table[0]);
     59/* Number of rows in IDE_Controller_Table. Default is 0. */
     60unsigned long IDE_Controller_Count;
     61
     62#if IDE_USE_PRIMARY_INTERFACE
     63#define IDE1_DEFAULT true
     64#else
     65#define IDE1_DEFAULT false
     66#endif
     67#if IDE_USE_SECONDARY_INTERFACE
     68#define IDE2_DEFAULT true
     69#else
     70#define IDE2_DEFAULT false
     71#endif
     72
     73void bsp_ide_cmdline_init(void)
     74{
     75  bool ide1 = IDE1_DEFAULT;
     76  bool ide2 = IDE2_DEFAULT;
     77  const char* ide;
     78 
     79  /*
     80   * Can have:
     81   *  --ide=1,2
     82   */
     83  ide = bsp_cmdline_arg ("--ide=");
     84 
     85  if (ide)
     86  {
     87    int i;
     88    /*
     89     * If a command line option exists remove the defaults.
     90     */
     91    ide1 = ide2 = false;
     92   
     93    ide += sizeof ("--ide=") - 1;
     94   
     95    for (i = 0; i < 3; i++)
     96    {
     97      switch (ide[i])
     98      {
     99        case '1':
     100          ide1 = true;
     101          break;
     102        case '2':
     103          ide2 = true;
     104          break;
     105        case '3':
     106        case '4':
     107        case '5':
     108        case '6':
     109        case '7':
     110        case '8':
     111        case '9':
     112        case ',':
     113          break;
     114        default:
     115        break;
     116      }
     117    }
     118  }
     119
     120  if (ide2 && !ide1)
     121    IDE_Controller_Table[0] = IDE_Controller_Table[1];
     122
     123  if (ide1)
     124    IDE_Controller_Count++;
     125  if (ide2)
     126    IDE_Controller_Count++;
     127}
  • c/src/lib/libbsp/i386/pc386/include/bsp.h

    rc0ec0d8 r1c5ebc5  
    184184
    185185/*
     186 * Command line.
     187 */
     188const char* bsp_cmdline(void);
     189const char* bsp_cmdline_arg(const char* arg);
     190
     191/*
     192 * IDE command line parsing.
     193 */
     194void bsp_ide_cmdline_init(void);
     195
     196/*
    186197 * indicate, that BSP has IDE driver
    187198 */
  • c/src/lib/libbsp/i386/pc386/start/start.S

    rc0ec0d8 r1c5ebc5  
    8989        cld
    9090
    91                 /* Save multiboot info */
    92                 cmp     $0x2badb002,eax
    93                 jne             1f
    94                 /* We have multiboot info; let's hope DS and ES are OK... */
    95                 movl    ebx, SYM(_boot_multiboot_info_p)
    96                 /* Check for memory size info and save */
    97                 movl    ebx, esi
    98                 movl    $SYM(_boot_multiboot_info), edi
    99                 movsd
    100                 /* only save flag 1 since that's the only data we save */
    101                 and             $1,-4(edi)
    102                 je              1f
    103                 movl    $2,ecx
    104                 rep movsd
    105 1:
     91        /* Save multiboot info if we detect a multiboot loader */
     92        cmp     $0x2badb002,eax
     93        jne     2f
     94       
     95        /* We have multiboot info; let's hope DS and ES are OK... */
     96        movl    ebx, SYM(_boot_multiboot_info_p)
     97        /* Check for memory size info and save */
     98        movl    ebx, esi
     99        movl    (esi), eax
     100        movl    eax, ebx
     101        movl    $SYM(_boot_multiboot_info), edi
     102        /* save flags, always present */
     103        movsd
     104        /* flag 1 is memory */
     105        and     $1, eax
     106        je      1f
     107        movl    $2, ecx
     108        rep movsd
     109        /* flag 2 is the command line */
     1101:      movl    ebx, eax
     111        and     $4, eax
     112        je      3f
     113        movl    (_boot_multiboot_info_p), eax
     114        movl    16(eax), esi
     115        movl    $255, ecx
     1162:      movzbl  (esi), eax
     117        test    al, al
     118        je      3f
     119        movb    al, (edi)
     120        inc     edi
     121        inc     esi
     122        dec     ecx
     123        je      3f
     124        jmp     2b
     1253:      xor     al, al
     126        movb    al, (edi)
    106127#ifdef DEBUG_EARLY_START
    107128        /*
     
    179200+---------------------------------------------------------------------*/
    180201
    181         pushl   $0                      # environp
    182         pushl   $0                      # argv
    183         pushl   $0                      # argc
     202        movl    $SYM(_boot_multiboot_cmdline), eax
     203        pushl   eax                     # cmdline
    184204        call    SYM (boot_card)
    185         addl    $12, esp
     205        addl    $4, esp
    186206
    187207/*---------------------------------------------------------------------+
     
    200220
    201221        PUBLIC(_boot_multiboot_info)
     222        PUBLIC(_boot_multiboot_flags)
     223        PUBLIC(_boot_multiboot_memory)
     224        PUBLIC(_boot_multiboot_cmdline)
    202225SYM(_boot_multiboot_info):
     226SYM(_boot_multiboot_flags):
    203227        .long 0 /* flags */
     228SYM(_boot_multiboot_memory):
    204229        .long 0 /* mem_lower */
    205230        .long 0 /* mem_upper */
    206 
     231SYM(_boot_multiboot_cmdline):
     232        .rept 256 /* cmd line */
     233        .byte 0
     234        .endr
     235       
    207236        PUBLIC(_stack_size)
    208237SYM(_stack_size):
  • c/src/lib/libbsp/i386/pc386/startup/bspstart.c

    rc0ec0d8 r1c5ebc5  
    7979      printk("PCI bus: could not initialize PCI BIOS interface\n");
    8080  }
     81
     82  bsp_ide_cmdline_init ();
     83
    8184} /* bsp_start */
    8285
Note: See TracChangeset for help on using the changeset viewer.