如何评估mtd_info_user的flags字段?

问题描述 投票:0回答:1

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

linux linux-device-driver embedded-linux
1个回答
0
投票

前 9 个值被定义为普通整数,因为它们是互斥的,即同一设备中不能同时拥有 MLC 和 SLC NAND 闪存。因此,您可以读取第一个半字节来确定您正在与哪种 MTD 设备进行交互。

按位定义并不相互排斥,即可写设备可能支持也可能不支持单个位写入。

© www.soinside.com 2019 - 2024. All rights reserved.