32 typedef struct {
33 ulong size; /* total bank size in bytes */
34 ushort sector_count; /* number of erase units */
35 ulong flash_id; /* combined device & manufacturer code */
36 ulong start[CONFIG_SYS_MAX_FLASH_SECT]; /* virtual sector start address */
37 uchar protect[CONFIG_SYS_MAX_FLASH_SECT]; /* sector protection status */
38 #ifdef CONFIG_SYS_FLASH_CFI
39 uchar portwidth; /* the width of the port */
40 uchar chipwidth; /* the width of the chip */
41 ushort buffer_size; /* # of bytes in write buffer */
42 ulong erase_blk_tout; /* maximum block erase timeout */
43 ulong write_tout; /* maximum write timeout */
44 ulong buffer_write_tout; /* maximum buffer write timeout */
45 ushort vendor; /* the primary vendor id */
46 ushort cmd_reset; /* vendor specific reset command */
47 ushort interface; /* used for x8/x16 adjustments */
48 ushort legacy_unlock; /* support Intel legacy (un)locking */
49 uchar manufacturer_id; /* manufacturer id */
50 ushort device_id; /* device id */
51 ushort device_id2; /* extended device id */
52 ushort ext_addr; /* extended query table address */
53 ushort cfi_version; /* cfi version */
54 ushort cfi_offset; /* offset for cfi query */
55 ulong addr_unlock1; /* unlock address 1 for AMD flash roms */
56 ulong addr_unlock2; /* unlock address 2 for AMD flash roms */
57 const char *name; /* human-readable name */
58 #endif
59 } flash_info_t;
flash_fill_sect_ranges() find the flash sector about the addr you point out when erase flash.
需要用到flash_info,这个变量是在flash_init()里初始化的.
delete define of CONFIG_SYS_FLASH_CFI? means what?
28 COBJS-$(CONFIG_MTD_PARTITIONS) += mtdcore.o mtdpart.o
29 COBJS-$(CONFIG_HAS_DATAFLASH) += at45.o
30 COBJS-$(CONFIG_FLASH_CFI_DRIVER) += cfi_flash.o
31 COBJS-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o
32 COBJS-$(CONFIG_HAS_DATAFLASH) += dataflash.o
33 COBJS-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o
34 COBJS-$(CONFIG_MW_EEPROM) += mw_eeprom.o
common/Makefile
COBJS-$(CONFIG_CMD_FLASH) += cmd_flash.o
COBJS-$(CONFIG_CMD_SF) += cmd_sf.o
in cmd_sf.c
182 U_BOOT_CMD(
183 sf, 5, 1, do_spi_flash,
184 "SPI flash sub-system",
185 "probe [bus:]cs [hz] [mode] - init flash device on given SPI bus/n"
186 " and chip select/n"
187 "sf read addr offset len - read `len' bytes starting at/n"
188 " `offset' to memory at `addr'/n"
189 "sf write addr offset len - write `len' bytes from memory/n"
190 " at `addr' to flash at `offset'/n"
191 "sf erase offset len - erase `len' bytes from `offset'/n");
如果执行"erase"命令,调用顺序是U_BOOT_CMD->do_flerase()->flash_sect_erase(), in cmd_flash.c
# sf probe
8 MB
exit spi_flash_probe
<cmd_sf.c>(do_spi_flash_probe)[61]
<cmd_sf.c>(do_spi_flash_probe)[66]
看来flash这个结构体没有赋值好.
今天就到这吧.
11/29/2010
printf("flash name[%d] = %s/n", i, params->name); 打印不出来,死机.
409 printf("flash name = %s/n", stm->flash.name); 也会死机,看来和%s有关.
先临时赋值给stm->flash.name了,看来是那个spi flash 结构体的排列问题,导致name取不出正确的值来显示,然后死机.
现在好像flash还是工作在4M模式,擦offset=0,就是擦bfc.
sflash的erase write read的驱动,都要使用bfc那个地址,I don't know why. now erase, write, read is ok.
串行flash的loader都要烧到flash的最开始位置?不用管bfc?
现在tftp的方式启动kernel 后,会死机,
Registering unionfs 2.2-mm
msgmni has been set to 82
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
LTT : ltt-relay init
i8042.c: i8042 controller self test timeout.
Serial: 8250/16550 driver2 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0x10101003 (irq = 56) is a 16550A
brd: module loaded
nec_candy: 10/100 Ethernet driver v0.4 (June 20, 2006)
nec_candy: Probe candy chip at 0x10012000, irq 44, Phy ID 0x00000001, MAC Addr 0
0:00:4c:80:92:a1
console [netcon0] enabled
netconsole: network logging started
i2c /dev entries driver
Driver 'sd' needs updating - please use bus_type methods
Driver 'sr' needs updating - please use bus_type methods
physmap platform flash device: 00800000 at 1f800000
看来如果要kernel启动起来,需要加上kernel中sflash的驱动.
就这样吧,没时间弄了,交给后面的工程师弄吧.