了解Linux设备驱动程序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,

我正在一个嵌入式设备上工作。目前,我想尝试使用另一个闪存而不是焊接的。 因此,我查看了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,  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不客气。然后按回答进行检查,关闭邮件。