File system and CompactFlash question on MCF5485EVB board

Chris Xenophontos cxenophontos at hammers.com
Tue Nov 13 15:31:46 UTC 2012


OK, some progress -
I temporarily modified ata.c to force C/H/S addressing for Compact Flash
card (even though LBA status is set).
Now, I can read data and partition info from MBR. Partition info begins at
offset 446, last two bytes are 0x55 and 0xAA, as expected.
Previously, under LBA mode, the entire MBR was read back as zeros, even
when reading from LBA=0, or 63, etc.

After initialization, at RTEMS shell, the following info (reformatted)
displays when fdisk is entered:

[/] # fdisk /dev/hda
PARTITION TABLE
 BEGIN   63
 END     7830144
 TYPE    FAT 32

This is consistent with Transcend 4GB card we are using, i.e, 7830144 * 512
= 4GB.

However, when attempting to mount, we get the following error:
fsmount: mounting of "/dev/hda1" to "/mnt/hda1" failed: Invalid argument
fsmount: mounting of "/dev/hda2" to "/mnt/hda2" failed: No such file or
directory

The second error is expected, but not the first.

We get same error when we try to mount by command line, ie,

[/dev] # cd /
[/] # mkdir cf
[/] # mount -t dosfs /dev/hda /cf

!!! mount.c: no mount of base file system !!!
error: Invalid argument

fstable and relevant source lines  are as follows:
////////////////////////////////////////////////////////////////////////////////
fstab_t fs_table[] =
{
  {
    "/dev/hda1", "/mnt/hda1", "dosfs",
    RTEMS_FILESYSTEM_READ_WRITE,
    FSMOUNT_MNT_OK | FSMOUNT_MNTPNT_CRTERR | FSMOUNT_MNT_FAILED,
    0
  }
,
  {
    "/dev/hda2","/mnt/hda2", "dosfs",
    RTEMS_FILESYSTEM_READ_WRITE,
    FSMOUNT_MNT_OK | FSMOUNT_MNTPNT_CRTERR | FSMOUNT_MNT_FAILED,
    0
  }
};
////////////////  from application initialization code
 ////////////////////////

    sc = rtems_bdpart_register_from_disk( "/dev/hda" );

    rv = rtems_fsmount( fs_table, sizeof(fs_table)/sizeof(fs_table[0]),
NULL);

////////////////////////////////////////////////////////////////////////////////

what are we doing wrong?

thanks in advance!

Chris Xenophontos


On Sun, Nov 4, 2012 at 10:24 PM, Chris Xenophontos <cxenophontos at hammers.com
> wrote:

> I retraced my steps, and I am still reading zeroes for all 512 bytes of
> first sector, which is supposed to be MBR(?).  I'm not even seeing the 0xAA
> and 0x55 markers at end of sector.  Does CF card need to be reformatted?
>  Or is MBR located somewhere other than first sector?
> thanks
> Chris
>
>
>
>
>
> On Fri, Nov 2, 2012 at 10:31 AM, Chris Xenophontos <
> cxenophontos at hammers.com> wrote:
>
>> thanks Ric - I'll incorporate at next opportunity, and post back
>> Chris
>>
>>
>> On Fri, Nov 2, 2012 at 1:44 AM, Claus, Ric <claus at slac.stanford.edu>wrote:
>>
>>> I ran into the same kind of issue but with and SD card.  The problem is
>>> that the files you're interested in are in the first partition, not in the
>>> MBR area of the disk.  Thus you need to dereference the first partition
>>> descriptor found in the MBR to find the Volume ID (see
>>> http://www.pjrc.com/tech/8051/ide/fat32.html), and use that to access
>>> your files.  The following snippet of
>>> $RTEM_ROOT/src/cpukit/libmisc/fsmount/fsmount.h helped me to figure out
>>> what is going on:
>>>
>>>  * The following example code tries to mount a FAT file system within a
>>> SD
>>>  * Card.  Some cards do not have a partition table so at first it tries
>>> to find
>>>  * a file system inside the hole disk.  If this is successful the mount
>>> process
>>>  * will be aborted because the @ref RTEMS_FSTAB_OK condition is true.
>>>  If this
>>>  * did not work it tries to mount the file system inside the first
>>> partition.
>>>  * If this fails the mount process will not be aborted (this is already
>>> the
>>>  * last entry), but the last error status will be returned.
>>>  *
>>>  * @code
>>>  * #include <stdio.h>
>>>  * #include <string.h>
>>>  * #include <errno.h>
>>>  *
>>>  * #include <rtems.h>
>>>  * #include <rtems/bdpart.h>
>>>  * #include <rtems/error.h>
>>>  * #include <rtems/fsmount.h>
>>>  *
>>>  * static const rtems_fstab_entry fstab [] = {
>>>  *   {
>>>  *     .source = "/dev/sd-card-a",
>>>  *     .target = "/mnt",
>>>  *     .type = "dosfs",
>>>  *     .options = RTEMS_FILESYSTEM_READ_WRITE,
>>>  *     .report_reasons = RTEMS_FSTAB_ANY,
>>>  *     .abort_reasons = RTEMS_FSTAB_OK
>>>  *   }, {
>>>  *     .source = "/dev/sd-card-a1",
>>>  *     .target = "/mnt",
>>>  *     .type = "dosfs",
>>>  *     .options = RTEMS_FILESYSTEM_READ_WRITE,
>>>  *     .report_reasons = RTEMS_FSTAB_ANY,
>>>  *     .abort_reasons = RTEMS_FSTAB_NONE
>>>  *   }
>>>  * };
>>>  *
>>>  * static void my_mount(void)
>>>  * {
>>>  *   rtems_status_code sc = RTEMS_SUCCESSFUL;
>>>  *   int rv = 0;
>>>  *   size_t abort_index = 0;
>>>  *
>>>  *   sc = rtems_bdpart_register_from_disk("/dev/sd-card-a");
>>>  *   if (sc != RTEMS_SUCCESSFUL) {
>>>  *     printf("read partition table failed: %s\n",
>>> rtems_status_text(sc));
>>>  *   }
>>>  *
>>>  *   rv = rtems_fsmount(fstab, sizeof(fstab) / sizeof(fstab [0]),
>>> &abort_index);
>>>  *   if (rv != 0) {
>>>  *     printf("mount failed: %s\n", strerror(errno));
>>>  *   }
>>>  *   printf("mount aborted at %zu\n", abort_index);
>>>  * }
>>>  * @endcode
>>>
>>>
>>> Cheers,
>>>             Ric
>>>
>>>
>>> ________________________________________
>>> From: rtems-users-bounces at rtems.org [rtems-users-bounces at rtems.org] On
>>> Behalf Of Chris Xenophontos [cxenophontos at hammers.com]
>>> Sent: Thursday, November 01, 2012 8:02 PM
>>> To: rtems-users at rtems.org
>>> Subject: File system and CompactFlash question on MCF5485EVB board
>>>
>>> We are currently running RTEMS 4.10.2 on a Coldfire MCF5485EVB board,
>>> with a Transcend 4GB Compact Flash Card installed in respective slot.  The
>>> required manufacturer's firmware has been downloaded onto CPLD in order to
>>> access Compact Flash, etc.
>>>
>>> The Compact Flash socket is wired on the board to use 16-bit accesses,
>>> (both enables tied together), and memory mapped mode only.
>>>
>>> We want to use the Compact Flash card for file storage for our
>>> application, not for bootup.
>>>
>>> I've modified an existing ATA/IDE driver to access Compact Flash card,
>>> as directed in RTEMS File System documentation.
>>>
>>> The ATA driver initializes and reads Compact Flash card status
>>> correctly, and, when Identify Drive command is sent to card, the correct
>>> expected data is returned.  First word is 0x848A, and driver correctly
>>> interprets cylinder/head/sector and LBA info - since these values translate
>>> into the card's capacity of 4GB.  Logical Block Addressing is used.
>>>
>>> The problem we have is, during register and mount process, the file
>>> system attempts to read an MBR from the Compact Flash card - however, all
>>> zeroes are returned, and the process fails.
>>>
>>> When a file is written to CompactFlash card using a PC, it can be
>>> listed, etc, so the card appears to be OK.  And because the Identify Device
>>> command causes the card to return expected data, the HW interface from our
>>> Coldfire board appears to be OK as well.
>>>
>>> Relevant parts from rtems.c are included below - any help is greatly
>>> appreciated!!
>>>
>>> thanks
>>> Chris Xenophontos
>>>
>>> #include <stdlib.h>
>>> #include <rtems.h>
>>> #include <bsp.h>
>>> #include <unistd.h>
>>>
>>> #include <rtems/rtems_bsdnet.h>
>>> #include <rtems/libio.h>
>>> #include <rtems/shellconfig.h>     // added for shell/filesystem support
>>> #include <rtems/ide_part_table.h>
>>> #include "networkconfig.h"
>>> #include <libchip/ide_ctrl_cfg.h>
>>> #include <libchip/ide_ctrl_io.h>
>>> #include  <libchip/ata.h>
>>> #include <rtems/bdpart.h>
>>> #include <rtems/dosfs.h>
>>> #include <rtems/fsmount.h>
>>>
>>> rtems_task Init( rtems_task_argument ignored );
>>> extern int xmain( void );
>>>
>>>
>>> fstab_t fs_table[] =
>>> {
>>>   {
>>>     "/dev/hda","/mnt/cf", "dosfs",
>>>     RTEMS_FILESYSTEM_READ_WRITE,
>>>     FSMOUNT_MNT_OK | FSMOUNT_MNTPNT_CRTERR | FSMOUNT_MNT_FAILED,
>>>     0
>>>   }
>>> };
>>>
>>>
>>>
>>> rtems_task Init( rtems_task_argument ignored )
>>> {
>>>     rtems_status_code sc;
>>>     int rv;
>>>     size_t abort_index;
>>>
>>>    /*     * * * *   /
>>>
>>>     abort_index = 0;
>>>
>>>     sc = rtems_bdpart_register_from_disk( "/dev/hda" );
>>>
>>>     rv = rtems_fsmount( fs_table, sizeof(fs_table)/sizeof(fs_table[0]),
>>> NULL);
>>>
>>>     printf( "\n\nrtems_bdpart_register_from_disk status: %d\n", sc );
>>>  // returns 27 = IO_ERROR
>>>     printf(   "\nrtems_fsmount status status:            %d\n", rv );
>>>        // return 0
>>>
>>>    /*     * * * *   /
>>>
>>>     sc = rtems_shell_init ( "fstst", 60 * 1024, 150, "/dev/console", 0,
>>> 1, 0 );
>>>
>>>    /*     * * * *   /
>>>
>>>     printf( "\nEntering xmain....\n" );
>>>
>>>     xmain();
>>> };
>>>
>>>    /*     * * * *   /
>>>
>>> #define TASK_INTLEVEL 0
>>> #define CONFIGURE_INIT
>>> #define CONFIGURE_INIT_TASK_ATTRIBUTES ( RTEMS_FLOATING_POINT |
>>> RTEMS_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_ASR |
>>> RTEMS_INTERRUPT_LEVEL(TASK_INTLEVEL))
>>>
>>> #define CONFIGURE_MAXIMUM_TASKS               20
>>> /*( SYS_MAX_TASKS + 7 ) */
>>> #define CONFIGURE_MAXIMUM_TIMERS               3
>>>
>>>
>>> #define CONFIGURE_MAXIMUM_SEMAPHORES          20 //12   // 16
>>> #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES      24   //SB_MAX_PIPES=23
>>>  //32
>>> /* #define CONFIGURE_INIT_TASK_STACK_SIZE      2048 */
>>>
>>> #define CONFIGURE_INIT_TASK_STACK_SIZE (10*1024)
>>> #define CONFIGURE_INIT_TASK_PRIORITY   120
>>> #define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \
>>>                                            RTEMS_NO_TIMESLICE | \
>>>                                            RTEMS_NO_ASR | \
>>>                                            RTEMS_INTERRUPT_LEVEL(0))
>>>
>>> #define ADA_TASKS  0
>>>
>>> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>>>
>>> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>>>
>>> #define CONFIGURE_MAXIMUM_DRIVERS                   10
>>> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>>> #define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
>>> #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS    30
>>> #define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
>>> #define CONFIGURE_FILESYSTEM_DOSFS
>>>
>>> #define CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER
>>> #define CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
>>> #define CONFIGURE_ATA_DRIVER_TASK_PRIORITY           9
>>> #define CONFIGURE_BDBUF_MAX_WRITE_BLOCKS             512
>>> #define CONFIGURE_MICROSECONDS_PER_TICK           10000
>>> #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS    30
>>>
>>> #define CONFIGURE_SHELL_COMMANDS_INIT         // added for
>>> shell/filesystem support
>>> #define CONFIGURE_SHELL_COMMANDS_ALL     // added for shell/filesystem
>>> support
>>>
>>> ////////////////////////////////////////////////////////////////
>>> #include <rtems/confdefs.h>
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20121113/2ea67942/attachment-0001.html>


More information about the users mailing list