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

时间:2015-07-09 10:39:49

标签: 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) },
  • 信息(宏观上方)
  • 0x1c2017 (我知道这是芯片的特殊ID。系统在启动时识别闪存很有帮助)
  • 0 (另一个Id。可能并不重要)
  • 64 * 1024 (我不知道这是什么,因为在数据表中芯片的扇区数是2048但不是65536)
  • 128 (在数据表中,这与块编号相符,但此处称为页面大小
  • 0 (标志,请解释.SECT_4K或0表示内存意味着什么)

其他问题。

驱动程序m25p80可以处理高于256Mb(4地址字节)的闪存SPI吗?如果没有,我应该使用哪个驱动程序?

1 个答案:

答案 0 :(得分:2)

谈论M25P80

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

表单数据表第6页

  

它被组织为16个扇区,每个扇区包含256个页面。每页为256   字节宽

然后第三个参数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 */

修改

m25p80 driver probe函数中可以看到大约4个地址宽的芯片,spi_nor_scan被调用。该函数检查flash的大小是否大于0x1000000(16MegaBytes)。如果是,则设置addr_width = 4 ancd检查其他内容以了解如何驱动设备:例如。调用允许4字节地址模式的set_4byte函数。