了解Linux设备驱动程序m25p80.c的代码
我正在一个嵌入式设备上工作。目前,我想尝试使用另一个闪存而不是焊接的。 因此,我查看了m25p80.c的代码,该代码可以兼容但具有更多内存。在这个文件中,我们找到了这个结构了解Linux设备驱动程序m25p80.c的代码,c,linux,embedded,linux-device-driver,spi,C,Linux,Embedded,Linux Device Driver,Spi,我正在一个嵌入式设备上工作。目前,我想尝试使用另一个闪存而不是焊接的。 因此,我查看了m25p80.c的代码,该代码可以兼容但具有更多内存。在这个文件中,我们找到了这个结构 static const struct spi_device_id m25p_ids[] 它有这个声明。当然,这还不是全部 { "en25f32", INFO(0x1c3116, 0, 64 * 1024, 64, SECT_4K) }, { "en25p32", INFO(0x1c2016, 0, 64 * 1024,
static const struct spi_device_id m25p_ids[]
它有这个声明。当然,这还不是全部
{ "en25f32", INFO(0x1c3116, 0, 64 * 1024, 64, SECT_4K) },
{ "en25p32", INFO(0x1c2016, 0, 64 * 1024, 64, 0) },
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
{ "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
在上面的m25p80.c代码中,我们还可以找到宏INFO
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
((kernel_ulong_t)&(struct flash_info) { \
.jedec_id = (_jedec_id), \
.ext_id = (_ext_id), \
.sector_size = (_sector_size), \
.n_sectors = (_n_sectors), \
.page_size = 256, \
.flags = (_flags), \
})
现在我想了解一些值的含义,因为我只了解很少的值。例如,对于一种类型
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
- 信息(以上宏)
- 0x1c2017(据我所知,这是芯片的一个特殊ID。这有助于系统在引导时识别闪存)
- 0(另一个Id可能不重要)
- 64*1024(我不知道这是什么,因为在数据表中,扇区的芯片数量是2048,而不是65536)
- 128(在数据表中,块号正确,但此处称为页面大小)
- 0(也请解释标志。内存的第4K节或第0节是什么意思)
驱动程序m25p80能否处理256Mb(4个地址字节)以上的闪存SPI?如果没有,我应该使用哪个驱动程序?谈论
M25P80
{ "m25p80", INFO(0x202014, 0, 64 * 1024, 16, 0) },
表格数据表第6页
它被组织为16个扇区,每个扇区包含256页。每页是256页
字节宽
然后第三个参数64*1024
是65536
,如前所述,它等于256pages x 256bytes
关于标志,您可以在spi nor.c
#define SECT_4K 0x01 /* SPINOR_OP_BE_4K works uniformly */
#define SPI_NOR_NO_ERASE 0x02 /* No erase command needed */
#define SST_WRITE 0x04 /* use SST byte programming */
#define SPI_NOR_NO_FR 0x08 /* Can't do fastread */
#define SECT_4K_PMC 0x10 /* SPINOR_OP_BE_4K_PMC works uniformly */
#define SPI_NOR_DUAL_READ 0x20 /* Flash supports Dual Read */
#define SPI_NOR_QUAD_READ 0x40 /* Flash supports Quad Read */
#define SPI_NOR_DDR_QUAD_READ 0x80 /* Flash supports DDR Quad Read */
编辑
大约4个地址宽的芯片,正如您在
m25p80驱动程序探针
函数中看到的,调用了spi\u nor\u扫描
。该函数检查闪存的大小是否大于0x1000000
(16MegaBytes)。如果是,则设置addr\u width=4
ancd检查其他内容以了解如何驱动设备:例如,调用set\u 4byte
允许4字节地址模式的函数。“64*1024”:这是KiB中的内存大小如何?对于其他字段:检查该结构类型的定义。对于其余的:只读取驱动程序代码如何?好的,这是正确的,同样适用于en25p64。比你强。那么这个驱动程序中的4字节地址呢?我不明白你的意思。m25p80是一个8兆字节的内存,即1兆字节。地址最大值为0xFFFFF。@Mbded我编辑这篇文章,试图回答您大约4个地址宽的问题。现在我明白了这个问题。谢谢大家reply@Mbded不客气。然后按回答进行检查,关闭邮件。