LINUX.ORG.RU
ФорумMobile

Задача с ядром и загрузкой модуля на Android №2


0

1

Всем привет!
Пытаюсь сделать модуль, который регистрировал бы I2C устройство на указанных выводах GPIO. Смысл этого в том, чтобы зарегистрировать устройство не при загрузке ядра, а чуть позже, что нужно в целях отладки. Если кто то знает менее извращенный вариант регистрации шины I2C на указанных GPIO выводах и регистрации на ней устройства, то буду очень рад.

Код: http://pastebin.com/NpeJH8qZ
Модуль компилируется, но не загружается, при загрузке ядро ругается:
[ 285.212207] lge_i2c_wm9093: Unknown symbol init_gpio_i2c_pin (err 0)
[ 285.212902] lge_i2c_wm9093: Unknown symbol i2c_register_board_info (err 0)
Тот же самый код, но не в виде модуля, а собранный с ядром, работает, свою работу выполняет.
Поддержка I2C и GPIO-based bitbanging I2C собраны с ядром, модулями не является.
ЧЯДНТ?

★★★★★
Ответ на: комментарий от Black_Shadow

А как узнать какого именно?

ls-h ★★★★★
() автор топика

>[ 285.212207] lge_i2c_wm9093: Unknown symbol init_gpio_i2c_pin (err 0)

[ 285.212902] lge_i2c_wm9093: Unknown symbol i2c_register_board_info (err 0)

Ну. в drivers/i2c/i2c-boardinfo.c символ i2c_register_board_info не экспортируется. Символ init_gpio_i2c_pin, видимо, тоже где-то не экспортируется - то есть, не доступен модулям. Можешь попробовать добавить EXPORT_SYMBOL(i2c_register_board_info). Можешь попробовать, и это, наверное, лучше - сделать модуль с управлением через debugfs,sysfs,ioctl, который бы выполнял нужные функции при записи в соответствующие псевдофайлы.

anonymous
()
Ответ на: комментарий от ls-h

>Спасибо! Что почитать по поводу второго варианта?

Исходники почитай. Прямо таки можно грепнуть по sysfs/debugfs

как-то так http://pastebin.com/kgz7vjEV . сконпеляй с CONFIG_DEBUG_FS, смонтируй -t debugfs куда-нибудь, и профит - управление через echo 42 > /debugfs/my_cool_dir/my_cool_thingie

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

Что то ядро не собирается после добавления EXPORT_SYMBOL:

ERROR: modpost: Found 2 section mismatch(es). To see full details build your kernel with: 'make CONFIG_DEBUG_SECTION_MISMATCH=y' To build the kernel despite the mismatches, build with: 'make CONFIG_NO_ERROR_ON_MISMATCH=y' (NOTE: This is not recommended) make[1]: *** [vmlinux.o] Ошибка 1 make: *** [vmlinux.o] Ошибка 2

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

оно какбэ намекае, что негоже без причины трогать грязными руками идеальный код линукса и следует таки сделать регистрацию своего устройства управляемой пользователем через sysfs/debugfs.

ну, на самом деле, там наверное какие-то атрибуты типа __devinit, __init или еще что прописано. все равно лучше не лезть туда, а то огребешь при попытке свой код куда-либо интегрировать или тупо обновить ядро

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

Сделал вызов кода по ссылке через запись в debugfs. Ядро собралось, но падает, при выполнении этого кода. Видимо «на лету» таким образом нельзя добавить i2c устройство. Кстати, в drivers/i2c/i2c-boardinfo.c написано что это не для динамической регистрации i2c, только для статической. Как это сделать динамически - не нашел. :(

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

Ну, в общем, в той же документации также написано, что можно делать

echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

Хотя падать оно не должно, если board_info регистрируется до регистрации самого i2c контроллера.

А, кстати. Если это действительно телефон lg, то почему там i2c-gpio? Так было в исходниках lg или просто лень портировать i2c драйвер на новое ядро?

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

>echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
Насколько я могу понять, это несколько не то. Тут шина уже есть, устройство тоже на шине есть, просто ему присваивается имя (или id).
А у меня нет ни шины, ни устройства.

А, кстати. Если это действительно телефон lg, то почему там i2c-gpio? Так было в исходниках lg или просто лень портировать i2c драйвер на новое ядро?

Так в исходниках. Этот кусок кода я написал по аналогии с тем что там уже было. Вообще он работает, если собрать с ядром, но модулем не работает.

Смысл всего этого такой:
Я пытаюсь управлять усилителем через i2c. Если шина i2c и устройство регистрируются при загрузке, вместе с остальными устройствами (кстати, могу выложить оригинальный исходник с моими правками, там добавляется несколько устройств, плюс вот этот самый усилитель), то работать с ним получается (i2c-tools его видят), но звуковая система не работает. Где-то происходит к нему обращение, но соответствующей шины в системе нет, возможно с ним работает firmware DSP или как-то так. Поэтому я и хотел попробовать добавить шину в разные моменты времени после загрузки, для чего мне и требуется сделать модуль.

Может быть есть и другой способ... Нашел на просторах интернета i2c-gpio-custom модуль, который позволяет при загрузке передать ему такие параметры как номер шины, номера gpio выводов, задержки и т.п., и добавляет новую шину. Скомпилировался, но не работает. Пишут что его надо запускать _до_ i2c-gpio, но нет возможности так сделать, т.к. i2c-gpio должен быть вкомпилирован в ядро, иначе с добавлением других шин и устройств получается облом и Android не грузится.

Вот такая незадача. :(

ls-h ★★★★★
() автор топика
Ответ на: комментарий от ls-h

>Насколько я могу понять, это несколько не то. Тут шина уже есть, устройство тоже на шине есть, просто ему присваивается имя (или id).

Ну так сделай platform_driver_register(&gpio_h2w_register) - будет шина. сможешь через sysfs рулить. А board_info не регистрируй.

Я пытаюсь управлять усилителем через i2c. Если шина i2c и устройство регистрируются при загрузке, вместе с остальными устройствами (кстати, могу выложить оригинальный исходник с моими правками, там добавляется несколько устройств, плюс вот этот самый усилитель), то работать с ним получается (i2c-tools его видят), но звуковая система не работает. Где-то происходит к нему обращение, но соответствующей шины в системе нет, возможно с ним работает firmware DSP или как-то так. Поэтому я и хотел попробовать добавить шину в разные моменты времени после загрузки, для чего мне и требуется сделать модуль.

Вероятно, действительно DSP (или BP). Если это lg thunder, то там же msm и аудио по rpc гоняется, а усилитель и все такое к BP или DSP подключено.

В общем, там в lg коде обрати внимание на всякие gpio_tlmm_config и сделай их, иначе gpio нельзя будет управлять, и i2c-gpio драйвер не будет работать

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

Да, это lg thunder. Спасибо, попробую покопаться.

ls-h ★★★★★
() автор топика
Ответ на: комментарий от anonymous

>В общем, там в lg коде обрати внимание на всякие gpio_tlmm_config и сделай их, иначе gpio нельзя будет управлять, и i2c-gpio драйвер не будет работать А какие нибудь доки на эту тему есть? По исходникам не очень понятно что именно мне надо? Сам как это откопал?

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