Есть ли способ читать/записывать более 32 байтов на интерфейсе SMBus на базе Linux?

Я пытаюсь получить доступ к устройству на основе I2C через ioctls SMBus в Linux. Мне нужно написать более 32 байт. I2C_SMBUS ioctl ограничивает размер до 32 байт. Базовый драйвер не поддерживает I2C_RDWR ioctl и прямые вызовы read()/write(). Я также пробовал байт за байтом R/W, но у меня это не работает.


person tsk    schedule 27.12.2019    source источник
comment
Возможно, это поможет: stackoverflow.com/a/25984891/12548337   -  person jerch    schedule 27.12.2019
comment
Системные вызовы чтения/записи не работают на этом устройстве из-за ограничения драйвера. Они возвращают ошибку EOPNOTSUPP.   -  person tsk    schedule 27.12.2019
comment
Если вам приходится полагаться на буферизацию ядра, вы не можете обойти ограничение в 32 байта, поскольку оно указано как таковое и жестко закодировано в github.com/torvalds/linux/blob/   -  person jerch    schedule 27.12.2019


Ответы (1)


Вам нужно будет использовать I2C_RDWR. Функции smbus имеют жестко запрограммированный размер. Не только в пользовательском драйвере i2c-dev, но и в функции ядра i2c_smbus_xfer(), которой передаются данные в виде файла union i2c_smbus_data.

Спецификация SMBUS ограничена 32 байтами. Так что, возможно, ваш мастер не поддерживает запись более 32 байтов за раз, если он предназначен только для поддержки SMBUS.

Что вам нужно сделать, так это посмотреть спецификации основного оборудования и посмотреть, может ли оно поддерживать> 32 байта. Если это так, вы можете расширить драйвер для поддержки общих сообщений I2C, а затем использовать I2C_RDRW.

Общий метод xfer I2C (algo->master_xfer() для I2C против algo->smbus_xfer()) используется только в том случае, если драйвер не имеет специального метода smbus для операции, поэтому вы можете добавить общую функцию xfer I2C в качестве запасного варианта для операций, которые еще не реализованы. . Общий метод xfer I2C не обязательно должен поддерживать все возможные транзакции I2C. Просто поддержите того, кто вам нужен.

person TrentP    schedule 27.12.2019