在我们采用 uClinux 的嵌入式 Linux 解决方案中,我刚刚添加了一个更大的闪存设备。我希望能够查询我安装了哪个设备(硬件设备)。
小型设备和大型设备都有不同的设备ID,我可以在设备驱动程序代码中读取它们。
我不知道如何在“用户空间”中获取该信息。即在 shell/bash 脚本中。
我看过:
cat /proc/mtd
- 这提供了有关分区大小的信息。但我无法从中看出,事实上我需要根据安装的闪存芯片来更改分区大小。
mtd_debug info /dev/mtd0
- 这非常接近,它告诉我有关扇区大小(擦除大小)、mtd 类型等的信息...但由于两个闪存芯片是同一类型,因此这些信息也不够。
答案1
我已经为此制定了一个基于代码的解决方案,它的堆栈溢出如下:我如何确定安装了什么 mtd 闪存设备
但是,由于这是一个代码更改(即使只有一行),它确实需要重新构建内核,所以我还没有将其标记为解决方案......
答案2
答案3
读取 FLASH 设备 ID 或 JEDEC ID 不是您可以从用户空间执行的操作。
MTD Utils 包允许您执行诸如擦除 MTD 设备或将数据复制到 MTD 设备之类的操作/dev/mtdXY
。但您无法访问内部寄存器和 FLASH ID 等数据。
此 FLASH ID 或 JEDEC ID 硬编码在 FLASH 芯片上。FLASH 芯片具有用于各种操作的特殊命令集(操作码),并且可以是特定于芯片的。
因此,为了获取此信息,您需要一个带有此特定操作码的低级 SPI 命令,它会告诉您的 FLASH 设备“发送 JEDEC ID 号码给我”
通常只有内核 MTD 设备驱动程序才具有此功能,因为它们需要读取 FLASH ID 以查看它是否与其支持的 FLASH 芯片的 ID 号匹配……
这是从 NOR SPI FLASH 读取 ID 的操作码;
#define SPINOR_OP_RDID 0x9f /* Read JEDEC ID */
这是内核驱动程序中的命令:
#define SPI_NOR_MAX_ID_LEN 6
tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN);
因此,该命令将 SPI 数据序列发送到具有已知总线和 CS 号的 FLASH 设备,该序列由操作码组成以读取 ID,并期望接收 6 个字节长的 HEX 数字。
该read_reg
回调进一步使用SPI框架函数,写入一个字节的操作码并读回FLASH ID:
ret = spi_write_then_read(spi, &code, 1, val, len);
spidev.X.Y
因此理论上您可以使用正确的“用户空间 SPI 设备”和由一个字节操作码组成的数据序列从用户空间执行相同操作并读回六个字节。