LINUX.ORG.RU

Написание драйвера I2C и сборка ядра.

 , ,


1

1

Всем доброго времени суток. Заранее прошу лаптями не кидаться, линукс впервые увидел 3 недели назад. Так по работе случилось, что нужно теперь писать на С под Дебианом 8.

Постараюсь вкратце описать проблемму, буду рад любому совету.

Есть удаленное устройство, к которому подключаюсь через SSH. Документации по устройству минимум. Как это устройство устроено - не понятно. Знаю только что стоит Дебиан 3.16.0. В устройстве есть I2C шина. По идее, на шине еще должны быть MUX'ы. Мне нужно протестить это устройство и выяснить всё ли там работает.

Для тестов я использую I2C-tools. И вот тут начинается самое интересное:

root@localhost:~# i2cdetect -l
i2c-0	smbus     	SMBus I801 adapter at 9000      	SMBus adapter
//получается видна только одна шина и никаких MUX'ов нет

root@localhost:~# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- 08 -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- 19 -- 1b -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2e -- 
30: -- 31 -- 33 -- -- -- -- -- -- -- -- -- -- 3e -- 
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- 53 -- -- -- 57 -- 59 -- -- -- -- -- -- 
60: -- 61 -- -- -- -- -- -- -- 69 -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --   
//и на этой шине сидят порты или устройства (я не знаю что именно).

Мне нужно каким-то магическим образом понять что есть на шине и правильно ли работает i2c драйвер (предположение о неработоспособности драйвера родилось из веры в то что должны быть видны еще и другие шины). Адреса устройств не совпадают с адресами в документации.

Если драйвер работает правильно - я буду очень рад, если нет - мне предстоит разбираться что там и как.



Последнее исправление: Klymedy (всего исправлений: 2)

Раз ты видишь какие-то цифры в середине таблицы вместо прочерков в результатах i2cdetect - значит драйвер порта I2C хорошо работает. Можешь работать с этими устройствами как-то так http://stackoverflow.com/questions/505023/reading-writing-from-using-i2c-on-l...

Или тебе надо именно драйвер? Но зачем? Чисто из эстетических соображений или есть серьезные причины?

используй www.linux.org.ru/help/lorcode.md для оформления кода, иначе всё плывёт и непонятно, тег code

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

MUXы могут требовать другой драйвер (не тот что для главной шины), и еще в ядре должна быть включена поддержка I2C_MUX

pftBest ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Спасибо!

Раз ты видишь какие-то цифры в середине таблицы вместо прочерков в результатах i2cdetect - значит драйвер порта I2C хорошо работает.

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

Или тебе надо именно драйвер? Но зачем? Чисто из эстетических соображений или есть серьезные причины?

Я очень надеюсь что всё работает и с драйвером всё ОК, потому что как править драйвер я понятия не имею пока)

ApiAri
() автор топика
Ответ на: комментарий от ApiAri

Откуда инфа что шин должно быть две? Есть какой-то пункт в доках на железяку?

Раз i2cdetect говорит в морг, значит в морг. Устройство видится одно. А сколько должно быть slave-ов? Вижу 15 - может их столько и должно быть?

Попробуй

zcat /proc/config.gz > my_config
на железке. Или просто покажи конфиг, с которым собирал. Включена ли поддержка I2C_MUX? Я честно говоря не знаю как работает i2c mux, может оно прозрачно для системы и ты просто видишь одно общее устройство.

Главное чтобы 15 слейвов было.

Конфиг сюда: http://paste.org.ru/

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

MUXы обычно видны просто как устройства на шине i2c-0. Если к ним прикрепить правильный модуль из ядра, то появятся новые шины i2c-1, i2c-2 и т.д. Некоторые муксы умеют протаскивать дочерние устройства как будто они сидят на i2c-0, с такими муксами можно работать напрямую, без драйвера в ядре. В любом случае нужно знать названия микросхем и читать даташиты, без этого никак, это не usb.

pftBest ★★★★
()
Ответ на: комментарий от pftBest

Некоторые муксы умеют протаскивать дочерние устройства как будто они сидят на i2c-0, с такими муксами можно работать напрямую, без драйвера в ядре

Интересная инфа, может у ТС-а такой случай как раз. Потому я его и спросил о числе нужных ему слейвов на шине, может 15 это всё что есть.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от pftBest

MUXы обычно видны просто как устройства на шине i2c-0. Если к ним прикрепить правильный модуль из ядра, то появятся новые шины i2c-1, i2c-2 и т.д.

А как этот модуль прикрепить? И где его взять? Извиняюсь за глупые вопросы, мне сейчас очень важна любая инфа, которая мне даст направление в какую сторону искать.

ApiAri
() автор топика
Ответ на: комментарий от I-Love-Microsoft

http://paste.org.ru/?nr2xoa

В файле с конфигами много строк, в буфер терминала не поместился, копировать с удаленного устройства нет доступа. Так что нашел в конфиге всё что содержит i2c. Надеюсь, этого достаточно.

ApiAri
() автор топика
Ответ на: комментарий от ApiAri

Некоторые муксы умеют протаскивать дочерние устройства как будто они сидят на i2c-0

Есть уверенность что это не так на этой плате? Если да, то на основании чего? Может это приводит к тому что никаких i2c-1 и т.д. появляться не должно. В конфиге вроде всё что надо включено.

Как можно протестировать всё ли в порядке в устройстве, если нет информации о том что быть должно? Так сколько должно видеться слейвов? К каким устройствам нет доступа, но известно что они должны быть? Трудно помочь, когда автор темы не может подсказать сколько устройств он хочет чтобы виделось... Может всё в полном порядке, на основании чего беспокойство.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от ApiAri

мне сейчас очень важна любая инфа

Что тебе нужно знать так это названия микросхем, без них ничего сделать нельзя.

Например: если ты знаешь что у тебя на шине висит гироскоп mpu6050 со встроенным MUXом, то идешь в исходники ядра и находишь что есть модуль INV_MPU6050_IIO для этой микросхемы, проверяешь что в твоем текущем ядре он включен, если нет пересобираешь ядро. Дальше качаешь даташит на микросхему и в нем находишь что у mpu6050 адрес 0x68. Дальше прикрепляешь модуль ядра к адресу на шине:

echo "mpu6050" 0x68 > /sys/bus/i2c/devices/i2c-0/new_device
Если инициализация прошла успешно то в системе появится акслелерометр, гироскоп и дополнительная i2c шина.

pftBest ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Есть опасение, что ядро сконфигурировано не правильно. В том то и весь сыр-бор, что инфы по железу минимум. Сейчас еще нахожусь на стадии сбора информации и возможных вариантов. Полного представления о функционировании Дебиана, к сожалению, пока получить не успел. Но благодаря просмотренному файлу конфинурации понял, что муксы таки есть:

CONFIG_I2C_MUX_PCA9541=y
CONFIG_I2C_MUX_PCA954x=y
Или я ошибаюсь?

P.S. Буду искать информацию о том, что должно быть на устройстве.

ApiAri
() автор топика
Ответ на: комментарий от ApiAri

Ценная инфа, спасибо!

Но я согласен с I-Love-Microsoft что тебе все это не нужно делать, скорее всего у тебя обычные MUXы которые работают и без модуля ядра. Что нужно так это узнать точное количество и наименования микросхем (устройств) на шине и читать даташиты на них. Только после этого можно лезть в ядро.

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от pftBest

Ого, не знал что для MPU есть даже драйвера в ядре :)

ТС-у: включи вообще все все все дрова для I2C устройств, вдруг число обнаруживаемых устройств станет больше...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Не станет, я же говорю это не USB и не PCI, тут никакого автоопределения нет. C I2C нужно работать как с ISA, смотришь какой адрес в железе, находишь модуль ядра, и вручную прикрепляешь одно к другому.

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)

Там еще разные способы адресации есть.

Rupricht ★★
()

Немного просветил для себя ситуацию. Устройство - свич. Муксы точно есть. Среди них PCA9541 и PCA954x. Модулей ядра для них нет.

И вообще как-то странно, модулей в ядре всего 3:

root@localhost:/bin# find /lib/modules/`uname -r` -name '*.ko'
/lib/modules/4.4.0-onl/kernel/crypto/echainiv.ko
/lib/modules/4.4.0-onl/kernel/drivers/mmc/card/mmc_test.ko
/lib/modules/4.4.0-onl/kernel/fs/nfs/flexfilelayout/nfs_layout_flexfiles.ko

Получается что все модули зашиты в ядро. А модуль для муксов я должен сам сбилдить и подгрузить.

ApiAri
() автор топика
Ответ на: комментарий от ApiAri

Ты же написал что:

CONFIG_I2C_MUX_PCA9541=y
CONFIG_I2C_MUX_PCA954x=y

=y означает что функционал вшит намертво в ядро, =m означает что это модуль. Раз у тебя =y значит твое ядро уже умеет PCA9541 и PCA954x и ничего компилировать не надо.

pftBest ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.