Mercurial > ecos
diff packages/io/flash/current/src/flashiodev.c @ 791:a2dfa8bf3c57
Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
| author | gthomas |
|---|---|
| date | Mon, 03 Mar 2003 17:09:56 +0000 |
| parents | d2c90368aeef |
| children | 3c5c8c8ffa30 |
line wrap: on
line diff
--- a/packages/io/flash/current/src/flashiodev.c +++ b/packages/io/flash/current/src/flashiodev.c @@ -41,7 +41,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): jlarmour -// Contributors: +// Contributors: woehler // Date: 2002-01-16 // Purpose: // Description: @@ -59,22 +59,53 @@ #include <cyg/io/config_keys.h> #include <cyg/io/flash.h> #include <string.h> // memcpy +#include <cyg/hal/hal_if.h> #define MIN(x,y) ((x)<(y) ? (x) : (y)) // 1 per devtab entry, so only 1 for now -static char flashiodev_workspaces[1][FLASH_MIN_WORKSPACE]; +//static char flashiodev_workspaces[1][FLASH_MIN_WORKSPACE]; + +struct flashiodev_priv_t{ + char workspace[FLASH_MIN_WORKSPACE]; + char *start; + char *end; +}; + +static struct flashiodev_priv_t flashiodev_priv[1]; static int dummy_printf( const char *fmt, ... ) {return 0;} static bool flashiodev_init( struct cyg_devtab_entry *tab ) { - char *ws = (char *)tab->priv; + struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; + char *ws = dev->workspace; int stat = flash_init( ws, FLASH_MIN_WORKSPACE, &dummy_printf ); + if ( stat == 0 ) + { +#ifdef CYGNUM_IO_FLASH_BLOCK_CFG_FIS_1 + CYG_ADDRESS flash_base; + unsigned long size; - if ( stat == 0 ) + if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_FLASH_BASE, + CYGDAT_IO_FLASH_BLOCK_FIS_NAME_1, + &flash_base)) + return false; + if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_SIZE, + CYGDAT_IO_FLASH_BLOCK_FIS_NAME_1, + &size)) + return false; + + dev->start = (char *)flash_base; + dev->end = (char *)flash_base + size; +#else + dev->start = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1; + dev->end = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + + CYGNUM_IO_FLASH_BLOCK_LENGTH_1) +#endif return true; + } else return false; } // flashiodev_init() @@ -92,21 +123,21 @@ static Cyg_ErrNo flashiodev_bread( cyg_io_handle_t handle, void *buf, cyg_uint32 *len, cyg_uint32 pos) { - char *startpos = (char *)flash_info.start + pos + - CYGNUM_IO_FLASH_BLOCK_OFFSET_1; + struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; + struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; + + char *startpos = dev->start + pos; #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time char *endpos = startpos + *len - 1; - char *flashend = MIN( (char *)flash_info.end, - ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + - CYGNUM_IO_FLASH_BLOCK_LENGTH_1)); - if ( startpos < (char *)flash_info.start+CYGNUM_IO_FLASH_BLOCK_OFFSET_1 ) + char *flashend = MIN( (char *)flash_info.end, dev->end); + if ( startpos < dev->start ) return -EINVAL; if ( endpos > flashend ) return -EINVAL; #endif + memcpy( buf, startpos, *len ); - return ENOERR; } // flashiodev_bread() @@ -114,17 +145,17 @@ static Cyg_ErrNo flashiodev_bwrite( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len, cyg_uint32 pos ) { + struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; + struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; + Cyg_ErrNo err = ENOERR; void *erraddr; - - char *startpos = (char *)flash_info.start + pos + CYGNUM_IO_FLASH_BLOCK_OFFSET_1; + char *startpos = dev->start + pos; #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time char *endpos = startpos + *len - 1; - char *flashend = MIN( (char *)flash_info.end, - ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + - CYGNUM_IO_FLASH_BLOCK_LENGTH_1)); - if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 ) + char *flashend = MIN( (char *)flash_info.end, dev->end); + if ( startpos < dev->start ) return -EINVAL; if ( endpos > flashend ) return -EINVAL; @@ -143,22 +174,22 @@ flashiodev_get_config( cyg_io_handle_t h void* buf, cyg_uint32* len) { + struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; + struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; + 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 = (char *)flash_info.start + e->offset + CYGNUM_IO_FLASH_BLOCK_OFFSET_1; + cyg_io_flash_getconfig_erase_t *e = (cyg_io_flash_getconfig_erase_t *)buf; + char *startpos = dev->start + e->offset; #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time char *endpos = startpos + e->len - 1; - char *flashend = MIN( (char *)flash_info.end, - ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + - CYGNUM_IO_FLASH_BLOCK_LENGTH_1)); - if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 ) + char *flashend = MIN( (char *)flash_info.end, dev->end); + if ( startpos < dev->start ) return -EINVAL; if ( endpos > flashend ) return -EINVAL; @@ -176,7 +207,7 @@ flashiodev_get_config( cyg_io_handle_t h (cyg_io_flash_getconfig_devsize_t *)buf; //d->dev_size = flash_info.blocks * flash_info.block_size; - d->dev_size = CYGNUM_IO_FLASH_BLOCK_LENGTH_1; + d->dev_size = dev->end - dev->start; } return ENOERR; } @@ -185,12 +216,11 @@ flashiodev_get_config( cyg_io_handle_t h { cyg_io_flash_getconfig_blocksize_t *b = (cyg_io_flash_getconfig_blocksize_t *)buf; - char *startpos = (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + b->offset; #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time - char *flashend = MIN( (char *)flash_info.end, - ((char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 + - CYGNUM_IO_FLASH_BLOCK_LENGTH_1)); - if ( startpos < (char *)flash_info.start + CYGNUM_IO_FLASH_BLOCK_OFFSET_1 ) + char *startpos = dev->start + b->offset; + char *flashend = MIN( (char *)flash_info.end, dev->end); + + if ( startpos < dev->start ) return -EINVAL; if ( startpos > flashend ) return -EINVAL; @@ -199,7 +229,7 @@ flashiodev_get_config( cyg_io_handle_t h return -EINVAL; // offset unused for now - b->block_size = flash_info.block_size; + b->block_size = flash_info.block_size; return ENOERR; } @@ -215,6 +245,9 @@ flashiodev_set_config( cyg_io_handle_t h const void* buf, cyg_uint32* len) { + struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; + struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; + switch (key) { default: return -EINVAL; @@ -240,6 +273,6 @@ BLOCK_DEVTAB_ENTRY( cyg_io_flashdev1, &cyg_io_flashdev1_ops, &flashiodev_init, 0, // No lookup required - &flashiodev_workspaces[0] ); + &flashiodev_priv[0] ); // EOF flashiodev.c
