这个枚举在这个驱动程序中是如何工作的?

How does this enumeration work in this driver?

当我研究 mxs-auart.c 驱动程序的代码时,我注意到以下声明:

enum mxs_auart_type {
    IMX23_AUART,
    IMX28_AUART,
    ASM9260_AUART,
};

然后是:

static const struct platform_device_id mxs_auart_devtype[] = {
    { .name = "mxs-auart-imx23", .driver_data = IMX23_AUART },
    { .name = "mxs-auart-imx28", .driver_data = IMX28_AUART },
    { .name = "as-auart-asm9260", .driver_data = ASM9260_AUART },
    { /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, mxs_auart_devtype);

static const struct of_device_id mxs_auart_dt_ids[] = {
    {
        .compatible = "fsl,imx28-auart",
        .data = &mxs_auart_devtype[IMX28_AUART]
    }, {
        .compatible = "fsl,imx23-auart",
        .data = &mxs_auart_devtype[IMX23_AUART]
    }, {
        .compatible = "alphascale,asm9260-auart",
        .data = &mxs_auart_devtype[ASM9260_AUART]
    }, { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxs_auart_dt_ids);

我不明白的是,例如 IMX28_AUART 怎么可以像 .data = &mxs_auart_devtype[IMX28_AUART] 一样使用。举个例子 enum mxs_auart_type value = IMX28_AUART,难道我们不必事先实例化一个变量来使用枚举值吗? 我知道在 C 的枚举中,值等于默认从 0 开始的整数,但我不禁对此感到困惑。

谁能帮助我更好地理解这一点? 谢谢

enum 允许您为常量值命名。出于所有意图和目的,您可以将 enum 名称视为整数文字。

在这种情况下:

       .data = &mxs_auart_devtype[IMX28_AUART]

名称IMX28_AUART被视为1,因此代码相同:

       .data = &mxs_auart_devtype[1]

Don't we have to instanciate a variable beforehand to use the enum values by doing as an example enum mxs_auart_type value = IMX28_AUART?

完全没有。

完成后:

enum MyEnum {A, B, C};

您将拥有三个全局可用的名称:ABC,固定整数值为 012相应地。

看看这个有用的 post 了解更多:"static const" vs "#define" vs "enum".