From: Russ D. <ru...@us...> - 2003-11-27 08:03:05
|
Update of /cvsroot/blob/blob/src/lib In directory sc8-pr-cvs1:/tmp/cvs-serv9521/src/lib Modified Files: Makefile.am Added Files: cfi16.c cfi32.c Log Message: flesh out cfi probing, and only compile it in if requested by the arch file --- NEW FILE: cfi16.c --- /* * cfi16: CFI functions for 16 bit flash * * Copyright (C) 2001 Erik Mouw (J.A...@it...) * Copyright (C) 1999 Jan-Derk Bakker (J.D...@it...) * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ident "$Id: cfi16.c,v 1.1 2003/11/27 08:02:30 russd Exp $" #ifdef HAVE_CONFIG_H # include <blob/config.h> #endif #include <blob/errno.h> #include <blob/flash.h> #include <blob/util.h> #include <blob/debug.h> #include <blob/cfi.h> /* flash commands for a single 16 bit cfi flash chip */ #define READ_ARRAY 0x000000FF #define READ_QUERY 0x00000098 /* automatic descriptor support */ #define MAX_AUTO_DESCRIPTORS 4 static flash_descriptor_t auto_descriptors[MAX_AUTO_DESCRIPTORS + 1]; int flash_query_descriptors_cfi16(u32 *flashAddr, flash_descriptor_t **out) { u16 *addr = (u16 *) flashAddr; int result, nregions, n; addr[0x55] = READ_QUERY; barrier(); if (addr[0x10] != 'Q' && addr[0x11] != 'R' && addr[0x12] != 'Y') { result = -EINVAL; goto out; } dprintf("cfi16: manuf_code = %02X\n", addr[CFI16_MANUF_CODE]); dprintf("cfi16: device code = %02X\n", addr[CFI16_DEVICE_CODE]); dprintf("cfi16: device size = 2^%d bytes\n", addr[CFI16_DEVICE_SIZE_LG2]); nregions = addr[CFI16_ERASE_REGION_COUNT]; #define READ_U16LE(off) ((addr[(off)]) | (addr[(off) + 1]<<8)) for (n = 0; n < nregions && n < MAX_AUTO_DESCRIPTORS; n++) { u32 xcount = READ_U16LE(CFI16_ERASE_REGION_XBLKS(n)); u32 count = xcount + 1; u32 xsize = READ_U16LE(CFI16_ERASE_REGION_XSIZE(n)); u32 size = (xsize == 0) ? 128 : xsize * 256; dprintf("cfi16: erase region #%d\n", n); dprintf("cfi16: count = %d\n", count); dprintf("cfi16: size = %d\n", size); auto_descriptors[n].size = size; auto_descriptors[n].num = count; auto_descriptors[n].lockable = 1; /* fix me */ } #undef READ_U16LE auto_descriptors[n].size = 0; auto_descriptors[n].num = 0; *out = auto_descriptors; result = 0; out: /* put flash back into Read Array mode */ barrier(); *addr = READ_ARRAY; barrier(); return result; } --- NEW FILE: cfi32.c --- /* * cfi32: CFI functions for 32 bit flash * * Copyright (C) 2001 Erik Mouw (J.A...@it...) * Copyright (C) 1999 Jan-Derk Bakker (J.D...@it...) * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ident "$Id: cfi32.c,v 1.1 2003/11/27 08:02:31 russd Exp $" #ifdef HAVE_CONFIG_H # include <blob/config.h> #endif #include <blob/errno.h> #include <blob/flash.h> #include <blob/util.h> #include <blob/debug.h> #include <blob/cfi.h> /* flash commands for two interleaved 16 bit flash chips */ #define READ_ARRAY 0x00FF00FF #define READ_QUERY 0x00980098 /* automatic descriptor support */ #define MAX_AUTO_DESCRIPTORS 4 static flash_descriptor_t auto_descriptors[MAX_AUTO_DESCRIPTORS + 1]; int flash_query_descriptors_cfi32(u32 *addr, flash_descriptor_t **out) { int result, nregions, n; addr[0x55] = READ_QUERY; barrier(); if (addr[0x10] != ('Q' | ('Q' << 16)) && addr[0x11] != ('R' | ('R' << 16)) && addr[0x12] != ('Y' | ('Y' << 16))) { result = -EINVAL; goto out; } dprintf("cfi32: manuf_code = %02X\n", addr[CFI32_MANUF_CODE] & 0xff); dprintf("cfi32: device code = %02X\n", addr[CFI32_DEVICE_CODE] & 0xff); dprintf("cfi32: device size = 2^%d bytes\n", addr[CFI32_DEVICE_SIZE_LG2] & 0xff); dprintf("cfi32: manuf_code = %02X\n", addr[CFI32_MANUF_CODE] >> 16); dprintf("cfi32: device code = %02X\n", addr[CFI32_DEVICE_CODE] >> 16); dprintf("cfi32: device size = 2^%d bytes\n", addr[CFI32_DEVICE_SIZE_LG2] >> 16); /* From here on out, assume both chips return the same data */ nregions = addr[CFI32_ERASE_REGION_COUNT] & 0xffff; #define READ_U16LE(off) ((addr[(off)] & 0xff) | ((addr[(off) + 1] & 0xff)<<8)) for (n = 0; n < nregions && n < MAX_AUTO_DESCRIPTORS; n++) { u32 xcount = READ_U16LE(CFI32_ERASE_REGION_XBLKS(n)); u32 count = xcount + 1; u32 xsize = READ_U16LE(CFI32_ERASE_REGION_XSIZE(n)); u32 size = (xsize == 0) ? 128 : xsize * 256; dprintf("cfi32: erase region #%d\n", n); dprintf("cfi32: count = %d\n", count); dprintf("cfi32: size = %d\n", size); auto_descriptors[n].size = size; auto_descriptors[n].num = count; auto_descriptors[n].lockable = 1; /* fix me */ } #undef READ_U32LE auto_descriptors[n].size = 0; auto_descriptors[n].num = 0; *out = auto_descriptors; result = 0; out: /* put flash back into Read Array mode */ barrier(); *addr = READ_ARRAY; barrier(); return result; } Index: Makefile.am =================================================================== RCS file: /cvsroot/blob/blob/src/lib/Makefile.am,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- Makefile.am 10 Nov 2003 17:06:41 -0000 1.34 +++ Makefile.am 27 Nov 2003 08:02:31 -0000 1.35 @@ -26,6 +26,8 @@ libblob_a_SOURCES = \ + cfi16.c \ + cfi32.c \ command.c \ crc32.c \ download.c \ |