реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Linux, I2C, проблема считывания 32 бит за раз
Ya_Mike
сообщение Oct 17 2011, 09:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



Добрый день всем разработчикам,

Имеется ARM на плате с Linux 2.6.32 на нём, по I2C к нему подключен девайс, с регистра которого необходимо прочитать 32 бита данных. Проблема в том, что шина не поддерживает блочное чтение - поддерживаемый I2C функционал - 0x0EFE0009 (расшифровка - по /usr/include/linux/i2c.h). Бит I2C_FUNC_SMBUS_READ_BLOCK_DATA равен нулю, блоком считать не получается. Байт и два байта считываются успешно. Нужны оставшиеся два байта. Вообще с данной шиной столкнулся впервые, просьба подсказать, кто знает, как решить эту проблему чтения 32 бит с одного регистра устройства? Может есть какой-то обходной путь?
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 17 2011, 09:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Ya_Mike @ Oct 17 2011, 13:22) *
Байт и два байта считываются успешно. Нужны оставшиеся два байта.

Очевидный путь - считать 2 байта 2 раза подряд, потом слепить это в 32 бита.
Go to the top of the page
 
+Quote Post
Ya_Mike
сообщение Oct 17 2011, 10:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



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

Да, это вроде очевидный путь, но - все четыре байта лежат в одном регистре девайса (адрес - один). Одномоментно считываются первые два байта. Как считать оставшиеся два? При последующем чтении девайс отдаёт опять те же самые два байта, считанные до этого с этого регистра.

Сообщение отредактировал Ya_Mike - Oct 17 2011, 10:30
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 17 2011, 11:33
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



2 байта это ограничение аппаратного I2C или программное драйвера Linux? Что за контроллер и девайс используется?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Ya_Mike
сообщение Oct 17 2011, 11:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



Цитата(GDI @ Oct 17 2011, 15:33) *
2 байта это ограничение аппаратного I2C или программное драйвера Linux? Что за контроллер и девайс используется?

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

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

Сообщение отредактировал Ya_Mike - Oct 17 2011, 11:52
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 17 2011, 12:01
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Если ограничение чисто программное, то лучшим решением будет "допилить" драйвер, чтобы он поддерживал требуемый режим на данной плате. Как вариант, поискать в более поздних ядрах, может там это уже реализовано и , либо перейти на другое ядро, либо попытаться импортировать изменения в текущее.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Ya_Mike
сообщение Oct 17 2011, 12:11
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-05-10
Из: Ярославль
Пользователь №: 57 355



Цитата(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 не работает. Спасибо за советы!

Сообщение отредактировал Ya_Mike - Oct 17 2011, 12:10
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016