File system and CompactFlash question on MCF5485EVB board

Chris Xenophontos cxenophontos at hammers.com
Fri Nov 2 14:31:24 UTC 2012


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/20121102/fb05d5e3/attachment-0001.html>


More information about the users mailing list