Как это перечисление работает в этом драйвере? - PullRequest
0 голосов
/ 02 апреля 2020

Когда я изучал код драйвера 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, но я не могу не чувствовать себя смущенным по этому поводу.

Может кто-нибудь помочь мне понять это немного лучше? Спасибо

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Разве нам не нужно предварительно создавать переменную для использования значений перечисления, используя в качестве примера enum mxs_auart_type value = IMX28_AUART?

Совсем нет.

После выполняя это:

enum MyEnum {A, B, C};

У вас будет три глобально доступных имени: A, B и C с фиксированными целочисленными значениями 0, 1 и 2 соответственно.

Взгляните на этот полезный пост, чтобы узнать больше: "stati c const" vs "#define" vs "enum" .

0 голосов
/ 02 апреля 2020

enum позволяет давать имена постоянным значениям. Для всех намерений и целей вы можете трактовать имя enum как целочисленный литерал.

В этом случае:

       .data = &mxs_auart_devtype[IMX28_AUART]

Имя IMX28_AUART рассматривается как 1, поэтому код такой же как:

       .data = &mxs_auart_devtype[1]
...