пятница, 24 августа 2012 г.

Сборка недостающих модулей ядра для платформы Android

Давненько мне хотелось попробовать себя в сборке модулей ядра для моего телефона на базе Android. Вчера мне потребовался OpenVPN, но для его работы нужен модуль tun/tap, который отсутствует в моей прошивке. Поискав по маркету я нашел приложение TUN.ko Installer, которое позволяет установить модуль нужной вам версии, если такой есть в репозитории проекта. Но поскольку спать еще не хотелось, и простых решения я не искал, то было решено собрать модуль самостоятельно.

Для начала я посмотрел версию ядра, которая используется в моем телефоне.

$ adb shell uname -r
2.6.32.9-perf

Затем скачал из телефона конфигурацию текущего ядра.

$ adb pull /proc/config.gz u8500-config.gz
 157 KB/s (12577 bytes in 0.078s)

Дольше всего пришлось искать исходники нужного мне ядра. Если кому-то нужна ссылка на архив с исходниками, то вот она.

$ wget -q https://github.com/SaNek011/kernel_huawei_u8500/tarball/master -O SaNek011-kernel_huawei_u8500-0117a91.tar.gz

Теперь нужно установить toolchain для компиляции под кросскомпиляции под платформу ARM. Такой нашелся на одном из сайтов проекта Linaro. Скачиваем нужный toolchain

$ wget -q http://snapshots.linaro.org/android/~linaro-android/toolchain-4.7-2012.05/1/android-toolchain-eabi-linaro-4.7-2012.05-1-2012-05-18_15-49-28-linux-x86.tar.bz2

И устанавливаем его

$ tar xf android-toolchain-eabi-linaro-4.7-2012.05-1-2012-05-18_15-49-28-linux-x86.tar.bz2
$ export PATH=$PATH:/home/andrey/android-toolchain-eabi/bin

Для работы menuconfig я установил пакет libncurses5-dev.

$ sudo aptitude install -y libncurses5-dev

Далее готовим ядро к компиляции

$ tar xf SaNek011-kernel_huawei_u8500-0117a91.tar.gz
$ cd SaNek011-kernel_huawei_u8500-0117a91/
$ mkdir build
$ gzip -dc ~/u8500-config.gz > build/.config
$ make silentoldconfig prepare headers_install scripts ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf

На этом этапе важно правильно указать значение переменной KERNELRELEASE, иначе модуль не загрузится. После окончания подготовки я включил в menuconfig нужный мне модуль ("Device Drivers" / "Network device support" / <m>   "Universal TUN/TAP device driver support")

$ make menuconfig ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf

И собрал нужный мне модуль

$ make modules ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.32.9-perf

Собранный модуль находится в /home/andrey/SaNek011-kernel_huawei_u8500-0117a91/build/drivers/net/tun.ko. Загрузим его в телефон

$ adb push /home/andrey/SaNek011-kernel_huawei_u8500-0117a91/build/drivers/net/tun.ko /sdcard/

Затем, получив права root, установим модуль в /system/lib/modules

$ adb shell
adb$ su
adb# mount -o remount,rw -t yaffs2 /dev/block/mtdblock4 /system
adb# mkdir /system/lib/modules
adb# mv /sdcard/tun.ko /system/lib/modules
adb# chown 0 /system/lib/modules/tun.ko
adb# chgrp 0 /system/lib/modules/tun.ko
adb# chmod 644 /system/lib/modules/tun.ko
adb# mount -o remount,ro -t yaffs2 /dev/mtdblock4 /system

Теперь пробуем загрузить модуль

adb# insmod /system/lib/modules/tun.ko
adb$ lsmod | grep tun
tun 11051 0 - Live 0xbf000000
adb$ ls -l /dev/tun
crw-r----- vpn      vpn       10, 200 2012-08-24 11:16 tun

Теперь порядок - можно ставить OpenVPN.

21 комментарий:

  1. Спасибо. Но у меня мой модуль грузитса только через insmod ftdi_sio.ko После перезагрузки надо повторять ручной запуск модуля. Модуль в нужной папке с нужными правами: /system/lib/modules/ftdi_sio.ko , owner root, group root, 644. Как вылечить?

    ОтветитьУдалить
    Ответы
    1. http://www.xda-developers.com/android/change-your-ko-files-on-the-fly-with-module-loader/

      Удалить
  2. Чайниковский вопрос возник.
    Ubuntu 12.10 x64

    vitali@Ubuntu12:~/linux-2.6.35.7$ make modules ARCH=arm CROSS_COMPILE=arm-eabi- O=build KERNELRELEASE=2.6.35.7-perf
    make[1]: arm-eabi-gcc: Команда не найдена
    Using /home/vitali/linux-2.6.35.7 as source for kernel
    GEN /home/vitali/linux-2.6.35.7/build/Makefile
    CHK include/linux/version.h
    CHK include/generated/utsrelease.h
    make[2]: `include/generated/mach-types.h' не требует обновления.
    CC kernel/bounds.s
    /bin/sh: 1: arm-eabi-gcc: not found
    make[2]: *** [kernel/bounds.s] Ошибка 127
    make[1]: *** [prepare0] Ошибка 2
    make: *** [sub-make] Ошибка 2

    $ echo $PATH
    /home/vitali/android-toolchain-eabi/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

    Путь проверил. Даже поставил /home/vitali/android-toolchain-eabi/bin в начало
    arm-eabi-gcc на месте
    android-toolchain-eabi переустанавливал

    Помогите пожалуйста.



    ОтветитьУдалить
    Ответы
    1. Возможно у вас 32-битный тулчейн и он просто не запускается в 64-битной системе. Попробуйте запустить arm-eabi-gcc в терминале.

      Удалить
    2. Вы правы.
      Поставил Ubuntu 32-бит
      Заработало.

      Большое спасибо!
      Замечательная статья.

      Удалить
    3. Добрый день!

      Пытаюсь скомпилировать модуль для тачскрина FT5406 (FocalTech FT5406EE8). Я абсолютный новичок в этом деле.

      Имеются проблемы:
      - Нет хорошего исходника.
      - Вылезает куча разных ошибок (типа ISO90 запрещает смешивать данные с кодом и т.п.)

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

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

      PS
      Собственно у меня есть единственный рабочий модуль(нет исходника), который подошёл к моему планшету, но он не для моего разрешения. Надо 800x480, а есть для 480x320 -работает примерно только левая верхняя четверть тачскрина.

      Была мысль: скомпилировать несколько (путь нерабочих) модулей под разное разрешение, сравнить их. А потом по аналогии поправить готовый модуль в HEX-редакторе.

      Не получилось - с моим исходником генерятся одинаковые модули (нужен другой исходник).

      Удалить
    4. К сожалению опыта по правке модулей у меня нет.

      Удалить
  3. Подскажите пожалуйста, для компиляции модуля (только) подойдет любое ядро, например с kernel.org, при условии совпадении версии и наличии конфигурационного файла ядра?

    ОтветитьУдалить
    Ответы
    1. Почти наверняка не подойдет. У меня с ядром от kernel.org модуль собирался, но не грузился. Или грузился и вешал телефон.

      Удалить
  4. Не могли бы Вы мне подсказать, где следует поискать исходники DNS AirTab M975W (он же window n90fhd) :) ?

    ОтветитьУдалить
    Ответы
    1. Не подскажу, я андроидом не занимаюсь. Попробуйте спросить на профильных форумах: 4pda.ru, xda-developers.com, etc

      Удалить
  5. Может подскажете, а у вас на телефоне лежит конфиг ядра? Я так и не нашёл его.

    ОтветитьУдалить
    Ответы
    1. Зависит от опций сборки ядра. Мне повезло и у меня конфиг был.

      Удалить
    2. Ни прибавить, ни убавить. Сразу виден талантище! Еще и статейки в инетет пишет...

      Удалить
  6. Здравствуйте!

    я ищу возможность использовать большой сенсорный экран (Touch Monitor) с телевизионной приставкой, которая работает под андроидом 5.1
    Купил Tronsmart Vega S95 с надеждой, что если аппарат малость фирменный то и поддержка сенсорного экрана будет. Испробовал с ним 2 монитора (Iiyama Pro­Li­te T2435MSC-B1 и HP S230tm) но компьютер не реагирует на сенсорный экран.
    На YouTube я видел несколько фильмов с демонстрацией работы всяких андроидных приставок с сенсорными экранами. То есть в принципе проблема решаема.
    Представитель фирмы Iiyama мне сообщил, что ихним мониторам нужен стандартный драйвер "HID Touch".
    Мой вопрос: как проверить в Андроиде, есть ли в нём драйвер "HID Touch" и если нет его, то как его добавить?

    ОтветитьУдалить
    Ответы
    1. Для начала я бы подключил такой монитор к linux и посмотрел заработает или нет. Если работает, то смотреть какие модули использованы. В jessie на предмет hid touch есть только это:

      $ find /lib/modules/`uname -r`/ -name '*hid*touch*'
      /lib/modules/3.16.0-4-686-pae/kernel/drivers/hid/hid-keytouch.ko
      /lib/modules/3.16.0-4-686-pae/kernel/drivers/hid/hid-multitouch.ko

      Чтобы собрать модуль ядра в android нужно иметь исходники именно того ядра, которое использует android и его конфиг. Стоит сходить на xda-developers.com или на forum.4pda.ru - возможно там помогут.

      Удалить
  7. Несколько попутный вопрос. Будет ли работать собранный модуль, точнее комплект модулей, которые собираются вместе с ядром, если я закину ядро, то есть подменю в ядре bzImage, прошью его, а потом путём закину модули на флешку и при помощи rootexplorer перетащу их с заменой на старые? У меня например на работают так. Причина того, что так не делается или возможная причина сборки ядра и модулей на x64 ubuntu, соответственно и компилятор был использован мз системы родной, а платформа аппарата на котором всё это должно работать х86. Процессор intel. ?

    ОтветитьУдалить
    Ответы
    1. По вашему описанию мне не ясно ни загрузилось ли новое ядро, ни какую ошибку выдает при попытке загрузить модули.

      Удалить
    2. Новое ядро загрузилось и работает. При попытке установить модуль любой выдавал это: required key not available
      Решил эту проблему путём изменения конфигурации в конфиге девайса и в головном makefile. Изменил CONFIG_MODULE_SIG_ALL на CONFIG_MODULE_SIG, а остальным проверкам, CONFIG_MODULE_SIG_FORCE и алгоритмам SHA-512 поставил is not set. Это решило проблему подписей раз и на всегда. Но осталась другая проблема. Драйвер гироскопа не работает. Да я даже и не знаю, куда его ставить и откуда брать. Предполагаю, что он основан на микросхеме mpu3050, но как собрать теперь не пойму. Кстати мне устанавливать даже не пришлось все модули от стокового ядра, они сами встали. Подкидывать новособранные не пришлось. Собирал ядро из исходников с офсайта производителя. Может кому пригодится, как решить проблему с ответом required key not available. Правда это касается лишь для пересобранного ядра. В остальных случаях нужно сначала стирать подпись модуля из ядра.
      Andrey Tataranovich, не знаете, что можно придумать с гироскопом. Я просто не догадываюсь даже откуда начать копать. В интернете не нашёл ответа по этому вопросу.

      Удалить
    3. Относительно модуля для гироскопа - нужно спрашивать на профильных форумах вроде xda-developers.com, 4pda.ru/forum/ и т.д. Там есть шанс найти человека, который знает ответ на ваш вопрос.

      Удалить
  8. Тут автор прописал как установить тулчейн.Надо будет использовать такой способ.Я вот использовал способ взятый с сайта linux-sunxi.org у меня проц allwinner a10.Я устанавливал так export PATH="$PATH":/путь к тулчейну-/home/android/linaro/gcc-linaro-4.7-2014.06/arm-linux-gnueabihf-*_linux/bin .

    ОтветитьУдалить