From: Erik M. <er...@us...> - 2001-10-15 21:54:20
|
Update of /cvsroot/blob/blob/src/blob In directory usw-pr-cvs1:/tmp/cvs-serv20208 Modified Files: lart.c clart.c assabet.c Log Message: Machine specific flash functions. These three are either tested (LART), or otherwise I'm pretty sure they work (Assabet, CreditLART). Index: lart.c =================================================================== RCS file: /cvsroot/blob/blob/src/blob/lart.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- lart.c 2001/10/14 22:36:11 1.1 +++ lart.c 2001/10/15 21:54:17 1.2 @@ -26,4 +26,115 @@ #endif #include <blob/arch.h> +#include <blob/errno.h> +#include <blob/flash.h> +#include <blob/util.h> + + + + +/* flash descriptor for LART flash */ +/* 2x Intel 28F160F3B fast boot block flash (4MB) */ +flash_descriptor_t flash_descriptors[] = +{ + { + size: 2 * 8 * 1024, + num: 2, + lockable: 1 + }, + { + size: 2 * 8 * 1024, + num: 6, + }, + { + size: 2 * 64 * 1024, + num: 31, + }, + { + /* NULL block */ + }, +}; + + + + +/* flash commands for two 16 bit intel flash chips */ +#define READ_ARRAY 0x00FF00FF +#define ERASE_SETUP 0x00200020 +#define ERASE_CONFIRM 0x00D000D0 +#define PGM_SETUP 0x00400040 +#define STATUS_READ 0x00700070 +#define STATUS_CLEAR 0x00500050 +#define STATUS_BUSY 0x00800080 +#define STATUS_ERASE_ERR 0x00200020 +#define STATUS_PGM_ERR 0x00100010 + + + + +/* the next two functions should work for all Intel flashes */ + +/* erases a flash block at the given address */ +int erase_flash(u32 *addr) +{ + u32 result; + + /* prepare for erase */ + *addr = data_to_flash(ERASE_SETUP); + barrier(); + /* erase block */ + *addr = data_to_flash(ERASE_CONFIRM); + barrier(); + + /* status check */ + do { + *addr = data_to_flash(STATUS_READ); + barrier(); + result = data_from_flash(*addr); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *addr = data_to_flash(READ_ARRAY); + barrier(); + + if((result & STATUS_ERASE_ERR) != 0) + return -EFLASHERASE; + + return 0; +} + + + +/* write a flash block at a given location */ +int write_flash(u32 *dst, const u32* src) +{ + u32 result; + + /* setup flash for writing */ + *dst = data_to_flash(PGM_SETUP); + barrier(); + + /* write data */ + *dst = *src; + barrier(); + + /* status check */ + do { + *dst = data_to_flash(STATUS_READ); + barrier(); + + result = data_from_flash(*dst); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *dst = data_to_flash(READ_ARRAY); + barrier(); + + if(((result & STATUS_PGM_ERR) != 0) || (*dst != *src)) + return -EFLASHPGM; + + return 0; +} Index: clart.c =================================================================== RCS file: /cvsroot/blob/blob/src/blob/clart.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- clart.c 2001/10/14 22:36:11 1.1 +++ clart.c 2001/10/15 21:54:17 1.2 @@ -26,4 +26,108 @@ #endif #include <blob/arch.h> +#include <blob/errno.h> +#include <blob/flash.h> +#include <blob/util.h> + + + + +/* flash descriptor for CreditLART flash */ +/* 1x Intel 28F256J3A strataflash (16MB) */ +flash_descriptor_t flash_descriptors[] = +{ + { + size: 128 * 1024, + num: 128, + lockable: 1 + }, + { + /* NULL block */ + }, +}; + + + + +/* flash commands for a single 16 bit intel flash chip */ +#define READ_ARRAY 0x000000FF +#define ERASE_SETUP 0x00000020 +#define ERASE_CONFIRM 0x000000D0 +#define PGM_SETUP 0x00000040 +#define STATUS_READ 0x00000070 +#define STATUS_CLEAR 0x00000050 +#define STATUS_BUSY 0x00000080 +#define STATUS_ERASE_ERR 0x00000020 +#define STATUS_PGM_ERR 0x00000010 + + + + +/* the next two functions should work for all Intel flashes */ + +/* erases a flash block at the given address */ +int erase_flash(u32 *addr) +{ + u32 result; + + /* prepare for erase */ + *addr = data_to_flash(ERASE_SETUP); + barrier(); + + /* erase block */ + *addr = data_to_flash(ERASE_CONFIRM); + barrier(); + /* status check */ + do { + *addr = data_to_flash(STATUS_READ); + barrier(); + result = data_from_flash(*addr); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *addr = data_to_flash(READ_ARRAY); + barrier(); + + if((result & STATUS_ERASE_ERR) != 0) + return -EFLASHERASE; + + return 0; +} + + + + +/* write a flash block at a given location */ +int write_flash(u32 *dst, const u32* src) +{ + u32 result; + + /* setup flash for writing */ + *dst = data_to_flash(PGM_SETUP); + barrier(); + + /* write data */ + *dst = *src; + barrier(); + + /* status check */ + do { + *dst = data_to_flash(STATUS_READ); + barrier(); + + result = data_from_flash(*dst); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *dst = data_to_flash(READ_ARRAY); + barrier(); + + if(((result & STATUS_PGM_ERR) != 0) || (*dst != *src)) + return -EFLASHPGM; + + return 0; +} Index: assabet.c =================================================================== RCS file: /cvsroot/blob/blob/src/blob/assabet.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- assabet.c 2001/10/14 22:36:11 1.1 +++ assabet.c 2001/10/15 21:54:17 1.2 @@ -26,4 +26,102 @@ #endif #include <blob/arch.h> +#include <blob/errno.h> +#include <blob/flash.h> +#include <blob/util.h> + + +/* flash descriptor for Assabet flash */ +/* 2x Intel 28F128J3A strataflash (16MB) */ +flash_descriptor_t flash_descriptors[] = +{ + { + size: 2 * 128 * 1024, + num: 64, + lockable: 1 + }, + { + /* NULL block */ + }, +}; + + + + +/* flash commands for two 16 bit intel flash chips */ +#define READ_ARRAY 0x00FF00FF +#define ERASE_SETUP 0x00200020 +#define ERASE_CONFIRM 0x00D000D0 +#define PGM_SETUP 0x00400040 +#define STATUS_READ 0x00700070 +#define STATUS_CLEAR 0x00500050 +#define STATUS_BUSY 0x00800080 +#define STATUS_ERASE_ERR 0x00200020 +#define STATUS_PGM_ERR 0x00100010 + + + + +int erase_flash(u32 *addr) +{ + u32 result; + + /* prepare for erase */ + *addr = data_to_flash(ERASE_SETUP); + barrier(); + + /* erase block */ + *addr = data_to_flash(ERASE_CONFIRM); + barrier(); + + /* status check */ + do { + *addr = data_to_flash(STATUS_READ); + barrier(); + result = data_from_flash(*addr); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *addr = data_to_flash(READ_ARRAY); + barrier(); + + if((result & STATUS_ERASE_ERR) != 0) + return -EFLASHERASE; + return 0; +} + + + + +int write_flash(u32 *dst, const u32* src) +{ + u32 result; + + /* setup flash for writing */ + *dst = data_to_flash(PGM_SETUP); + barrier(); + + /* write data */ + *dst = *src; + barrier(); + + /* status check */ + do { + *dst = data_to_flash(STATUS_READ); + barrier(); + + result = data_from_flash(*dst); + barrier(); + } while((~result & STATUS_BUSY) != 0); + + /* put flash back into Read Array mode */ + *dst = data_to_flash(READ_ARRAY); + barrier(); + + if(((result & STATUS_PGM_ERR) != 0) || (*dst != *src)) + return -EFLASHPGM; + + return 0; +} |