Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linux, I2C, проблема считывания 32 бит за раз
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ya_Mike
Добрый день всем разработчикам,

Имеется ARM на плате с Linux 2.6.32 на нём, по I2C к нему подключен девайс, с регистра которого необходимо прочитать 32 бита данных. Проблема в том, что шина не поддерживает блочное чтение - поддерживаемый I2C функционал - 0x0EFE0009 (расшифровка - по /usr/include/linux/i2c.h). Бит I2C_FUNC_SMBUS_READ_BLOCK_DATA равен нулю, блоком считать не получается. Байт и два байта считываются успешно. Нужны оставшиеся два байта. Вообще с данной шиной столкнулся впервые, просьба подсказать, кто знает, как решить эту проблему чтения 32 бит с одного регистра устройства? Может есть какой-то обходной путь?
scifi
Цитата(Ya_Mike @ Oct 17 2011, 13:22) *
Байт и два байта считываются успешно. Нужны оставшиеся два байта.

Очевидный путь - считать 2 байта 2 раза подряд, потом слепить это в 32 бита.
Ya_Mike
Цитата(scifi @ Oct 17 2011, 13:30) *
Очевидный путь - считать 2 байта 2 раза подряд, потом слепить это в 32 бита.

Да, это вроде очевидный путь, но - все четыре байта лежат в одном регистре девайса (адрес - один). Одномоментно считываются первые два байта. Как считать оставшиеся два? При последующем чтении девайс отдаёт опять те же самые два байта, считанные до этого с этого регистра.
GDI
2 байта это ограничение аппаратного I2C или программное драйвера Linux? Что за контроллер и девайс используется?
Ya_Mike
Цитата(GDI @ Oct 17 2011, 15:33) *
2 байта это ограничение аппаратного I2C или программное драйвера Linux? Что за контроллер и девайс используется?

Ограничение чисто программное - ядро 2.6.32 не поддерживает "блочный" режим (особенность именно для данной платы); железо - плата blueshark с OMAP 3530.
Вроде бы нашёл решение - использование транзакции типа I2C_SMBUS_I2C_BLOCK_BROKEN (из i2c.h). По крайней в этом режиме считываются 4-байтовые значения и не происходит крэш. Правда, на счёт полной корректности пока не уверен... Кто-нибудь может подтвердить правильность такого подхода?

Исправил: уточнил про ядро.
GDI
Если ограничение чисто программное, то лучшим решением будет "допилить" драйвер, чтобы он поддерживал требуемый режим на данной плате. Как вариант, поискать в более поздних ядрах, может там это уже реализовано и , либо перейти на другое ядро, либо попытаться импортировать изменения в текущее.
Ya_Mike
Цитата(Ya_Mike @ Oct 17 2011, 15:51) *
Ограничение чисто программное - ядро 2.6.32 не поддерживает "блочный" режим (особенность именно для данной платы); железо - плата blueshark с OMAP 3530.
Вроде бы нашёл решение - использование транзакции типа I2C_SMBUS_I2C_BLOCK_BROKEN (из i2c.h). По крайней в этом режиме считываются 4-байтовые значения и не происходит крэш. Правда, на счёт полной корректности пока не уверен... Кто-нибудь может подтвердить правильность такого подхода?

Исправил: уточнил про ядро.


Есть еще I2C_SMBUS_I2C_BLOCK_DATA. Погуглил, похоже это именно то, что мне надо, к тому же работает, как надо. Спасибо за наводящие вопросы и подсказки, сорри за потраченное время. Тему можно закрывать.

Цитата(GDI @ Oct 17 2011, 16:01) *
Если ограничение чисто программное, то лучшим решением будет "допилить" драйвер, чтобы он поддерживал требуемый режим на данной плате. Как вариант, поискать в более поздних ядрах, может там это уже реализовано и , либо перейти на другое ядро, либо попытаться импортировать изменения в текущее.

Да, хотел уже братьс за драйвер, но никак не мог поверить, что такая простая вещь, как I2C не работает. Спасибо за советы!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.