Uboot添加64M flash的支持
现在市面上64M的SPI Flash还不多,在MT7628的Uboot中原生支持的64M Flash只有"MX25L51245G"这一款。如果需要使用其他型号的Flash需要自行在drivers/spi_flash.c
文件中添加Flash的型号及参数。
添加型号的位置在drivers/spi_flash.c
文件中static struct chip_info chips_data
数组中。该数组每行有6个参数。每个参数定义如下:
- 芯片型号 – 该型号名称可自定义,无严格要求
- 芯片ID – 芯片厂家的ID,通常情况下同一家厂家的ID一样,例如winbond(W25系列Q)的大多为0xef,旺宏电子(MX系列)的为0xc2。
- 芯片的jedec_id – 芯片的jedec id,需要查询各个芯片对应的datasheet来确认,但每个厂家对该id的叫法不同,不好查询。可以修改同文件的
struct chip_info *chip_prob(void)
函数来在uboot启动时直接打印读出的jedec id数值,再将读出的数值填入。
struct chip_info *chip_prob(void)
{
struct chip_info *info, *match;
u8 buf[5];
u32 jedec, weight;
int i;
raspi_read_devid(buf, 5);
jedec = (u32)((u32)(buf[1] << 24) | ((u32)buf[2] << 16) | ((u32)buf[3] <<8) | (u32)buf[4]);
printf("spi device id: %x %x %x %x %x (%x)\n", buf[0], buf[1], buf[2], buf[3], buf[4], jedec);
........
- sector_size – 芯片每个sector的大小,需要查询芯片的Datasheet确定,不可填错,否则Uboot刷写Flash时可能出错。
- n_sectors – 芯片的sectors数量,需要查询芯片的Datasheet确定,不可填错,否则Uboot刷写Flash时可能出错。
- addr4b – 芯片是否使用4Bit模式。需要注意的是该模式可由芯片外围电路硬件控制。但大于16Mbytes的Flash芯片均需要采用4Bit模式通信,所以大于16Mbytes的芯片该位都需要填1。
添加好几款市面常见的64M Flash的代码
添加了S25FL512S,W25Q512JV,W25Q512JV-DTR,W25M512JV(不建议使用),W25M512JW(不建议使用)。
static struct chip_info chips_data [] = {
/* REVISIT: fill in JEDEC ids, for parts that have them */
{ "AT25DF321", 0x1f, 0x47000000, 64 * 1024, 64, 0 },
{ "AT26DF161", 0x1f, 0x46000000, 64 * 1024, 32, 0 },
{ "FL016AIF", 0x01, 0x02140000, 64 * 1024, 32, 0 },
{ "FL064AIF", 0x01, 0x02160000, 64 * 1024, 128, 0 },
{ "MX25L1605D", 0xc2, 0x2015c220, 64 * 1024, 32, 0 },//MX25L1606E
{ "MX25L3205D", 0xc2, 0x2016c220, 64 * 1024, 64, 0 },//MX25L3233F
{ "MX25L6405D", 0xc2, 0x2017c220, 64 * 1024, 128, 0 },//MX25L6433F
{ "MX25L12805D", 0xc2, 0x2018c220, 64 * 1024, 256, 0 },//MX25L12835F
{ "MX25L25635E", 0xc2, 0x2019c220, 64 * 1024, 512, 1 },//MX25L25635F
{ "MX25L51245G", 0xc2, 0x201ac220, 64 * 1024, 1024, 1 },
{ "S25FL256S", 0x01, 0x02194D01, 64 * 1024, 512, 1 },
{ "S25FL512S", 0x01, 0x02204D00, 64 * 1024, 512, 1 },//赛普拉斯的64M Flash,WSON-8封装
{ "S25FL128P", 0x01, 0x20180301, 64 * 1024, 256, 0 },
{ "S25FL129P", 0x01, 0x20184D01, 64 * 1024, 256, 0 },
{ "S25FL164K", 0x01, 0x40170140, 64 * 1024, 128, 0 },
{ "S25FL132K", 0x01, 0x40160140, 64 * 1024, 64, 0 },
{ "S25FL032P", 0x01, 0x02154D00, 64 * 1024, 64, 0 },
{ "S25FL064P", 0x01, 0x02164D00, 64 * 1024, 128, 0 },
{ "S25FL116K", 0x01, 0x40150140, 64 * 1024, 32, 0 },
{ "F25L64QA", 0x8c, 0x41170000, 64 * 1024, 128, 0 }, //ESMT
{ "F25L32QA", 0x8c, 0x41168c41, 64 * 1024, 64, 0 }, //ESMT
{ "EN25F16", 0x1c, 0x31151c31, 64 * 1024, 32, 0 },
{ "EN25Q32B", 0x1c, 0x30161c30, 64 * 1024, 64, 0 },
{ "EN25F32", 0x1c, 0x31161c31, 64 * 1024, 64, 0 },
{ "EN25F64", 0x1c, 0x20171c20, 64 * 1024, 128, 0 }, // EN25P64
{ "EN25Q64", 0x1c, 0x30171c30, 64 * 1024, 128, 0 },
{ "W25Q32BV", 0xef, 0x40160000, 64 * 1024, 64, 0 },//W25Q32FV
{ "W25X32VS", 0xef, 0x30160000, 64 * 1024, 64, 0 },
{ "W25Q64BV", 0xef, 0x40170000, 64 * 1024, 128, 0 }, //S25FL064K //W25Q64FV
{ "W25Q128BV", 0xef, 0x40180000, 64 * 1024, 256, 0 },//W25Q128FV
{ "W25Q256FV", 0xef, 0x40190000, 64 * 1024, 512, 1 },
{ "W25Q512JV", 0xef, 0x40200000, 64 * 1024, 1024, 1 },//Winbond公司的64M Flash
{ "W25Q512JV-DTR", 0xef, 0x70200000, 64 * 1024, 1024, 1 },//Winbond公司的64M Flash,与上一款区别在于支持double transfer rate的读模式
//{ "W25M512JV", 0xef, 0x71190000, 64 * 1024, 1024, 1 },//Winbond公司的64M Flash,由两片W25Q256拼装而成,不建议使用,能烧录系统并启动OpenWrt但会出问题,若要使用最好将sectors数量改为512,当成一片32M的Flash使用
//{ "W25M512JW", 0xef, 0x61190000, 64 * 1024, 1024, 1 },//Winbond公司的64M Flash,由两片W25Q256拼装而成,不建议使用,能烧录系统并启动OpenWrt但会出问题,若要使用最好将sectors数量改为512,当成一片32M的Flash使用
{ "N25Q032A13ESE40F", 0x20, 0xba161000, 64 * 1024, 64, 0 },
{ "N25Q064A13ESE40F", 0x20, 0xba171000, 64 * 1024, 128, 0 },
{ "N25Q128A13ESE40F", 0x20, 0xba181000, 64 * 1024, 256, 0 },
{ "N25Q256A", 0x20, 0xba191000, 64 * 1024, 512, 1 },
{ "MT25QL512AB", 0x20, 0xba201044, 64 * 1024, 1024, 1 },
{ "GD25Q32B", 0xC8, 0x40160000, 64 * 1024, 64, 0 },
{ "GD25Q64B", 0xC8, 0x40170000, 64 * 1024, 128, 0 },
{ "GD25Q128C", 0xC8, 0x40180000, 64 * 1024, 256, 0 },
};