added option to use ramdisk instead of flash jffs2
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 27 Oct 2008 10:17:36 +0000 (10:17 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 27 Oct 2008 10:17:36 +0000 (10:17 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1103 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/ecosboard.c

index 86f3d8d1423ab12b793bc37cd36f928cfa4b60df..47153490b16c411f7b211672f84b150fb1d01769 100644 (file)
@@ -840,12 +840,19 @@ static void copyfile(char *name2, char *name1)
     if( err < 0 ) SHOW_RESULT( close, err );
 
 }
-static void copydir(char *name)
+static void copydir(char *name, char *destdir)
 {
        int err;
        DIR *dirp;
 
-       mkdir("/ram/cgi", 0777);
+       dirp = opendir(destdir);
+       if (dirp==NULL)
+       {
+               mkdir(destdir, 0777);
+       } else
+       {
+               err = closedir(dirp);
+       }
 
        dirp = opendir(name);
     if( dirp == NULL ) SHOW_RESULT( opendir, -1 );
@@ -884,9 +891,11 @@ static void copydir(char *name)
                char fullname2[PATH_MAX];
 
                strcpy(fullname, name);
+               strcat(fullname, "/");
                strcat(fullname, entry->d_name);
 
-               strcpy(fullname2, "/ram/cgi/");
+               strcpy(fullname2, destdir);
+               strcat(fullname2, "/");
                strcat(fullname2, entry->d_name);
                //        diag_printf("from %s to %s\n", fullname, fullname2);
                copyfile(fullname, fullname2);
@@ -1791,8 +1800,16 @@ int add_default_dirs(void)
        return ERROR_OK;
 }
 
+static cyg_uint8 *ramblockdevice;
+static const int ramblockdevice_size=4096*1024;
 int main(int argc, char *argv[])
 {
+       /* ramblockdevice will be the same address every time. The deflate app uses a buffer 16mBytes out, so we
+        * need to allocate towards the end of the heap.  */
+
+       ramblockdevice=(cyg_uint8 *)malloc(ramblockdevice_size);
+       memset(ramblockdevice, 0xff, ramblockdevice_size);
+
        setHandler(CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION);
        setHandler(CYGNUM_HAL_VECTOR_ABORT_PREFETCH);
        setHandler(CYGNUM_HAL_VECTOR_ABORT_DATA);
@@ -1849,12 +1866,53 @@ int main(int argc, char *argv[])
        diag_printf("Zylin ZY1000. Copyright Zylin AS 2007-2008.\n");
        diag_printf("%s\n", ZYLIN_OPENOCD_VERSION);
 
-       copydir("/rom/");
+       copydir("/rom", "/ram/cgi");
 
        err = mount("/dev/flash1", "/config", "jffs2");
        if (err < 0)
        {
                diag_printf("unable to mount jffs\n");
+               reboot();
+       }
+
+       /* are we using a ram disk instead of a flash disk? This is used
+        * for ZY1000 live demo...
+        *
+        * copy over flash disk to ram block device
+        */
+       if (boolParam("ramdisk"))
+       {
+               diag_printf("Unmounting /config from flash and using ram instead\n");
+               err=umount("/config");
+               if (err < 0)
+               {
+                       diag_printf("unable to unmount jffs\n");
+                       reboot();
+               }
+
+               err = mount("/dev/flash1", "/config2", "jffs2");
+               if (err < 0)
+               {
+                       diag_printf("unable to mount jffs\n");
+                       reboot();
+               }
+
+               err = mount("/dev/ram", "/config", "jffs2");
+               if (err < 0)
+               {
+                       diag_printf("unable to mount ram block device\n");
+                       reboot();
+               }
+
+//             copydir("/config2", "/config");
+               copyfile("/config2/ip", "/config/ip");
+               copydir("/config2/settings", "/config/settings");
+
+               umount("/config2");
+       } else
+       {
+               /* we're not going to use a ram block disk */
+               free(ramblockdevice);
        }
 
 
@@ -2370,6 +2428,8 @@ logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
 static int logfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode);
 static int logfs_fo_close(struct CYG_FILE_TAG *fp);
 
+#include <cyg/io/devtab.h>
+
 //==========================================================================
 // Filesystem table entries
 
@@ -2473,3 +2533,123 @@ static int logfs_fo_close(struct CYG_FILE_TAG *fp)
 {
        return ENOERR;
 }
+
+static bool
+ramiodev_init( struct cyg_devtab_entry *tab )
+{
+       return true;
+}
+
+static Cyg_ErrNo
+ramiodev_bread( cyg_io_handle_t handle, void *buf, cyg_uint32 *len,
+                  cyg_uint32 pos)
+{
+       if (*len+pos>ramblockdevice_size)
+       {
+               *len=ramblockdevice_size-pos;
+       }
+       memcpy(buf, ramblockdevice+pos, *len);
+       return ENOERR;
+}
+
+static Cyg_ErrNo
+ramiodev_bwrite( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len,
+                   cyg_uint32 pos )
+{
+       if (((pos%4)!=0)||(((*len)%4)!=0))
+       {
+               diag_printf("Unaligned write %d %d!", pos, *len);
+       }
+
+       memcpy(ramblockdevice+pos, buf, *len);
+       return ENOERR;
+}
+
+static Cyg_ErrNo
+ramiodev_get_config( cyg_io_handle_t handle,
+                       cyg_uint32 key,
+                       void* buf,
+                       cyg_uint32* len)
+{
+    switch (key) {
+    case CYG_IO_GET_CONFIG_FLASH_ERASE:
+    {
+        if ( *len != sizeof( cyg_io_flash_getconfig_erase_t ) )
+             return -EINVAL;
+        {
+            cyg_io_flash_getconfig_erase_t *e = (cyg_io_flash_getconfig_erase_t *)buf;
+            char *startpos = ramblockdevice + e->offset;
+
+            if (((e->offset%(64*1024))!=0)||((e->len%(64*1024))!=0))
+            {
+               diag_printf("Erease is not aligned %d %d\n", e->offset, e->len);
+            }
+
+            memset(startpos, 0xff, e->len);
+
+            e->flasherr = 0;
+        }
+        return ENOERR;
+    }
+    case CYG_IO_GET_CONFIG_FLASH_DEVSIZE:
+    {
+        if ( *len != sizeof( cyg_io_flash_getconfig_devsize_t ) )
+             return -EINVAL;
+        {
+            cyg_io_flash_getconfig_devsize_t *d =
+                (cyg_io_flash_getconfig_devsize_t *)buf;
+
+                       d->dev_size = ramblockdevice_size;
+        }
+        return ENOERR;
+    }
+
+    case CYG_IO_GET_CONFIG_FLASH_BLOCKSIZE:
+    {
+        cyg_io_flash_getconfig_blocksize_t *b =
+            (cyg_io_flash_getconfig_blocksize_t *)buf;
+        if ( *len != sizeof( cyg_io_flash_getconfig_blocksize_t ) )
+             return -EINVAL;
+
+        // offset unused for now
+               b->block_size = 64*1024;
+        return ENOERR;
+    }
+
+    default:
+        return -EINVAL;
+    }
+}
+
+static Cyg_ErrNo
+ramiodev_set_config( cyg_io_handle_t handle,
+                       cyg_uint32 key,
+                       const void* buf,
+                       cyg_uint32* len)
+{
+
+    switch (key) {
+    default:
+        return -EINVAL;
+    }
+} // ramiodev_set_config()
+
+// get_config/set_config should be added later to provide the other flash
+// operations possible, like erase etc.
+
+BLOCK_DEVIO_TABLE( cyg_io_ramdev1_ops,
+                   &ramiodev_bwrite,
+                   &ramiodev_bread,
+                   0, // no select
+                   &ramiodev_get_config,
+                   &ramiodev_set_config
+    );
+
+
+BLOCK_DEVTAB_ENTRY( cyg_io_ramdev1,
+                    "/dev/ram",
+                    0,
+                    &cyg_io_ramdev1_ops,
+                    &ramiodev_init,
+                    0, // No lookup required
+                    NULL );

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)