<br><font size=2 face="sans-serif">Based on the example i made (see bellow)
i got questions.</font>
<br>
<br><font size=2 face="sans-serif">Basically this example allows to read/write
information in the RAMDISK area (which is an array in the example) by means
of the filesystem API but does not allow to create files because the open/f_open
routine shall open the "/dev/ramdisk0" device.</font>
<br><font size=2 face="sans-serif">Is it possible to "mount"
somehow the /dev/ramdisk0 and then, using the open/f_open, etc. calls to
create file inside this RAMDISK?</font>
<br>
<br><font size=2 face="sans-serif">Cheers,</font>
<br>
<br><font size=2 face="sans-serif">Sitor</font>
<br>
<br>
<br><font size=2 face="sans-serif">Here is the example I made.</font>
<br>
<br><font size=2 face="sans-serif"><b>rtems-config.h file ---------------></b></font>
<br>
<br><font size=2 face="sans-serif">#ifndef RTEMSCONFIG_H_</font>
<br><font size=2 face="sans-serif">#define RTEMSCONFIG_H_</font>
<br>
<br><font size=2 face="sans-serif">/* configuration information */</font>
<br>
<br><font size=2 face="sans-serif">rtems_task Init( rtems_task_argument
argument);</font>
<br><font size=2 face="sans-serif">extern char ramdisk[];</font>
<br>
<br><font size=2 face="sans-serif">#define CONFIGURE_NEEDS_CONSOLE_DRIVER</font>
<br>
<br><font size=2 face="sans-serif">#define CONFIGURE_RTEMS_INIT_TASKS_TABLE</font>
<br>
<br><font size=2 face="sans-serif">#define CONFIGURE_MAXIMUM_TASKS 10</font>
<br><font size=2 face="sans-serif">#define CONFIGURE_MAXIMUM_SEMAPHORES
10</font>
<br><font size=2 face="sans-serif">#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
4</font>
<br>
<br><font size=2 face="sans-serif">rtems_bdbuf_config rtems_bdbuf_configuration[]
= {</font>
<br><font size=2 face="sans-serif">  { 512, 40, (void *) ramdisk }</font>
<br><font size=2 face="sans-serif">};</font>
<br><font size=2 face="sans-serif">int rtems_bdbuf_configuration_size =
1;</font>
<br>
<br><font size=2 face="sans-serif">rtems_ramdisk_config rtems_ramdisk_configuration[]
= {</font>
<br><font size=2 face="sans-serif">  {</font>
<br><font size=2 face="sans-serif">     512, 40, (void *)
ramdisk</font>
<br><font size=2 face="sans-serif">  }</font>
<br><font size=2 face="sans-serif">};</font>
<br>
<br><font size=2 face="sans-serif">// The sparc-rtems-gcc version 4 changes
the location of the confdefs.h file.</font>
<br><font size=2 face="sans-serif">#if (__GNUC__ > 3)</font>
<br><font size=2 face="sans-serif">size_t rtems_ramdisk_configuration_size
= 1;</font>
<br><font size=2 face="sans-serif">rtems_task_priority swapout_task_priority
= 100;</font>
<br><font size=2 face="sans-serif">#else</font>
<br><font size=2 face="sans-serif">int rtems_ramdisk_configuration_size
= 1;</font>
<br><font size=2 face="sans-serif">#endif</font>
<br>
<br>
<br><font size=2 face="sans-serif">#define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE</font>
<br><font size=2 face="sans-serif">rtems_driver_address_table Device_drivers[]
= {</font>
<br><font size=2 face="sans-serif">  CONSOLE_DRIVER_TABLE_ENTRY,</font>
<br><font size=2 face="sans-serif">  CLOCK_DRIVER_TABLE_ENTRY,</font>
<br><font size=2 face="sans-serif">  RAMDISK_DRIVER_TABLE_ENTRY</font>
<br><font size=2 face="sans-serif">};</font>
<br><font size=2 face="sans-serif">#define CONFIGURE_NUMBER_OF_DRIVERS
\</font>
<br><font size=2 face="sans-serif">  ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))</font>
<br><font size=2 face="sans-serif">#define CONFIGURE_MAXIMUM_DRIVERS 10</font>
<br>
<br>
<br>
<br><font size=2 face="sans-serif">#define CONFIGURE_INIT</font>
<br>
<br><font size=2 face="sans-serif">// The sparc-rtems-gcc version 4 changes
the location of the confdefs.h file.</font>
<br><font size=2 face="sans-serif">#if (__GNUC__ > 3)</font>
<br><font size=2 face="sans-serif">#include <rtems/confdefs.h></font>
<br><font size=2 face="sans-serif">#else</font>
<br><font size=2 face="sans-serif">#include <confdefs.h></font>
<br><font size=2 face="sans-serif">#endif</font>
<br>
<br><font size=2 face="sans-serif">#endif /*RTEMSCONFIG_H_*/</font>
<br>
<br><font size=2 face="sans-serif"><---------------------------------</font>
<br>
<br><font size=2 face="sans-serif"><b>test.c -----------------></b></font>
<br>
<br><font size=2 face="sans-serif">/*</font>
<br><font size=2 face="sans-serif"> *  Simple test program --
simplified version of sample test hello.</font>
<br><font size=2 face="sans-serif"> */</font>
<br>
<br><font size=2 face="sans-serif">#include <bsp.h></font>
<br>
<br><font size=2 face="sans-serif">#include <stdlib.h></font>
<br><font size=2 face="sans-serif">#include <stdio.h></font>
<br><font size=2 face="sans-serif">#include <stdlib.h></font>
<br><font size=2 face="sans-serif">#include <string.h></font>
<br><font size=2 face="sans-serif">#include <assert.h></font>
<br><font size=2 face="sans-serif">#include <errno.h></font>
<br>
<br><font size=2 face="sans-serif">#include <rtems/ramdisk.h></font>
<br><font size=2 face="sans-serif">#include <rtems/bdbuf.h></font>
<br>
<br><font size=2 face="sans-serif">char ramdisk[30*1024];</font>
<br>
<br><font size=2 face="sans-serif">#include "rtems-config.h"</font>
<br>
<br><font size=2 face="sans-serif">rtems_task Init(</font>
<br><font size=2 face="sans-serif">  rtems_task_argument ignored</font>
<br><font size=2 face="sans-serif">)</font>
<br><font size=2 face="sans-serif">{</font>
<br><font size=2 face="sans-serif">        FILE
*fp;</font>
<br><font size=2 face="sans-serif">          unsigned
char buffer[512];</font>
<br><font size=2 face="sans-serif">          unsigned
char aux[512];</font>
<br><font size=2 face="sans-serif">          int
i;</font>
<br><font size=2 face="sans-serif">          size_t
bw;</font>
<br><font size=2 face="sans-serif">          </font>
<br><font size=2 face="sans-serif">          //
Open the RAMDISKK</font>
<br><font size=2 face="sans-serif">          fp
= fopen( "/dev/ramdisk0", "r+" );</font>
<br><font size=2 face="sans-serif">          assert(
fp );</font>
<br>
<br><font size=2 face="sans-serif">          for
( i=0 ; i< 512 ; i++  )</font>
<br><font size=2 face="sans-serif">           
      buffer[i] = (unsigned char) (i + 1);</font>
<br>
<br><font size=2 face="sans-serif">        for
(i=0; i < 30 ; i++ ) </font>
<br><font size=2 face="sans-serif">          {</font>
<br><font size=2 face="sans-serif">         
      bw = fwrite( buffer, 512, 1, fp );</font>
<br><font size=2 face="sans-serif">         
      assert(bw);</font>
<br><font size=2 face="sans-serif">          }</font>
<br>
<br><font size=2 face="sans-serif">        assert(fseek(fp,
0, SEEK_SET) == 0);</font>
<br>
<br><font size=2 face="sans-serif">        for
(i=0; i < 20 ; i++ ) </font>
<br><font size=2 face="sans-serif">          {</font>
<br><font size=2 face="sans-serif">           
      memset( aux, 0, 512 );</font>
<br><font size=2 face="sans-serif">           
      bw = fread( aux, 512, 1, fp );</font>
<br><font size=2 face="sans-serif">           
      assert( bw == 1 );</font>
<br><font size=2 face="sans-serif">           
      printf("%d ", i);</font>
<br>
<br><font size=2 face="sans-serif">           
      assert( !memcmp( buffer, aux, 512 ) );</font>
<br><font size=2 face="sans-serif">           
      assert( !memcmp( (ramdisk + (i*512)), aux,
512 ) );</font>
<br><font size=2 face="sans-serif">          }</font>
<br>
<br><font size=2 face="sans-serif">  exit( 0 );</font>
<br><font size=2 face="sans-serif">}</font>
<br>
<br><font size=2 face="sans-serif">/* end of file */</font>
<br><font size=2 face="sans-serif"><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</font>
<br>
<br><tt><font size=2>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>
</font></tt>
<br><tt><font size=2>> --joel<br>
</font></tt>
<br><tt><font size=2>> 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? 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>
> > > 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>
> ></font></tt>