fileio example on HD more than 2GB

Grigori Khmyrov grigori_khmyrov at uml.edu
Mon May 1 15:10:14 UTC 2006


I dig deeper in fileio example and found fixes for problems I had.


I'm reminding. I had 4 computers: 3 laptops and 1 old desktop (with 4 
different small <2GB HDs)

Only one laptop worked OK with fileio example.

1. Two other laptops: program stopped at line 1231 of 
cpukit/libblock/src/bdbuf.c
_CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE, WATCHDOG_NO_TIMEOUT, 
level);

Fix is: I commented out #define DEBUG in ata.c
It was defined!!!

As a result the code was executed
#ifdef DEBUG
        /*
         * read IDE_REGISTER_ALTERNATE_STATUS instead IDE_REGISTER_STATUS
         * to prevent clearing of pending interrupt
         */
        ide_controller_read_register(ctrl_minor,
                                     IDE_REGISTER_ALTERNATE_STATUS,
                                     &val);
        if (val & IDE_REGISTER_STATUS_BSY)
            return;
#endif
val was not busy only for one laptop. For others it never released
semaphore and returned without any messages!

2. On the desktop error code after init partition was 25 - INTERNAL 
RTEMS ERROR

I found ide read block function never read all 512 bytes only 508 of them.
As a result it was no MSDOS signature in MBR (sector 0).

In ide.c I commented out status_val usage:

/*=========================================================================*\
| 
Function:                                                                 |
\*-------------------------------------------------------------------------*/
void pc386_ide_read_block
(
/*-------------------------------------------------------------------------*\
| 
Purpose:                                                                  |
|  read a IDE controller data 
block                                         |
+---------------------------------------------------------------------------+
| Input 
Parameters:                                                         |
\*-------------------------------------------------------------------------*/
 int minor,
 unsigned16 block_size,
 blkdev_sg_buffer *bufs,
 rtems_unsigned32 *cbuf,
 rtems_unsigned32 *pos
 )
/*-------------------------------------------------------------------------*\
| Return 
Value:                                                             |
|    
<none>                                                                 |
\*=========================================================================*/
{
  unsigned32  port = IDE_Controller_Table[minor].port1;
  unsigned16  cnt = 0;
  unsigned32  llength = bufs[(*cbuf)].length;
//  unsigned8 status_val;
  unsigned16 *lbuf = (unsigned16 *)
    ((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
//#define DEBUG_OUT

//  inport_byte(port+IDE_REGISTER_STATUS,status_val);
  while (/*(status_val & IDE_REGISTER_STATUS_DRQ) && */
         (cnt < block_size)) {
    inport_word(port+IDE_REGISTER_DATA,*lbuf);

#ifdef DEBUG_OUT
    printk("%d:0x%x:%d ",cnt, *lbuf, status_val);
#endif
    lbuf++;
    cnt    += sizeof(*lbuf);
    (*pos) += sizeof(*lbuf);
    if ((*pos) == llength) {
      (*pos) = 0;
      (*cbuf)++;
      lbuf = bufs[(*cbuf)].buffer;
      llength = bufs[(*cbuf)].length;
    }
//    inport_byte(port+IDE_REGISTER_STATUS,status_val);
  }
#ifdef DEBUG_OUT
  printk("\npc386_ide_read_block() pos = %d\n", (*pos));
printk("read ide, llength = %d, block_size = %d, IDE_REGISTER_STATUS_DRQ 
%d\n",
  llength, block_size, IDE_REGISTER_STATUS_DRQ);
#endif
}

It works now with all ide/HD I have.
I use RTEMS 4.6.2.
I change only my local versions of files.

Can somebody look at the current version. I don't work with RTEMS cvs 
for now.

Thank you,
Grigori


Grigori Khmyrov wrote:

> Can RTEMS handle big hard drives?
> Any help appreciated in solving this mystery.
>
> After that big discussion about FileIO example we got it working.
> But it still some issues.
>
> 500 MB Hard drive    500 MB FAT16 partition   ---    works OK
>    3 GB Hard drive     800 MB FAT16 partition   ---   DOESN'T work
>    4 GB Hard drive         2 GB  FAT16 partition   ---   DOESN'T work
>
> It's same like Yan Lou reported:
> Problem is in initializing partition of /dev/hda using FileIO  example.
> Program stops at 1231 of cpukit/libblock/src/bdbuf.c
>
> _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
>                              WATCHDOG_NO_TIMEOUT, level);
>
> Here is the call graph:
>
> in cpukit/libblock/src/ide_part_table.c
>
> rtems_ide_part_table_initialize() --> rtems_ide_part_table_get() -->  
> read_mbr() --> get_sector() --> rtems_bdbuf_read()
>
> in cpukit/libblock/src/bdbuf.c
>
> rtems_bdbuf_read() --> _CORE_mutex_Seize()
>
> Thank you,
> Grigori
>




More information about the users mailing list