# HG changeset patch # User asl # Date 1091712332 0 # Node ID 0673c75f3a08cba27adbaf089daba68710b675d9 # Parent 773d77981a7db887a173f89aa223402d183069f1 Import the first version of the synth flash driver which uses the V2 API. diff --git a/packages/devs/flash/synthv2/current/ChangeLog b/packages/devs/flash/synthv2/current/ChangeLog new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/ChangeLog @@ -0,0 +1,47 @@ +2004-08-03 Andrew Lunn + + * cdl/flash_synth.cdl: Indicate we use the V2 device API. + +2004-07-17 Andrew Lunn + + * First version. Implements synthetic flash using the new flash + API. + +//=========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//=========================================================================== + + + + diff --git a/packages/devs/flash/synthv2/current/cdl/flash_synth.cdl b/packages/devs/flash/synthv2/current/cdl/flash_synth.cdl new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/cdl/flash_synth.cdl @@ -0,0 +1,147 @@ +# ==================================================================== +# +# flash_synth.cdl +# +# FLASH memory - Synthetic flash driver for Synthetic target +# +# ==================================================================== +#####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT ANY +## WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License along +## with eCos; if not, write to the Free Software Foundation, Inc., +## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +## +## As a special exception, if other files instantiate templates or use macros +## or inline functions from this file, or you compile this file and link it +## with other works to produce a work based on this file, this file does not +## by itself cause the resulting work to be covered by the GNU General Public +## License. However the source code for this file must still be made available +## in accordance with section (3) of the GNU General Public License. +## +## This exception does not invalidate any other reasons why a work based on +## this file might be covered by the GNU General Public License. +## +## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +## at http://sources.redhat.com/ecos/ecos-license/ +## ------------------------------------------- +#####ECOSGPLCOPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): andrew.lunn@ascom.ch +# Contributors: jlarmour +# Date: 2000-10-30 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVS_FLASH_SYNTH_V2 { + display "Synthetic FLASH memory support" + + parent CYGPKG_IO_FLASH + active_if CYGPKG_IO_FLASH + requires CYGINT_ISO_ERRNO_CODES + + implements CYGHWR_IO_FLASH_DEVICE + implements CYGHWR_IO_FLASH_DEVICE_V2 + + include_dir cyg/flash + description "FLASH memory device support for Synthetic target" + compile -library=libextras.a synth.c + + cdl_option CYGMEM_FLASH_SYNTH_V2_BASE { + display "Base address of flash" + flavor data + default_value 0 + description " + Controls where in the synth target memory map the + flash is mapped. WARNING: This must be somewhere + the host Linux kernel is prepaired to mmap a file. It + must be page aligned. For hosts with recent x86 Linux kernels, + a value of 0x40000000 is likely appropriate. When 0 + the driver will automatically use whatever address the kernel + provides it with." + } + + cdl_option CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE { + display "Size of one block of synth flash" + flavor data + default_value 65536 + legal_values 4096 to 999999 + requires { (CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE % 4096) == 0 } + description " + This controls the size of one block of flash. This is + the minimum size that can be erased." + } + + cdl_option CYGNUM_FLASH_SYNTH_V2_NUMBLOCKS { + display "Number of blocks in the synth flash" + flavor data + default_value 15 + description " + This controls how many main blocks there are in the flash" + } + + cdl_option CYGNUM_FLASH_SYNTH_V2_NUMBOOT_BLOCKS { + display "Number of boot blocks in the synth flash" + flavor data + default_value 8 + description " + This controls the number of boot blocks the synthetic + device has. A value of zero disables the support of boot blocks" + } + + cdl_option CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCKSIZE { + display "Size of the boot blocks in the synth flash" + flavor data + default_value 8192 + description " + This controls the size of boot blocks the synthetic + device has" + } + + cdl_option CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCK_BOTTOM { + display "Is the boot blocks at the bottom of the flash" + flavor bool + default_value 1 + description " + This controls where the boot blocks are. If true the boot + blocks are at the bottom of the memory space, otherwise + they are at the top of the memory space." + } + + cdl_option CYGDAT_FLASH_SYNTH_V2_FILENAME { + display "Name of file emulating synth flash" + flavor data + default_value { "\"synthv2.flash\"" } + description " + This is the name of the file which holds the contents of + the flash. It is mmap'ed into memory and written for flash + program & erase operations. It will be created if it does + not exist." + } + + cdl_option CYGPKG_DEVS_FLASH_SYNTH_V2_TESTS { + display "Synth flash tests" + flavor data + no_define + calculated { "tests/flash1.c tests/flash2.c tests/flash3.c"} + description " + This option specifies the set of tests for the synth flash package." + } +} + +# EOF flash_synth.cdl diff --git a/packages/devs/flash/synthv2/current/include/synth.h b/packages/devs/flash/synthv2/current/include/synth.h new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/include/synth.h @@ -0,0 +1,79 @@ +#ifndef DEV_FLASH_SYNTHV2_SYNTH_H +#define DEV_FLASH_SYNTHV2_SYNTH_H +//========================================================================== +// +// synth.h +// +// Synthetic Flash driver header +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 2004 Andrew Lunn +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): Andrew Lunn +// Contributors: Andrew Lunn +// Date: 2004-07-03 +// Purpose: Header file for the synthetic flash device +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +// Structure of configuration parameters +struct cyg_flash_synth_config +{ + size_t block_size; + cyg_uint32 blocks; + size_t boot_block_size; + cyg_uint32 boot_blocks; + cyg_bool boot_block_bottom; + char * filename; +}; + +// Structure of data private to the drive +struct cyg_flash_synth_priv +{ + int flashfd; + struct cyg_block_info block_info[2]; +}; + +extern struct cyg_flash_dev_funs cyg_flash_synth_funs; + +#endif + + diff --git a/packages/devs/flash/synthv2/current/src/synth.c b/packages/devs/flash/synthv2/current/src/synth.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/src/synth.c @@ -0,0 +1,291 @@ +//========================================================================== +// +// synth.c +// +// Flash programming +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): andrew.lunn@ascom.ch +// Contributors: jlarmour +// Date: 2001-10-30 +// Purpose: +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include + +#include +#include +#include + +#define _FLASH_PRIVATE_ +#include +#include + +/* Helper function. The Linux system call cannot pass 6 parameters. Instead + a structure is filled in and passed as one parameter */ +static int +cyg_hal_sys_do_mmap(void *addr, unsigned long length, unsigned long prot, + unsigned long flags, unsigned long fd, unsigned long off) +{ + + struct cyg_hal_sys_mmap_args args; + + args.addr = (unsigned long) addr; + args.len = length; + args.prot = prot = prot; + args.flags = flags; + args.fd = fd; + args.offset = off; + + return (cyg_hal_sys_mmap(&args)); +} + +static int +synth_flash_init(struct cyg_flash_dev *dev) +{ + struct cyg_flash_synth_config *config = dev->config; + struct cyg_flash_synth_priv *priv = dev->priv; + cyg_flashaddr_t base; + int flags=CYG_HAL_SYS_MAP_SHARED; + + priv->flashfd = + cyg_hal_sys_open(config->filename, + CYG_HAL_SYS_O_RDWR, + CYG_HAL_SYS_S_IRWXU|CYG_HAL_SYS_S_IRWXG| + CYG_HAL_SYS_S_IRWXO); + if (priv->flashfd == -ENOENT) { + long w, bytesleft; + char buf[128]; + + priv->flashfd = cyg_hal_sys_open( + config->filename, + CYG_HAL_SYS_O_RDWR|CYG_HAL_SYS_O_CREAT, + CYG_HAL_SYS_S_IRWXU|CYG_HAL_SYS_S_IRWXG|CYG_HAL_SYS_S_IRWXO); + CYG_ASSERT( priv->flashfd >= 0, + "Opening of the file for the synth flash failed!"); + // fill with 0xff + memset( buf, 0xff, sizeof(buf) ); + bytesleft = config->block_size * config->blocks + + config->boot_block_size * config->boot_blocks; + + while (bytesleft > 0) { + int bytesneeded; + bytesneeded = bytesleft < sizeof(buf) ? + bytesleft : sizeof(buf); + + w = cyg_hal_sys_write( priv->flashfd, buf, + bytesneeded ); + CYG_ASSERT(w == bytesneeded, + "initialization of flash file failed"); + bytesleft -= bytesneeded; + } // while + } + CYG_ASSERT( priv->flashfd >= 0, + "Opening of the file for the synth flash failed!"); + if ( priv->flashfd <= 0 ) { + return CYG_FLASH_ERR_HWR; + } + + if (dev->start != 0) { + flags |= CYG_HAL_SYS_MAP_FIXED; + } + base = (cyg_flashaddr_t)cyg_hal_sys_do_mmap( + (void *)dev->start, + config->blocks * config->block_size + + config->boot_block_size * config->boot_blocks, + CYG_HAL_SYS_PROT_READ, + flags, + priv->flashfd, + 0l); + CYG_ASSERT( (int) base > 0, "mmap of flash file failed!" ); + if (base <= 0) { + return CYG_FLASH_ERR_HWR; + } + dev->start = base; + dev->end = base + (config->blocks * config->block_size) + + (config->boot_blocks * config->boot_block_size) - 1; + if (config->boot_blocks) { + if (config->boot_block_bottom) { + priv->block_info[0].block_size = config->boot_block_size; + priv->block_info[0].blocks = config->boot_blocks; + priv->block_info[1].block_size = config->block_size; + priv->block_info[1].blocks = config->blocks; + } else { + priv->block_info[0].block_size = config->block_size; + priv->block_info[0].blocks = config->blocks; + priv->block_info[1].block_size = config->boot_block_size; + priv->block_info[1].blocks = config->boot_blocks; + } + dev->num_block_infos = 2; + } else { + priv->block_info[0].block_size = config->block_size; + priv->block_info[0].blocks = config->blocks; + dev->num_block_infos = 1; + } + dev->block_info = &priv->block_info[0]; + + return CYG_FLASH_ERR_OK; +} + +// Map a hardware status to a package error +static int +synth_flash_hwr_map_error(struct cyg_flash_dev *dev, int err) +{ + return err; +} + +/* This helps speed up the erase. */ +static char empty[4096]; +static cyg_bool empty_inited = false; + +// Return the size of the block which is at the given address. +// __inline__ so that we know it will be in RAM, not ROM. +static __inline__ size_t +flash_block_size(struct cyg_flash_dev *dev, const cyg_flashaddr_t addr) +{ + int i; + size_t offset; + + + CYG_ASSERT((addr >= dev->start) && (addr <= dev->end), "Not inside device"); + + offset = addr - dev->start; + for (i=0; i < dev->num_block_infos; i++) { + if (offset < (dev->block_info[i].blocks * dev->block_info[i].block_size)) + return dev->block_info[i].block_size; + offset = offset - + (dev->block_info[i].blocks * dev->block_info[i].block_size); + } + CYG_FAIL("Programming error"); + return 0; +} + +static int +synth_flash_erase_block(struct cyg_flash_dev *dev, + const cyg_flashaddr_t block_base) +{ +#ifdef CYGDBG_USE_ASSERTS + struct cyg_flash_synth_config *config = dev->config; +#endif + struct cyg_flash_synth_priv *priv = dev->priv; + int offset = (int)block_base; + size_t block_size; + int i; + + offset -= dev->start; + + cyg_hal_sys_lseek(priv->flashfd, offset, + CYG_HAL_SYS_SEEK_SET); + + if (!empty_inited) { + memset(empty, 0xff, sizeof(empty)); + empty_inited = true; + } + + CYG_ASSERT(sizeof(empty) < config->block_size, + "Eckk! Can't work with such small blocks"); + CYG_ASSERT((config->block_size % sizeof(empty)) == 0, + "Eckk! Can't work with that odd size block"); + CYG_ASSERT(config->boot_blocks && sizeof(empty) < config->boot_block_size, + "Eckk! Can't work with such small blocks"); + CYG_ASSERT((config->boot_blocks && config->block_size % sizeof(empty)) == 0, + "Eckk! Can't work with that odd size block"); + + block_size = flash_block_size(dev, block_base); + + for (i=0; (i * sizeof(empty)) < block_size; i++) { + cyg_hal_sys_write(priv->flashfd, empty, sizeof(empty)); + } + return CYG_FLASH_ERR_OK; +} + +static int +synth_flash_program (struct cyg_flash_dev *dev, + cyg_flashaddr_t base, + const void* data, const size_t len) +{ + struct cyg_flash_synth_priv *priv = dev->priv; + int offset = base; + offset -= dev->start; + + cyg_hal_sys_lseek(priv->flashfd, offset, CYG_HAL_SYS_SEEK_SET); + cyg_hal_sys_write(priv->flashfd, data, len); + + return CYG_FLASH_ERR_OK; +} + +#define QUERY "Linux Synthetic Flash" + +static size_t +synth_flash_query(struct cyg_flash_dev *dev, void * data, + const size_t len) +{ + memcpy(data,QUERY,sizeof(QUERY)); + return sizeof(QUERY); +} + +static struct cyg_flash_synth_config config = { + CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE, + CYGNUM_FLASH_SYNTH_V2_NUMBLOCKS, + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCKSIZE, + CYGNUM_FLASH_SYNTH_V2_NUMBOOT_BLOCKS, + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCK_BOTTOM, + CYGDAT_FLASH_SYNTH_V2_FILENAME +}; + +CYG_FLASH_FUNS(cyg_flash_synth_funs, + synth_flash_init, + synth_flash_query, + synth_flash_erase_block, + synth_flash_program, + NULL, // read + synth_flash_hwr_map_error, + NULL, // lock + NULL); // unlock + +CYG_FLASH_DRIVER(cyg_flash_synth_flashdev, + &cyg_flash_synth_funs, + &config, + CYGMEM_FLASH_SYNTH_V2_BASE, + sizeof(struct cyg_flash_synth_priv)); + +// EOF synth.c diff --git a/packages/devs/flash/synthv2/current/tests/flash1.c b/packages/devs/flash/synthv2/current/tests/flash1.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/tests/flash1.c @@ -0,0 +1,191 @@ +/* Hey, the copyright is usefull for something! */ + +static char copyright[] = +"//==========================================================================" +"//" +"// flash1.c" +"//" +"// Test flash operations for the synth target synth flash driver" +"//" +"//==========================================================================" +"//####ECOSGPLCOPYRIGHTBEGIN####" +"// -------------------------------------------" +"// This file is part of eCos, the Embedded Configurable Operating System." +"// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc." +"//" +"// eCos is free software; you can redistribute it and/or modify it under" +"// the terms of the GNU General Public License as published by the Free" +"// Software Foundation; either version 2 or (at your option) any later version." +"//" +"// eCos is distributed in the hope that it will be useful, but WITHOUT ANY" +"// WARRANTY; without even the implied warranty of MERCHANTABILITY or" +"// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License" +"// for more details." +"//" +"// You should have received a copy of the GNU General Public License along" +"// with eCos; if not, write to the Free Software Foundation, Inc.," +"// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA." +"//" +"// As a special exception, if other files instantiate templates or use macros" +"// or inline functions from this file, or you compile this file and link it" +"// with other works to produce a work based on this file, this file does not" +"// by itself cause the resulting work to be covered by the GNU General Public" +"// License. However the source code for this file must still be made available" +"// in accordance with section (3) of the GNU General Public License." +"//" +"// This exception does not invalidate any other reasons why a work based on" +"// this file might be covered by the GNU General Public License." +"//" +"// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc." +"// at http://sources.redhat.com/ecos/ecos-license/" +"// -------------------------------------------" +"//####ECOSGPLCOPYRIGHTEND####" +"//==========================================================================" +"//#####DESCRIPTIONBEGIN####" +"//" +"// Author(s): andrew.lunn@ascom.ch" +"// Contributors: andrew.lunn" +"// Date: 2000-10-31" +"// Purpose: Test a flash driver" +"// Description: Try out a number of flash operations and make sure" +"// what is in the flash is what we expeect." +"// " +"//####DESCRIPTIONEND####" +"//" +"//==========================================================================" +; + +#include +#include +#include + +#include + +#ifndef CYGINT_ISO_STRING_STRFUNCS +# define NA_MSG "Need string functions for test" +#endif +#ifndef CYGSEM_IO_FLASH_LEGACY_API +# define NA_MSG "Need legacy IO FLASH API for test" +#endif + +#ifdef NA_MSG +void cyg_user_start(void) +{ + CYG_TEST_INIT(); + CYG_TEST_NA( NA_MSG ); +} +#else + +//========================================================================== +// main + +void cyg_user_start(void) +{ + int ret; + char data[1024]; + void *flash_start, *flash_end; + int block_size, blocks; + char *prog_start; + unsigned char * ptr; + + CYG_TEST_INIT(); + + ret=flash_init((_printf *)diag_printf); + + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_init"); + + flash_dev_query(data); + CYG_TEST_PASS_FAIL(!strncmp(data,"Linux Synthetic Flash",sizeof(data)), + "flash_query"); + + ret = flash_get_limits(NULL,&flash_start,&flash_end); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_get_limits"); + + ret = flash_get_block_info(&block_size, &blocks); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_get_block_info"); + + /* Erase the whole flash. Not recommended on real hardware since this + will probably erase the bootloader etc!!! */ + ret=flash_erase(flash_start,block_size * blocks,NULL); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_erase1"); + + /* check that its actually been erased, and test the mmap area */ + for (ptr=flash_start,ret=0; ptr < (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash empty check"); + + ret = flash_program(flash_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_program1"); + + /* Check the contents made it into the flash */ + CYG_TEST_PASS_FAIL(!strncmp(flash_start,copyright,sizeof(copyright)), + "flash program contents"); + + /* .. and check nothing else changed */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash program overrun check"); + + /* Program over a block boundary */ + prog_start = (unsigned char *)flash_start + block_size - sizeof(copyright)/2; + ret = flash_program(prog_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_program2"); + + /* Check the first version is still OK */ + CYG_TEST_PASS_FAIL(!strncmp(flash_start,copyright,sizeof(copyright)), + "Original contents"); + + CYG_TEST_PASS_FAIL(!strncmp(prog_start,copyright,sizeof(copyright)), + "New program contents"); + + /* Check the bit in between is still erased */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)prog_start; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + CYG_TEST_PASS_FAIL((ret == 0),"flash erase check1"); + + /* Erase the second block and make sure the first is not erased */ + ret=flash_erase((void *)((unsigned)flash_start+block_size), + block_size,NULL); + CYG_TEST_PASS_FAIL((ret == FLASH_ERR_OK),"flash_erase2"); + + /* Check the erase worked */ + for (ptr=(unsigned char *)flash_start+block_size,ret=0; + ptr < (unsigned char *)flash_start+block_size*2; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0), "flash erase check2"); + + /* Lastly check the first half of the copyright message is still there */ + CYG_TEST_PASS_FAIL(!strncmp(prog_start,copyright,sizeof(copyright)/2), + "Block 1 OK"); + +#if 0 + /* This test it fatal! Its not run by default! + Check the flash is read only, by trying to write to it. We expect + to get an exception */ + + *(char *)flash_start = 'a'; +#endif + + CYG_TEST_PASS_FINISH("flash1"); +} + +#endif /* ifndef NA_MSG */ + +/* EOF flash1.c */ diff --git a/packages/devs/flash/synthv2/current/tests/flash2.c b/packages/devs/flash/synthv2/current/tests/flash2.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/tests/flash2.c @@ -0,0 +1,222 @@ +/* Hay, the copyright is usefull for something! */ + +static char copyright[] = +"//==========================================================================" +"//" +"// flash1.c" +"//" +"// Test flash operations for the synth target synth flash driver" +"//" +"//==========================================================================" +"//####ECOSGPLCOPYRIGHTBEGIN####" +"// -------------------------------------------" +"// This file is part of eCos, the Embedded Configurable Operating System." +"// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc." +"//" +"// eCos is free software; you can redistribute it and/or modify it under" +"// the terms of the GNU General Public License as published by the Free" +"// Software Foundation; either version 2 or (at your option) any later version." +"//" +"// eCos is distributed in the hope that it will be useful, but WITHOUT ANY" +"// WARRANTY; without even the implied warranty of MERCHANTABILITY or" +"// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License" +"// for more details." +"//" +"// You should have received a copy of the GNU General Public License along" +"// with eCos; if not, write to the Free Software Foundation, Inc.," +"// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA." +"//" +"// As a special exception, if other files instantiate templates or use macros" +"// or inline functions from this file, or you compile this file and link it" +"// with other works to produce a work based on this file, this file does not" +"// by itself cause the resulting work to be covered by the GNU General Public" +"// License. However the source code for this file must still be made available" +"// in accordance with section (3) of the GNU General Public License." +"//" +"// This exception does not invalidate any other reasons why a work based on" +"// this file might be covered by the GNU General Public License." +"//" +"// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc." +"// at http://sources.redhat.com/ecos/ecos-license/" +"// -------------------------------------------" +"//####ECOSGPLCOPYRIGHTEND####" +"//==========================================================================" +"//#####DESCRIPTIONBEGIN####" +"//" +"// Author(s): andrew.lunn@ascom.ch" +"// Contributors: andrew.lunn" +"// Date: 2000-10-31" +"// Purpose: Test a flash driver" +"// Description: Try out a number of flash operations and make sure" +"// what is in the flash is what we expeect." +"// " +"//####DESCRIPTIONEND####" +"//" +"//==========================================================================&" +; + +#include +#include +#include +#include +#include +#include + +#include + +#ifndef CYGINT_ISO_STRING_STRFUNCS +# define NA_MSG "Need string functions for test" +#endif + +#ifdef NA_MSG +void cyg_user_start(void) +{ + CYG_TEST_INIT(); + CYG_TEST_NA( NA_MSG ); +} +#else + +//========================================================================== +// main + +void cyg_user_start(void) +{ + int ret; + cyg_flashaddr_t flash_start, flash_end; + cyg_flash_info_t info; + cyg_uint32 i=0; + cyg_uint32 j; + int block_size, blocks; + cyg_flashaddr_t prog_start; + unsigned char * ptr; + + CYG_TEST_INIT(); + + ret=cyg_flash_init((cyg_flash_printf *)diag_printf); + + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_init"); + + ret = cyg_flash_get_limits(&flash_start,&flash_end); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_get_limits"); + diag_printf("INFO: flash_start=%p, flash_end=%p\n", + flash_start, flash_end); + + ret = cyg_flash_get_block_info(&block_size, &blocks); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_get_block_info"); + CYG_TEST_PASS_FAIL((block_size == CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE), + "correct block size"); + CYG_TEST_PASS_FAIL((blocks == (CYGNUM_FLASH_SYNTH_V2_NUMBLOCKS + + (CYGNUM_FLASH_SYNTH_V2_NUMBOOT_BLOCKS * + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCKSIZE / + CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE))), + "correct number of blocks"); + + diag_printf("INFO: block_size=0x%x, blocks=%d\n", block_size, blocks); + + do { + ret = cyg_flash_get_info(i, &info); + if (ret == CYG_FLASH_ERR_OK) { + diag_printf("INFO: Nth=%d, start=%p, end=%p\n", + i, info.start, info.end); + for (j=0;j < info.num_block_infos; j++) { + diag_printf("INFO:\t block_size %d, blocks %d\n", + info.block_info[j].block_size, + info.block_info[j].blocks); + } + } + i++; + } while (ret != CYG_FLASH_ERR_INVALID); + + /* Erase the whole flash. Not recommended on real hardware since this + will probably erase the bootloader etc!!! */ + ret=cyg_flash_erase(flash_start,block_size * blocks,NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_erase1"); + + /* check that its actually been erased, and test the mmap area */ + for (ptr=(unsigned char *)flash_start,ret=0; + ptr <= (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash empty check"); + + ret = cyg_flash_program(flash_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_program1"); + + /* Check the contents made it into the flash */ + CYG_TEST_PASS_FAIL(!strncmp((void *)flash_start, + copyright,sizeof(copyright)), + "flash program contents"); + + /* .. and check nothing else changed */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash program overrun check"); + + /* Program over a block boundary */ + prog_start = flash_start + block_size - sizeof(copyright)/2; + ret = cyg_flash_program(prog_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_program2"); + + /* Check the first version is still OK */ + CYG_TEST_PASS_FAIL(!strncmp((void *)flash_start, + copyright, + sizeof(copyright)), + "Original contents"); + + CYG_TEST_PASS_FAIL(!strncmp((void *)prog_start, + copyright, + sizeof(copyright)), + "New program contents"); + + /* Check the bit in between is still erased */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)prog_start; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + CYG_TEST_PASS_FAIL((ret == 0),"flash erase check1"); + + /* Erase the second block and make sure the first is not erased */ + ret=cyg_flash_erase(flash_start+block_size,block_size,NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_erase2"); + + /* Check the erase worked */ + for (ptr=(unsigned char *)flash_start+block_size,ret=0; + ptr < (unsigned char *)flash_start+block_size*2; + ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0), "flash erase check2"); + + /* Lastly check the first half of the copyright message is still there */ + CYG_TEST_PASS_FAIL(!strncmp((void *)prog_start, + copyright, + sizeof(copyright)/2), + "Block 1 OK"); + +#if 0 + /* This test is be fatal! Its not run by default! + Check the flash is read only, by trying to write to it. We expect + to get an exception */ + + *(char *)flash_start = 'a'; +#endif + + CYG_TEST_PASS_FINISH("flash1"); +} + +#endif /* ifndef NA_MSG */ + +/* EOF flash1.c */ diff --git a/packages/devs/flash/synthv2/current/tests/flash3.c b/packages/devs/flash/synthv2/current/tests/flash3.c new file mode 100644 --- /dev/null +++ b/packages/devs/flash/synthv2/current/tests/flash3.c @@ -0,0 +1,241 @@ +/* Hay, the copyright is usefull for something! */ + +static char copyright[] = +"//==========================================================================" +"//" +"// flash1.c" +"//" +"// Test flash operations for the synth target synth flash driver" +"//" +"//==========================================================================" +"//####ECOSGPLCOPYRIGHTBEGIN####" +"// -------------------------------------------" +"// This file is part of eCos, the Embedded Configurable Operating System." +"// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc." +"//" +"// eCos is free software; you can redistribute it and/or modify it under" +"// the terms of the GNU General Public License as published by the Free" +"// Software Foundation; either version 2 or (at your option) any later version." +"//" +"// eCos is distributed in the hope that it will be useful, but WITHOUT ANY" +"// WARRANTY; without even the implied warranty of MERCHANTABILITY or" +"// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License" +"// for more details." +"//" +"// You should have received a copy of the GNU General Public License along" +"// with eCos; if not, write to the Free Software Foundation, Inc.," +"// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA." +"//" +"// As a special exception, if other files instantiate templates or use macros" +"// or inline functions from this file, or you compile this file and link it" +"// with other works to produce a work based on this file, this file does not" +"// by itself cause the resulting work to be covered by the GNU General Public" +"// License. However the source code for this file must still be made available" +"// in accordance with section (3) of the GNU General Public License." +"//" +"// This exception does not invalidate any other reasons why a work based on" +"// this file might be covered by the GNU General Public License." +"//" +"// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc." +"// at http://sources.redhat.com/ecos/ecos-license/" +"// -------------------------------------------" +"//####ECOSGPLCOPYRIGHTEND####" +"//==========================================================================" +"//#####DESCRIPTIONBEGIN####" +"//" +"// Author(s): andrew.lunn@ascom.ch" +"// Contributors: andrew.lunn" +"// Date: 2000-10-31" +"// Purpose: Test a flash driver" +"// Description: Try out a number of flash operations and make sure" +"// what is in the flash is what we expeect." +"// " +"//####DESCRIPTIONEND####" +"//" +"//==========================================================================&" +; + +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifndef CYGINT_ISO_STRING_STRFUNCS +# define NA_MSG "Need string functions for test" +#endif + +#ifdef NA_MSG +void cyg_user_start(void) +{ + CYG_TEST_INIT(); + CYG_TEST_NA( NA_MSG ); +} +#else + +static struct cyg_flash_synth_config config = { + CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE, + CYGNUM_FLASH_SYNTH_V2_NUMBLOCKS, + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCKSIZE, + CYGNUM_FLASH_SYNTH_V2_NUMBOOT_BLOCKS, + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCK_BOTTOM, + "synth.flash3" +}; + +CYG_FLASH_DRIVER(cyg_flash_synth_flashdev_flash3, + &cyg_flash_synth_funs, + &config, // Pointer to priv structure + 0x40020000, + sizeof(struct cyg_flash_synth_priv)); + +//========================================================================== +// main + +void cyg_user_start(void) +{ + int ret; + cyg_flashaddr_t flash_start, flash_end; + cyg_flash_info_t info; + cyg_uint32 i=0; + cyg_uint32 j; + int block_size, blocks; + cyg_flashaddr_t prog_start; + unsigned char * ptr; + + CYG_TEST_INIT(); + + // Reference the flash dev so the linker does not throw it away + CYG_REFERENCE_OBJECT(cyg_flash_synth_flashdev_flash3); + + ret=cyg_flash_init((cyg_flash_printf *)diag_printf); + + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_init"); + + ret = cyg_flash_get_limits(&flash_start,&flash_end); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_get_limits"); + diag_printf("INFO: flash_start=%p, flash_end=%p\n", + flash_start, flash_end); + + ret = cyg_flash_get_block_info(&block_size, &blocks); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_get_block_info"); + CYG_TEST_PASS_FAIL((block_size == CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE), + "correct block size"); + CYG_TEST_PASS_FAIL((blocks == (CYGNUM_FLASH_SYNTH_V2_NUMBLOCKS + + (CYGNUM_FLASH_SYNTH_V2_NUMBOOT_BLOCKS * + CYGNUM_FLASH_SYNTH_V2_BOOT_BLOCKSIZE / + CYGNUM_FLASH_SYNTH_V2_BLOCKSIZE))), + "correct number of blocks"); + + diag_printf("INFO: block_size=0x%x, blocks=%d\n", block_size, blocks); + + do { + ret = cyg_flash_get_info(i, &info); + if (ret == CYG_FLASH_ERR_OK) { + diag_printf("INFO: Nth=%d, start=%p, end=%p\n", + i, info.start, info.end); + for (j=0;j < info.num_block_infos; j++) { + diag_printf("INFO:\t block_size %d, blocks %d\n", + info.block_info[j].block_size, + info.block_info[j].blocks); + } + } + i++; + } while (ret != CYG_FLASH_ERR_INVALID); + + /* Erase the whole flash. Not recommended on real hardware since this + will probably erase the bootloader etc!!! */ + ret=cyg_flash_erase(flash_start,block_size * blocks,NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_erase1"); + + /* check that its actually been erased, and test the mmap area */ + for (ptr=(unsigned char *)flash_start,ret=0; + ptr <= (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash empty check"); + + ret = cyg_flash_program(flash_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_program1"); + + /* Check the contents made it into the flash */ + CYG_TEST_PASS_FAIL(!strncmp((void *)flash_start, + copyright,sizeof(copyright)), + "flash program contents"); + + /* .. and check nothing else changed */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)flash_end; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0),"flash program overrun check"); + + /* Program over a block boundary */ + prog_start = flash_start + block_size - sizeof(copyright)/2; + ret = cyg_flash_program(prog_start,©right,sizeof(copyright),NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_program2"); + + /* Check the first version is still OK */ + CYG_TEST_PASS_FAIL(!strncmp((void *)flash_start, + copyright, + sizeof(copyright)), + "Original contents"); + + CYG_TEST_PASS_FAIL(!strncmp((void *)prog_start, + copyright, + sizeof(copyright)), + "New program contents"); + + /* Check the bit in between is still erased */ + for (ptr=(unsigned char *)flash_start+sizeof(copyright),ret=0; + ptr < (unsigned char *)prog_start; ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + CYG_TEST_PASS_FAIL((ret == 0),"flash erase check1"); + + /* Erase the second block and make sure the first is not erased */ + ret=cyg_flash_erase(flash_start+block_size,block_size,NULL); + CYG_TEST_PASS_FAIL((ret == CYG_FLASH_ERR_OK),"flash_erase2"); + + /* Check the erase worked */ + for (ptr=(unsigned char *)flash_start+block_size,ret=0; + ptr < (unsigned char *)flash_start+block_size*2; + ptr++) { + if (*ptr != 0xff) { + ret++; + } + } + + CYG_TEST_PASS_FAIL((ret == 0), "flash erase check2"); + + /* Lastly check the first half of the copyright message is still there */ + CYG_TEST_PASS_FAIL(!strncmp((void *)prog_start, + copyright, + sizeof(copyright)/2), + "Block 1 OK"); + +#if 0 + /* This test is be fatal! Its not run by default! + Check the flash is read only, by trying to write to it. We expect + to get an exception */ + + *(char *)flash_start = 'a'; +#endif + + CYG_TEST_PASS_FINISH("flash3"); +} + +#endif /* ifndef NA_MSG */ + +/* EOF flash1.c */