Linux 内核源代码中放置的 MTD 驱动程序具有如下定义。
struct mtd_info_user {
__u8 type;
__u32 flags;
__u32 size; /* Total size of the MTD */
__u32 erasesize;
__u32 writesize;
__u32 oobsize; /* Amount of OOB data per block (e.g. 16) */
__u64 padding; /* Old obsolete field; do not use */
};
我试图理解
flags
字段代表什么。我的最终目的是找到一种方法来检查外部 MTD 设备是否健康。我认为flags字段可以代表设备的实际状态。
在
mtdchar.c源代码中的
mtdchar_open(..)
函数中,有如下比较。
/* You can't open it RW if it's not a writeable device */
if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) {
ret = -EACCES;
goto out1;
}
所以,我想可以使用 mtd-abi.h header 中的宏来评估标志字段。
#define MTD_ABSENT 0
#define MTD_RAM 1
#define MTD_ROM 2
#define MTD_NORFLASH 3
#define MTD_NANDFLASH 4 /* SLC NAND */
#define MTD_DATAFLASH 6
#define MTD_UBIVOLUME 7
#define MTD_MLCNANDFLASH 8 /* MLC NAND (including TLC) */
#define MTD_WRITEABLE 0x400 /* Device is writeable */
#define MTD_BIT_WRITEABLE 0x800 /* Single bits can be flipped */
#define MTD_NO_ERASE 0x1000 /* No erase necessary */
#define MTD_POWERUP_LOCK 0x2000 /* Always locked after reset */
问题在于为什么其中一些定义被声明为普通整数,例如MTD_ABSENT。
前 9 个值被定义为普通整数,因为它们是互斥的,即同一设备中不能同时拥有 MLC 和 SLC NAND 闪存。因此,您可以读取第一个半字节来确定您正在与哪种 MTD 设备进行交互。
按位定义并不相互排斥,即可写设备可能支持也可能不支持单个位写入。