Как читать I2C EEPROM из ядра Linux — ARM TI AM3352

На моей плате есть I2C EEPROM, в котором хранится информация о конфигурации. UBoot читает его с помощью функции read_eeprom, показанной ниже. Я также хотел бы получить доступ к этой информации изнутри ядра Linux, чтобы мои выходные данные /proc/cpuinfo отображались правильно. Однако я не могу найти эквивалентные функции i2c_probe и i2c_read в ядре Linux. Как мне выполнить следующие функции внутри ядра? Я использую линукс 3.2.

static int read_eeprom(void)
{
        /* Check if baseboard eeprom is available */
        if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {
                puts("Could not probe the EEPROM; something fundamentally "
                        "wrong on the I2C bus.\n");
                return -ENODEV;
        }

        /* read the eeprom using i2c */
        if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)&header,
                                                        sizeof(header))) {
                puts("Could not read the EEPROM; something fundamentally"
                        " wrong on the I2C bus.\n");
                return -EIO;
        }

        if (header.magic != 0xEE3355AA) {
                /*
                 * read the eeprom using i2c again,
                 * but use only a 1 byte address
                 */
                if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1,
                                        (uchar *)&header, sizeof(header))) {
                        puts("Could not read the EEPROM; something "
                                "fundamentally wrong on the I2C bus.\n");
                        return -EIO;
                }

                if (header.magic != 0xEE3355AA) {
                        printf("Incorrect magic number (0x%x) in EEPROM\n",
                                        header.magic);
                        return -EINVAL;
                }
        }

        return 0;
}

person fred basset    schedule 13.05.2014    source источник
comment
Можете ли вы предоставить версию ядра Linux, которую вы используете?   -  person daouzli    schedule 13.05.2014
comment
Можете ли вы также объяснить, что вы хотите сделать. Вам действительно нужно читать EEPROM из ядра? Вы хотите изменить вывод /proc/cpuinfo?   -  person daouzli    schedule 13.05.2014
comment
Ядро линукса 3.2. Я хочу, чтобы /proc/cpuinfo отображал тип платы и серийный номер, оба из которых хранятся в EEPROM.   -  person fred basset    schedule 13.05.2014
comment
Вы можете сделать это в сценарии u-boot, который устанавливает ATAGS или DT, которые отправляются ядру Linux. В противном случае вы должны настроить адреса и т. д. контроллера i2c, а затем настроить периферийные устройства для считывания этих значений. То есть вам нужен драйвер контроллера i2c и драйвер EEPROM_ADDR, а затем вам нужно заполнить переменные cpuinfo; уже сделано с ATAGS.   -  person artless noise    schedule 13.05.2014
comment
Это хороший комментарий @artlessnoise. Я изучу подход ATAGS.   -  person fred basset    schedule 14.05.2014


Ответы (2)


Есть несколько вопросов, которые необходимо принять во внимание, чтобы решить вашу проблему:

  • Вы сами собираете ядро? Ваша доска нестандартная?

  • Вам действительно нужно быть в ядре?

  • Вам действительно нужно поместить свою информацию в procfs? особенно в cpuinfo или пользовательском файле procfs может быть достаточно (procfs интерфейс, руководство по procfs)?

  • Получите информацию о вашей EEPROM, используя i2c-tools или проверив sysfs (/sys/class/i2c*)

  • Как зарегистрировано ваше устройство EEPROM I2C (множеством способов)?

  • Определите, где вы будете вводить свой код, и убедитесь, что он запускается после регистрации устройства. Будете ли вы создавать свой собственный модуль ядра, например, на этапе подготовки? Будете ли вы исправлять драйвер EEPROM?

  • Узнайте, как получить доступ и обновить cpuinfo procfs.

В зависимости от ваших реальных потребностей и вашей конфигурации способ решения вашей проблемы может измениться.

person daouzli    schedule 13.05.2014

Вы пытались использовать утилиту eeprog, я использовал ее в прошлом для чтения содержимого eeprom. Его источник доступен в сети, который вы можете портировать в свое приложение.

http://www.codesink.org/eeprog.html

person Amit Singh Tomar    schedule 07.06.2014