Мой дневник

18.05.2012

Android kernel или снова хвала опенсорцу

Filed under: компьютеры — sae762 @ 09:40

Не так давно была у нас дискуссия о смысле опенсорсного ядра на мобильных устройствах. Оппоненты говорили: “ну не будешь же ты его пересобирать!”. Однако ж вот оно, свершилось. Решил прикрутить к планшету GPS. Для начала по USB, что делается путем эмуляции на usb протокола rs232. Разумеется, в штатном ядре модулей (мне нужен был cp210x.ko) не было. А в исходниках – были. Пришлось собрать новое ядро и модули. Ядро я пока прошивать не стал, а модуль прижился, заработал, и вот пожалуйста – теперь мой планшет работает с моим старым gps-приемником !

Трудности сборки:

0. Конфиг от установленного ядра выковыривать так:
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images
– определить  что монтируется в boot (в моем случае mount не помог, выбрал навскидку устройство из /dev/block, угадал со второго раза)
– dd это устройство в файл boot.img  (=boot sector+kernel+ramdisk)
– разделить boot.img на составляющие (ссылка выше, split_bootimg.pl)
– извлечь из ядра конфиг (<kernel_src>/scripts/extract-ikconfig)

1. Поначалу модуль не хотел грузиться: “no symbol version for module_layout”  – нужно скомпилить не только модули, но и все ядро (make).

2. “disagrees about version of symbol module_layout” – не проходит проверку версия модуля, потому что он собран в другой конфигурации ядра. Штатное ядро собрано с проверкой версионности модулей (modversion). Значит, чтобы к нему собрать модуль, мне нужно иметь именно это ядро и именно эту конфигурацию. Пришлось найти исходники _именно_ моего ядра, что было довольно непросто. Но нашел: https://github.com/amery/linux-allwinner/tree/lichee-3.0.8-sun4i .

3. Модуль выдал что-то про unknown relocation. Это поставило меня в тупик. Даже гугль не очень помог. Но кое-какая зацепка была. Видимо, это из-за более свежей версии компилятора, которым собираю модуль. Сначала я использовал свежий android ndk, но потом перешел на Sourcery CodeBench Lite 2011.09-69 for ARM EABI (https://sourcery.mentor.com/sgpp/lite/arm/portal/release2032)… и я таки собрал работающий модуль !

Далее немного про настройку GPS, ведь такое подключение андроид не понимает:

Согласно http://4pda.ru/forum/index.php?showtopic=205544&view=findpost&p=7677235
su
insmod /system/vendor/modules/cp210x.ko (это мой модуль, заливать удобно adb push)
busybox stty -F /dev/ttyUSB0 9600   (38400 не пошло)
проверяю данные:

cat /dev/ttyUSB0 (видны NMEA-данные)

Затем немного отсюда: http://pccar.ru/showpost.php?s=1e5f6cfd6465a89bac31bbb5e3ab10d4&p=219051&postcount=896

– устанавливаем UsbGps4Droid.apk

– убеждаемся, что стоит в Настройках стоит Для разработчиков->Фиктивные местоположения

Вот после таких танцев с бубном я и получил работающий GPS.

Из минусов: требуется повторять busybox stty -F /dev/ttyUSB0 9600 при каждом подключении gps,  и insmod при каждой перезагрузке планшета, но можно прописать все в autostart.sh:

#!/system/bin/sh
insmod /system/vendor/modules/pl2303.ko
sleep 10
busybox stty -F /dev/ttyUSB0 ispeed 38400
sleep 5
busybox chmod 666 /dev/ttyUSB0

еще один минус – программки статуса gps не показывают спутники (но показывают координаты и погрешность)

Из плюсов: gps включен независимо от планшета, поэтому данные с него доступгы сразу при его подключении.

Думаю, можно еще поулучшать это дело, но в принципе уже неплохо. И таки да, опенсорц рулит !

По просьбе – готовые модули (пришлось добавить .pdf в имя):

pl2303.ko

cp210x.ko

11 Comments »

  1. Можешь свой скомпилированый модуль pl2303.ko выложить, у меня тоже Allwiner 10 sun4i 3.0.8
    Только для моего девайса сорцы закрыты, может твой подойдет.

    Comment by Kristoff — 23.06.2012 @ 15:16 | Reply

  2. Исходники ядра для allwinner A10 давно утекли в сеть, и лежат на https://github.com/amery/linux-allwinner 🙂
    Модули почтой отправить не удалось, выкладываю здесь

    Comment by sae762 — 25.06.2012 @ 09:44 | Reply

  3. Интересно, какой модуль нужен для чипа MT3329? Говорять очень чувствительный GPS, рассчитанный на местность городских застроек, на зоны где плохой прием GPS сигнала, и габариты маленькие 16х16мм. 6мм. , в любой планшет влезет.

    Comment by Kristoff — 26.06.2012 @ 01:15 | Reply

  4. Большая просьба скомпилить эти два модуля для MK802 для любой из прошивок.

    Comment by Roman — 15.11.2012 @ 10:31 | Reply

  5. Я тронут тем, что мой пост Вам интересен. Но, к сожалению, сейчас я не могу заниматься компиляцией под разные платформы. Планшет на ARM сломался физически, так что ставлю андроид на подвернувшийся по случаю планшет x86.

    В принципе, ничего сложного в сборке модулей нет. Вам нужно только определить версию Вашего ядра командой “uname -a”, затем найти ядро этой версии (не именно для вашего планшета, а вообще, хоть на kernel.org) и собрать его с нужными модулями. При этом может и не потребуется перешивать все ядро, достаточно будет только добавить свой модуль (конечно, если оно не выдаст “disagrees about version of symbol module_layout”). Можно даже положить его отдельно, в любое удобное место, и загружать его вручную командой “insmod /path/to/my/module.ko”. Небольшой подводный камень – нужно скомпилить ядро так, чтобы его название совпадало с названием ядра в планшете. Если не совпадает, система выдает сообщение, какое название должно быть, его и добивайтесь.

    Желаю удачи.

    Comment by sae762 — 15.11.2012 @ 14:32 | Reply

  6. Огромное спасибо! Что делать если я его подгружать буду insmod и оно выдаст “disagrees about version of symbol module_layout” ?

    Comment by Roman — 15.11.2012 @ 16:00 | Reply

    • Ядро собирается обычно целиком. Модуль можно скопировать отдельно. Если присутствует ошибка “disagrees about version of symbol module_layout”, то все становится сложнее: Вам потребуется собрать ядро именно в той конфигурации, что установлено на планшете (как описано ву статье). Либо полностью заменить ядро на Ваше новое.

      Comment by sae762 — 16.11.2012 @ 09:13 | Reply

  7. И еще вопрос как я могу собрать отдельно модули или необходимо собирать все ядро сначало когда я его найду в нете ?

    Comment by Roman — 15.11.2012 @ 16:07 | Reply

  8. Спасибо собрал отдельно модули взял cdc acm подгрузил без проблем. Устройство определилось и работает.

    Comment by Roman — 16.11.2012 @ 11:05 | Reply

  9. Доброго. Имею планшет на Android 4.0.4, с ядром 3.0.8+. Признаюсь в вопросах компиляции полный ноль, поэтому довольствуюсь поиском готовых решений с pl2303.ko. Пока безрезультатно, всегда получал типа:

    [ 1.484622] pl2303: disagrees about version of symbol module_layout

    Но вот вчера нашёл pl2303, gпосе установки которого в логе получил:

    [ 1.487279] pl2303: module_layout: kernel tainted.
    [ 1.487305] Disabling lock debugging due to kernel taint
    [ 1.487341] pl2303: version magic ‘3.0.8+ preempt mod_unload ARMv7 ‘ should be ‘3.0.8+ preempt mod_unload modversions ARMv7 ‘

    Могу выложить куда-нить этот самый pl2303.ko если согласится кто-нибудь помочь.
    Спасибо.

    Comment by DaleDale — 07.03.2013 @ 20:23 | Reply

  10. Можно пойти другим путем..
    http://pccar.ru/showthread.php?t=18871

    Comment by Rage2 — 27.03.2013 @ 15:58 | Reply


RSS feed for comments on this post. TrackBack URI

Leave a comment