Не так давно была у нас дискуссия о смысле опенсорсного ядра на мобильных устройствах. Оппоненты говорили: “ну не будешь же ты его пересобирать!”. Однако ж вот оно, свершилось. Решил прикрутить к планшету 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 выложить, у меня тоже Allwiner 10 sun4i 3.0.8
Только для моего девайса сорцы закрыты, может твой подойдет.
Comment by Kristoff — 23.06.2012 @ 15:16 |
Исходники ядра для allwinner A10 давно утекли в сеть, и лежат на https://github.com/amery/linux-allwinner 🙂
Модули почтой отправить не удалось, выкладываю здесь
Comment by sae762 — 25.06.2012 @ 09:44 |
Интересно, какой модуль нужен для чипа MT3329? Говорять очень чувствительный GPS, рассчитанный на местность городских застроек, на зоны где плохой прием GPS сигнала, и габариты маленькие 16х16мм. 6мм. , в любой планшет влезет.
Comment by Kristoff — 26.06.2012 @ 01:15 |
Большая просьба скомпилить эти два модуля для MK802 для любой из прошивок.
Comment by Roman — 15.11.2012 @ 10:31 |
Я тронут тем, что мой пост Вам интересен. Но, к сожалению, сейчас я не могу заниматься компиляцией под разные платформы. Планшет на 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 |
Огромное спасибо! Что делать если я его подгружать буду insmod и оно выдаст “disagrees about version of symbol module_layout” ?
Comment by Roman — 15.11.2012 @ 16:00 |
Ядро собирается обычно целиком. Модуль можно скопировать отдельно. Если присутствует ошибка “disagrees about version of symbol module_layout”, то все становится сложнее: Вам потребуется собрать ядро именно в той конфигурации, что установлено на планшете (как описано ву статье). Либо полностью заменить ядро на Ваше новое.
Comment by sae762 — 16.11.2012 @ 09:13 |
И еще вопрос как я могу собрать отдельно модули или необходимо собирать все ядро сначало когда я его найду в нете ?
Comment by Roman — 15.11.2012 @ 16:07 |
Спасибо собрал отдельно модули взял cdc acm подгрузил без проблем. Устройство определилось и работает.
Comment by Roman — 16.11.2012 @ 11:05 |
Доброго. Имею планшет на 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 |
Можно пойти другим путем..
http://pccar.ru/showthread.php?t=18871
Comment by Rage2 — 27.03.2013 @ 15:58 |