c - 了解代码 Linux 设备驱动程序 m25p80.c

标签 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,  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) },
  • INFO(宏上方)
  • 0x1c2017(这个我理解是芯片的特殊ID,有助于系统开机识别flash)
  • 0(另一个ID。可能不重要)
  • 64 * 1024(我不知道这是什么,因为数据表中的芯片扇区数是 2048 而不是 65536)
  • 128(在数据表中这是正确的 block 号,但这里称为页面大小)
  • 0(Flags,也请解释。SECT_4K或内存0是什么意思)

附加问题。

驱动程序 m25p80 能否处理 256Mb(4 个地址字节)以上的闪存 SPI?如果不是,我应该使用哪个驱动程序?

最佳答案

谈论M25P80

{ "m25p80",  INFO(0x202014,  0,  64 * 1024,  16, 0) },

表格数据表第 6 页

It is organized as 16 sectors, each containing 256 pages. Each page is 256 bytes wide

然后第三个参数 64*102465536,正如所描述的,等于 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_nor_scan。该函数检查闪存的大小是否大于 0x1000000 (16MegaBytes)。如果是,则设置 addr_width = 4 ancd 检查其他内容以了解如何驱动设备:例如。调用允许4字节地址模式的set_4byte函数。

关于c - 了解代码 Linux 设备驱动程序 m25p80.c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315040/

相关文章:

windows - Windows 切换焦点时击键会发生什么

linux - 将变量存储在任何地方(交换空间、磁盘)但不在物理内存中

qt - 如何为 Qt-GStreamer 构建指定 GStreamer 路径

c# - 我想创建自己的虚拟打印机,当打印发生时它会弹出我的应用程序

c - ASCII 到十进制值

c - 如何从字符串中分离整数并在 C 中操作它们?

linux - linux/powerpc 上的动态链接失败

c - 使用 raspberry pi pico uart 和 c sdk 的奇怪之处

c++ - 如何防止从中断例程中调用特定函数或方法?

c - 当 offset 递减传递给 mmap 时,mmap 调用失败