了解代码 Linux 设备驱动程序 m25p80.c
Understand Code Linux Device Driver m25p80.c
我正在开发嵌入式设备。目前我想尝试使用另一种闪存而不是焊接的闪存。
所以我查看了 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(在数据表中,块号是正确的,但这里称为 页面大小)
- 0(Flags,也请解释一下。SECT_4K or 0 for memory 是什么意思)
补充问题。
驱动程序 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*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 driver probe
函数中看到的那样, spi_nor_scan
被调用。该函数检查闪存的大小是否大于 0x1000000
(16MegaBytes)。如果是,设置 addr_width = 4
ancd 检查其他内容以了解如何驱动设备:例如。调用允许 4 字节地址模式的 set_4byte
函数。
我正在开发嵌入式设备。目前我想尝试使用另一种闪存而不是焊接的闪存。 所以我查看了 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(在数据表中,块号是正确的,但这里称为 页面大小)
- 0(Flags,也请解释一下。SECT_4K or 0 for memory 是什么意思)
补充问题。
驱动程序 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*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 driver probe
函数中看到的那样, spi_nor_scan
被调用。该函数检查闪存的大小是否大于 0x1000000
(16MegaBytes)。如果是,设置 addr_width = 4
ancd 检查其他内容以了解如何驱动设备:例如。调用允许 4 字节地址模式的 set_4byte
函数。