频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
Unsupported manufacture 问题及解决办法
2018-09-10 12:03:29           
收藏   我要投稿

拿了个新板子,烧了程序,uboot冒出了这个错误.跟踪了一下,发现是不识别flash型号的问题.这...,都能跑uboot了,还不识别flash??追踪了下代码,却也发现了识别flash的合理性:

总得把flash的页大小,容量告诉uboot,之后uboot的读,写才能顺利进行.

/* search the table for matches in shift and id */
        for (i = 0; i < ARRAY_SIZE(flashes); ++i)
                if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
                        /* we have a match, call probe */
                        flash = flashes[i].probe(spi, idp);
                        if (flash)
                                break;
                }

在uboot报错前,它已经对这个flash进行型号判断.flashes[]是一个结构体数组,内容是


static const struct {
        const u8 shift;
        const u8 idcode;
        struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
} flashes[] = {
        /* Keep it sorted by define name */
#ifdef CONFIG_SPI_FLASH_ATMEL
        { 0, 0x1f, spi_flash_probe_atmel, },
#endif
#ifdef CONFIG_SPI_FLASH_EON
        { 0, 0x1c, spi_flash_probe_eon, },
#endif
#ifdef CONFIG_SPI_FLASH_MACRONIX
        { 0, 0xc2, spi_flash_probe_macronix, },
#endif
#ifdef CONFIG_SPI_FLASH_SPANSION
        { 0, 0x01, spi_flash_probe_spansion, },
#endif
#ifdef CONFIG_SPI_FLASH_SST
        { 0, 0xbf, spi_flash_probe_sst, },
#endif
#ifdef CONFIG_SPI_FLASH_STMICRO
        { 0, 0x20, spi_flash_probe_stmicro, },
#endif
#ifdef CONFIG_SPI_FLASH_WINBOND
        { 0, 0xef, spi_flash_probe_winbond, },
#endif
#ifdef CONFIG_SPI_FLASH_GD
        { 0, 0xc8, spi_flash_probe_gd, },
#endif
#ifdef CONFIG_SPI_FRAM_RAMTRON
        { 6, 0xc2, spi_fram_probe_ramtron, },
# undef IDCODE_CONT_LEN
# define IDCODE_CONT_LEN 6
#endif
        /* Keep it sorted by best detection */
#ifdef CONFIG_SPI_FLASH_STMICRO
        { 0, 0xff, spi_flash_probe_stmicro, },
#endif
#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
        { 0, 0xff, spi_fram_probe_ramtron, },
#endif
};

我的芯片id为0x207017,前缀是0x20,会进入到spi_flash_probe_stmicro()函数

spi_flash_probe_stmicro()函数中,会看到有张flash_table表,它轮询这张表,如下:


for (i = 0; i < ARRAY_SIZE(stmicro_spi_flash_table); i++) {
		params = &stmicro_spi_flash_table[i];
		if (params->id == id) {
			break;
		}
	}

stmicro_spi_flash_table表内容为:


struct stmicro_spi_flash_params {
	u16 id;
	u16 pages_per_sector;
	u16 nr_sectors;
	const char *name;
};

static const struct stmicro_spi_flash_params stmicro_spi_flash_table[] = {
	{
		.id = 0x2011,
		.pages_per_sector = 128,
		.nr_sectors = 4,
		.name = "M25P10",
	},
	{
		.id = 0x2015,
		.pages_per_sector = 256,
		.nr_sectors = 32,
		.name = "M25P16",
	},
	{
		.id = 0x2012,
		.pages_per_sector = 256,
		.nr_sectors = 4,
		.name = "M25P20",
	},
	{
		.id = 0x2016,
		.pages_per_sector = 256,
		.nr_sectors = 64,
		.name = "M25P32",
	},
	{
		.id = 0x2013,
		.pages_per_sector = 256,
		.nr_sectors = 8,
		.name = "M25P40",
	},...
}

而我的flashid后4个16进制为0x7017,不在这个表里面,因此模仿着加上


{
		.id = 0x7017,
		.pages_per_sector = 256,
		.nr_sectors = 128,
		.name = "N70Q256",
	},

然后uboot就能正确识别到这个flash型号了.

 

关于这个.pages_per_sector = 256, .nr_sectors = 128, 是怎么来的,据我理解,

.pages_per_sector 表示一个页占用的字节数.

它的1个单位大小表示256个字节,而这个flash的的单页是64K的,所以是256这个数值.

.nr_sectors 表示有多少页.flash为8M,所以为128.

点击复制链接 与好友分享!回本站首页
上一篇:java数据类型有哪些
下一篇:双版本python配置pip和sublime
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站