<br><font size=2 face="sans-serif">Hi,</font>
<br>
<br><font size=2 face="sans-serif">I got everything ready to send an example
and to include a wiki entry but fist...the example is only working in rtems-4.7.99.2-1.0.3.
I also tried with RTEMS 4.6.5 but looks like some functions are not implemented
in this version. This is the compilation output.</font>
<br>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:
In function `Init':</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:48:
`msdos_format_request_param_t' undeclared (first use in this function)</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:48:
(Each undeclared identifier is reported only once</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:48:
for each function it appears in.)</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:48:
syntax error before "rqdata"</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:52:
`rqdata' undeclared (first use in this function)</font>
<br><font size=2 face="sans-serif">/home/aitor/workspace/ramdisk/src/test2.c:55:
`MSDOS_FMT_FATANY' undeclared (first use in this function)</font>
<br><font size=2 face="sans-serif">make: *** [/home/aitor/workspace/ramdisk/obj/test2.o]
Error 1</font>
<br>
<br><font size=2 face="sans-serif">Looks like the msdos_format capabilities
are not implemented in the 4.6.5 RTEMS version. Am I right?</font>
<br>
<br>
<br><font size=2 face="sans-serif">Cheers,</font>
<br>
<br><font size=2 face="sans-serif">//avs</font>
<br>
<br>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td width=40%><font size=1 face="sans-serif"><b>Thomas Doerfler <Thomas.Doerfler@embedded-brains.de></b>
</font>
<p><font size=1 face="sans-serif">11/14/2007 08:28 PM</font>
<td width=59%>
<table width=100%>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td><font size=1 face="sans-serif">Aitor.Viana.Sanchez@esa.int</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td><font size=1 face="sans-serif">rtems-users@rtems.org</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td><font size=1 face="sans-serif">Re: External RAM filesystem</font></table>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br>
<br><tt><font size=2>Hi,<br>
</font></tt>
<br>
<br><tt><font size=2>Aitor.Viana.Sanchez@esa.int schrieb:<br>
><br>
> Based on the example i made (see bellow) i got questions.<br>
><br>
> Basically this example allows to read/write information in the RAMDISK<br>
> area (which is an array in the example) by means of the filesystem
API<br>
> but does not allow to create files because the open/f_open routine
shall<br>
> open the "/dev/ramdisk0" device.<br>
</font></tt>
<br><tt><font size=2>what you see is that you can access the raw device.
This is good, but<br>
not sufficent :-)<br>
</font></tt>
<br>
<br><tt><font size=2>> Is it possible to "mount" somehow the
/dev/ramdisk0 and then, using the<br>
> open/f_open, etc. calls to create file inside this RAMDISK?<br>
</font></tt>
<br><tt><font size=2>Sure this is the overall goal!<br>
</font></tt>
<br><tt><font size=2>I have search my old software dungeon and found some
bits and pieces<br>
which should lead the further way.<br>
</font></tt>
<br><tt><font size=2>Obviously your raw device worls, so you now need to:<br>
- format it to contain a proper DOSFS disk structure.<br>
</font></tt>
<br><tt><font size=2>You can do this with the following call:<br>
</font></tt>
<br><tt><font size=2>{<br>
msdos_format_request_param_t rqdata;</font></tt>
<br>
<br><tt><font size=2>memset(&rqdata,0,sizeof(rqdata);<br>
rqdata.OEMName="Rtems";<br>
rqdata.VolLabel="MyRTEMSDIsk";<br>
rqdata.fattype=MSDOS_FMT_FATANY;<br>
rqdata.quick_format=TRUE;</font></tt>
<br>
<br><tt><font size=2>msdos_format("/dev/ramdisk0",&rqdata);<br>
}<br>
</font></tt>
<br><tt><font size=2>Now the ramdisk should have a proper data format in
its sectors.<br>
</font></tt>
<br><tt><font size=2>The next steps are to:<br>
- create a mount point (a directory in the IMFS that will be used as a<br>
"hook" to the DOSFS).<br>
- mount the ramdisk at this mount point.<br>
</font></tt>
<br><tt><font size=2>You can do this either with the corresponding classic
calls or use the<br>
table-based "rtems_fsmount" function for this:<br>
fstab_t fs_mnt_table[] = {</font></tt>
<br><tt><font size=2>{<br>
"/dev/ramdisk0","/mnt/ramdisk",<br>
&msdos_ops, RTEMS_FILESYSTEM_READ_WRITE,<br>
FSMOUNT_MNT_OK | FSMOUNT_MNT_CRTERR | FSMOUNT_MNT_FAILED,<br>
0</font></tt>
<br><tt><font size=2>}<br>
};<br>
</font></tt>
<br><tt><font size=2>rtems_fsmount(fs_mnt_table,<br>
sizeof(fs_mnt_table)/sizeof(fs_mnt_table[0]),<br>
NULL);</font></tt>
<br>
<br><tt><font size=2>Then your ramdisk is accessible starting at "/mnt/ramdisk".<br>
</font></tt>
<br><tt><font size=2>Please give some feedback if things work right. And
don't forget the<br>
Wiki (hint,hint!)<br>
</font></tt>
<br><tt><font size=2>good luck,<br>
Thomas.<br>
</font></tt>
<br><tt><font size=2>><br>
> Cheers,<br>
><br>
> Sitor<br>
><br>
><br>
> Here is the example I made.<br>
><br>
> *rtems-config.h file --------------->*<br>
><br>
> #ifndef RTEMSCONFIG_H_<br>
> #define RTEMSCONFIG_H_<br>
><br>
> /* configuration information */<br>
><br>
> rtems_task Init( rtems_task_argument argument);<br>
> extern char ramdisk[];<br>
><br>
> #define CONFIGURE_NEEDS_CONSOLE_DRIVER<br>
><br>
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>
><br>
> #define CONFIGURE_MAXIMUM_TASKS 10<br>
> #define CONFIGURE_MAXIMUM_SEMAPHORES 10<br>
> #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4<br>
><br>
> rtems_bdbuf_config rtems_bdbuf_configuration[] = {<br>
>   { 512, 40, (void *) ramdisk }<br>
> };<br>
> int rtems_bdbuf_configuration_size = 1;<br>
><br>
> rtems_ramdisk_config rtems_ramdisk_configuration[] = {<br>
>   {<br>
>      512, 40, (void *) ramdisk<br>
>   }<br>
> };<br>
><br>
> // The sparc-rtems-gcc version 4 changes the location of the confdefs.h<br>
> file.<br>
> #if (__GNUC__ > 3)<br>
> size_t rtems_ramdisk_configuration_size = 1;<br>
> rtems_task_priority swapout_task_priority = 100;<br>
> #else<br>
> int rtems_ramdisk_configuration_size = 1;<br>
> #endif<br>
><br>
><br>
> #define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE<br>
> rtems_driver_address_table Device_drivers[] = {<br>
>   CONSOLE_DRIVER_TABLE_ENTRY,<br>
>   CLOCK_DRIVER_TABLE_ENTRY,<br>
>   RAMDISK_DRIVER_TABLE_ENTRY<br>
> };<br>
> #define CONFIGURE_NUMBER_OF_DRIVERS \<br>
>   ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))<br>
> #define CONFIGURE_MAXIMUM_DRIVERS 10<br>
><br>
><br>
><br>
> #define CONFIGURE_INIT<br>
><br>
> // The sparc-rtems-gcc version 4 changes the location of the confdefs.h<br>
> file.<br>
> #if (__GNUC__ > 3)<br>
> #include <rtems/confdefs.h><br>
> #else<br>
> #include <confdefs.h><br>
> #endif<br>
><br>
> #endif /*RTEMSCONFIG_H_*/<br>
><br>
> <---------------------------------<br>
><br>
> *test.c ----------------->*<br>
><br>
> /*<br>
>  *  Simple test program -- simplified version of sample
test hello.<br>
>  */<br>
><br>
> #include <bsp.h><br>
><br>
> #include <stdlib.h><br>
> #include <stdio.h><br>
> #include <stdlib.h><br>
> #include <string.h><br>
> #include <assert.h><br>
> #include <errno.h><br>
><br>
> #include <rtems/ramdisk.h><br>
> #include <rtems/bdbuf.h><br>
><br>
> char ramdisk[30*1024];<br>
><br>
> #include "rtems-config.h"<br>
><br>
> rtems_task Init(<br>
>   rtems_task_argument ignored<br>
> )<br>
> {<br>
>         FILE *fp;<br>
>           unsigned char buffer[512];<br>
>           unsigned char aux[512];<br>
>           int i;<br>
>           size_t bw;<br>
><br>
>           // Open the RAMDISKK<br>
>           fp = fopen( "/dev/ramdisk0",
"r+" );<br>
>           assert( fp );<br>
><br>
>           for ( i=0 ; i< 512 ; i++  )<br>
>                   buffer[i]
= (unsigned char) (i + 1);<br>
><br>
>         for (i=0; i < 30 ; i++ )<br>
>           {<br>
>                 bw = fwrite(
buffer, 512, 1, fp );<br>
>                 assert(bw);<br>
>           }<br>
><br>
>         assert(fseek(fp, 0, SEEK_SET) == 0);<br>
><br>
>         for (i=0; i < 20 ; i++ )<br>
>           {<br>
>                   memset(
aux, 0, 512 );<br>
>                   bw
= fread( aux, 512, 1, fp );<br>
>                   assert(
bw == 1 );<br>
>                   printf("%d
", i);<br>
><br>
>                   assert(
!memcmp( buffer, aux, 512 ) );<br>
>                   assert(
!memcmp( (ramdisk + (i*512)), aux, 512 ) );<br>
>           }<br>
><br>
>   exit( 0 );<br>
> }<br>
><br>
> /* end of file */<br>
><br>
> -----------------------------<br>
> Aitor Viana Sánchez<br>
><br>
> ESA - European Space Technology Centre (ESTEC)<br>
> TEC-EDD - Computer and Data Systems Section<br>
> ESA/ESTEC P.O. Box 299 / 2200AG Noordwijk ZH, The Netherlands<br>
> Tel (+31) 71 565 6727<br>
> Email: aitor.viana.sanchez@esa.int<br>
><br>
> Joel Sherrill <joel.sherrill@oarcorp.com> wrote on 11/14/2007
03:15:07 PM:<br>
><br>
>> I don't remember if there is an example in the source<br>
>> tree anywhere of doing this.  If you can put together<br>
>> something, it would be appreciated.  Just declared<br>
>> some large byte array and use it as the RAM for the<br>
>> purposes of an example.<br>
><br>
>> --joel<br>
><br>
>> Aitor.Viana.Sanchez@esa.int wrote:<br>
>> ><br>
>> > Hi Thomas,<br>
>> ><br>
>> > I managed to configure the RAMDISK, and also accessing it
but i got<br>
>> > couple of questions.<br>
>> ><br>
>> >         - I didn't use the msdos_initialize
function at all and I<br>
>> > don't know what this function does exactly and why it is
needed.<br>
>> >         - I had also to initialize the
rtems_bdbuf_configuration<br>
>> > structure and the rtems_bdbuf_configuration_size variable,
but i don't<br>
>> > know what is this structure/variable is for.<br>
>> >         - I can access to the RAMDISK
by means of<br>
>> > fopen("/dev/ramdisk0") for instance. But this allows
me to write/read<br>
>> > in the RAMDISK area using the file API. But apparently does
not allow<br>
>> > me to create files in the RAMDISK area (which is my intention).
Lets<br>
>> > say, I want to allocate a RAMDISK area, mount it, and then
access it<br>
>> > like a filesystem.<br>
>> ><br>
>> > Here is my configuration file:<br>
>> ><br>
>> > #ifndef RTEMSCONFIG_H_<br>
>> > #define RTEMSCONFIG_H_<br>
>> ><br>
>> > /* configuration information */<br>
>> ><br>
>> > rtems_task Init( rtems_task_argument argument);<br>
>> ><br>
>> > #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER<br>
>> ><br>
>> > #define CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>
>> ><br>
>> > #define CONFIGURE_MAXIMUM_TASKS 10<br>
>> > #define CONFIGURE_MAXIMUM_SEMAPHORES 10<br>
>> > #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4<br>
>> ><br>
>> > rtems_bdbuf_config rtems_bdbuf_configuration[] = {<br>
>> >   { 512, 20, (void *) 0 }<br>
>> > };<br>
>> > int rtems_bdbuf_configuration_size = 1;<br>
>> ><br>
>> > rtems_ramdisk_config rtems_ramdisk_configuration[] = {<br>
>> >   {<br>
>> >      512, 20, (void *) 0<br>
>> >   }<br>
>> > };<br>
>> ><br>
>> > int rtems_ramdisk_configuration_size = 1;<br>
>> ><br>
>> > #define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE<br>
>> > rtems_driver_address_table Device_drivers[] = {<br>
>> >   CONSOLE_DRIVER_TABLE_ENTRY,<br>
>> >   CLOCK_DRIVER_TABLE_ENTRY,<br>
>> >   RAMDISK_DRIVER_TABLE_ENTRY<br>
>> > };<br>
>> > #define CONFIGURE_NUMBER_OF_DRIVERS \<br>
>> >   ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))<br>
>> > #define CONFIGURE_MAXIMUM_DRIVERS 10<br>
>> ><br>
>> > #define CONFIGURE_INIT<br>
>> ><br>
>> > #include <confdefs.h><br>
>> ><br>
>> > #endif /*RTEMSCONFIG_H_*/<br>
>> ><br>
>> ><br>
>> > Cheers,<br>
>> ><br>
>> > Aitor<br>
>> ><br>
>> ><br>
>> > -----------------------------<br>
>> > Aitor Viana Sánchez<br>
>> ><br>
>> > ESA - European Space Technology Centre (ESTEC)<br>
>> > TEC-EDD - Computer and Data Systems Section<br>
>> > ESA/ESTEC P.O. Box 299 / 2200AG Noordwijk ZH, The Netherlands<br>
>> > Tel (+31) 71 565 6727<br>
>> > Email: aitor.viana.sanchez@esa.int<br>
>> ><br>
>> ><br>
>> > *Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>*<br>
>> ><br>
>> > 11/13/2007 05:47 PM<br>
>> ><br>
>> ><br>
>> > To<br>
>> >  Aitor.Viana.Sanchez@esa.int<br>
>> > cc<br>
>> >  rtems-users@rtems.org<br>
>> > Subject<br>
>> >  Re: External RAM filesystem<br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> > Hi,<br>
>> ><br>
>> > yes, it should be possible. There still exists a ram disk
driver, which<br>
>> > performs this function, see:<br>
>> ><br>
>> > cpukit/libblock/src/ramdisk.c<br>
>> ><br>
>> > We used it for our very first tests of the FATFS. If I recall
correctly,<br>
>> > these are the steps to work with it:<br>
>> ><br>
>> > - define a rtems_ramdisk_config data structure (e.g. in the
init module)<br>
>> > with the fixed name "rtems_ramdisk_configuration".<br>
>> ><br>
>> > - you can/must define the block size, the number of blocks
and location<br>
>> > in this structure<br>
>> ><br>
>> > - If you add the RAMDISK_DRIVER_TABLE_ENTRY to your device
driver table,<br>
>> > it will initialize automatically when your system comes up<br>
>> ><br>
>> > - Or, you can initialize the ramdisk with "ramdisk_initialize".<br>
>> ><br>
>> > - Next, you must format the ramdisk (use msdos_format function
in<br>
>> > cpukit/libfs/src/dosfs/msdos_format.c).<br>
>> ><br>
>> > - Then you can mount the ramdisk as a (unpartitioned) volume
with<br>
>> > msdos_initialze().<br>
>> ><br>
>> > I hope I am rather acurate on these steps.<br>
>> ><br>
>> > It would be nice if you could give us feedback, when things
work.<br>
>> ><br>
>> > And it would be even nicer, if you could write a wiki entry
on this<br>
>> > under www.rtems.com/wiki<br>
>> ><br>
>> > wkr,<br>
>> > Thomas.<br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> ><br>
>> > Aitor.Viana.Sanchez@esa.int schrieb:<br>
>> > ><br>
>> > > Hi all,<br>
>> > ><br>
>> > ><br>
>> > > is it possible to configure RTEMS somehow to access
and external RAM<br>
>> > > memory address where a FAT32 (for instance) file system
is placed?<br>
> Is it<br>
>> > > possible to configure the address and size?<br>
>> > ><br>
>> > > Thanks in advance.<br>
>> > ><br>
>> > ><br>
>> > > Aitor<br>
>> > ><br>
>> > ><br>
>> > ><br>
> ------------------------------------------------------------------------<br>
>> > ><br>
>> > > _______________________________________________<br>
>> > > rtems-users mailing list<br>
>> > > rtems-users@rtems.com<br>
>> > > http://rtems.rtems.org/mailman/listinfo/rtems-users<br>
>> ><br>
>> ><br>
>> > --<br>
>> > --------------------------------------------<br>
>> > embedded brains GmbH<br>
>> > Thomas Doerfler           Obere
Lagerstr. 30<br>
>> > D-82178 Puchheim          Germany<br>
>> > Tel. : +49-89-18 90 80 79-2<br>
>> > Fax  : +49-89-18 90 80 79-9<br>
>> > email: Thomas.Doerfler@embedded-brains.de<br>
>> > PGP public key available on request<br>
>> ><br>
>> > Diese Nachricht ist keine geschäftliche Mitteilung im Sinne
des EHUG.<br>
>> > ------------------------------------------------------------------------<br>
>> ><br>
>> > _______________________________________________<br>
>> > rtems-users mailing list<br>
>> > rtems-users@rtems.com<br>
>> > http://rtems.rtems.org/mailman/listinfo/rtems-users<br>
>> ><br>
</font></tt>
<br>
<br><tt><font size=2>--<br>
--------------------------------------------<br>
Embedded Brains GmbH<br>
Thomas Doerfler           Obere Lagerstr. 30<br>
D-82178 Puchheim          Germany<br>
email: Thomas.Doerfler@embedded-brains.de<br>
Phone: +49-89-18908079-2<br>
Fax:   +49-89-18908079-9</font></tt>
<br>