【问题标题】:How does this enumeration work in this driver?这个枚举在这个驱动程序中是如何工作的?
【发布时间】:2020-07-14 19:08:59
【问题描述】:

在研究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 开始,但我不禁对此感到困惑。

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

【问题讨论】:

    标签: c linux linux-kernel linux-device-driver platform


    【解决方案1】:

    我们是否必须事先实例化一个变量才能使用枚举值,例如enum mxs_auart_type value = IMX28_AUART

    一点也不。

    这样做之后:

    enum MyEnum {A, B, C};
    

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

    查看这篇有用的帖子以了解更多信息:"static const" vs "#define" vs "enum"

    【讨论】:

      【解决方案2】:

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

      在这种情况下:

             .data = &mxs_auart_devtype[IMX28_AUART]
      

      名称IMX28_AUART被视为1,所以代码相同:

             .data = &mxs_auart_devtype[1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多