пятница, 20 февраля 2015 г.

Портирование ядра mtk

Портирование ядра

Узнать инфу об устройстве

Самый простой способ установить мою программу Device Info HW, в настройках включить адреса i2c, если есть root, то включить и его, требуется для дисплея и для полной ифнормациии для новых устройств с android 7.0+

Старый вариант:

а) Чтобы узнать для какого оборудования собрано ядро в mtk, можно посмотреть ProjectConfig.mk, расположенный в /system/data/misc/

б) На каких шинах i2c висят устройства /sys/bus/i2c/drivers

в) свой lcm, если в проекте несколько
cat /proc/cmdline

Сборка ядра

Скачиваем исходники:

git clone https://github.com/andr7e/acer_v370_kk

и компилятор gcc:
https://android-build.…toolchain-4.9-2014.04/
(архив tar.gz)

Распаковать в /home/user/kernel_build

cd исходники
./build_fly446.sh 

Структура исходников

/mediatek
custom/common/kernel - общие исходники (драйвера...)
custom/$project/kernel - для вашего устройства (cust'ы)
config/$project    ProjectConfig.mk

$project = fly89_iq446_wet_kk

custom/$project/kernel/dct/dct/codegen.dws
GPIO пины, клавиши

Адаптация

mtk 6589

Отладка

Ядро

adb shell
su
dmesg

cat /proc/kmsg

Android
adb logcat > logcat.log
Запускаем только после того, как обнаружилось устройство.

Дисплей

Добавляем LCM драйвер для вашего дисплея

common/kernel/lcm

Прописываем в
 
common/kernel/lcm/mt65xx_lcm_list.c 

В новых устройствах используется lk, и если название драйвера отличается от родного, загрузка не пойдет.

Клавиши

Смотрим лог dmesg при нажатии кнопки громкости "-" у нас так:
[0:swapper/0]kpd: (pressed) HW keycode = 10
[0:swapper/0]kpd: Linux keycode = 0

Нужно прописать правильное соответствие кодов.
Запускаем в wine DrvGen.exe, выбираем codegen.dws, на вкладке keypad settngs вводим в нужную ячейку.

Посмотреть, что получилось можно так: запускаем генерацию и смотрим в файле project_name/kernel/dct/cust_kpd.h

 /* HW keycode [0 ~ 71] -> Linux keycode */
 #define KPD_INIT_KEYMAP()      \
 {      \
       [1] = KEY_VOLUMEUP,             \
       [10] = KEY_VOLUMEDOWN,          \
 } 

KEY_VOLUMEUP прописано в ядре Linux

Дополнительный вариант:
<4>[ 297.333097] (0)[38:pmic_6325_threa]kpd: PMIC reset Key generate, pressed=0
<4>[ 297.333160] (0)[38:pmic_6325_threa]kpd: (released) HW keycode =115 using PMIC

Надо было прописать напротив Home key (в коде идет как KPD_PMIC_RSTKEY_MAP)

Тачскрин

GT9XX

В исходниках tpd_custom_gt9xx надо вписать конфиг, можно взять в /proc/gt9xx_config

Подсветка

проект/kernel/leds/mt65xx/cust_leds.c

В новых используется стандартный PWM, в более старых отдельный контроллер (Для него нужна cust ф-ция через GPIO)

Зарядка
 
bq24158 на mt6752 добавляем драйвер в power.

Датчики

Проверяем, чтобы i2c адрес соответствовал (одинаковый в пределах платформы)

Акселерометр
прописываем direction (отвечает за пересчет координат x, y, z)

Освещенности, приближения (alsps)
Шкала освещенности
Границы для датчика приближения

Камера

У меня получилось заставить работать основную камеры ov8830_raw + fm50af

Вот небольшая инструкция:

1) Добавляем поддержку в ядро
а) Вписываем в ProjectConfig.mk свои камеры

б) Включение камеры прописано в custom/your_project/camera/kd_camera_hw.c
Если вашей модели нет, берем из других исходников, желательно этой же платформы.

Подача питания, биты, GPIO.

Обычно достаточно стандартной инициализации для этой модели.

Если в логе видим id камеры, значит камеру завелась. (camera open id = 0x8830 (Для ov8830))

Затем прописываем автофокус (lens)

2) Сборка libcameracustom

Берем исходники из шапки - eastaeon89

Я просто добавил свои камеры в ProjectConfig.mk (оставить только свои, иначе может не работать)

Собираем

./mk проект dr libcameracustom

Проверяем, чтобы функции с вашей камерой были в libcameracustom.so (можно через nano)

3*

Если не получилось, поиском можно найти, где встречается дефолтная и сделать также для вашей (лучше по имени SENSOR_DRVNAME_OV8830_RAW)

Там мест 7 будет, но в большинстве уже есть поддержка:

kernel/imgsensor

hal/imgsensor

Для фронтальной ov9726_mipi_raw в eastaeon89 пришлось вписывать в sensorlist, в hal нашел только с mt6571 (в остальных не хватало файлов)

Либа собралась.

В kd_camera_hw.c взял от ov5647.



Фонарик, вспышка

constant_flashlight/led_strobe.c

GPIO_FLASH_LED_EN

Обычно достаточно прописать GPIO пин в codegen. Но бывают и по i2c, umpu.


flashlight hal

torchDuty - фонарик
afDuty      - автофокус
pfDuty      - вспышка
mfDuty     - manual

9 комментариев:

  1. Как-то всё достаточно "размыто" описано, сложно разобраться

    ОтветитьУдалить
  2. кто захочет - тот поймет, дано направление..

    ОтветитьУдалить
  3. На mt6757 не будет подобного направления?

    ОтветитьУдалить
  4. Пока не планируется. Есть запись для 5.1 mt6752, может добавлю для 6/7 про dts - это теперь основное. Пока с новыми не сталкивался.

    ОтветитьУдалить
  5. Есть исходники ядра на котором работает андроид 5.1.1 на mtk6589 как их портировать на fly iq446?

    ОтветитьУдалить
    Ответы
    1. Перенести проект fly из моих исходников, в исходники ядра под 5.1.1

      Удалить
  6. Ребят, есть Huawei Y5 II 2016, хочу сделать туда нормальное ядро, но codegen.dws из исходников открывается только в DrvGen внутри исходников ядра и содержимое его явно отличается от того, что может показать DrvGen от 4Fwolf. Скажите, лучше браться за новое ядро и прописывать там dts или всё таки мучиться с codegen?

    ОтветитьУдалить
    Ответы
    1. Родной бери DrvGen, вообще от версии android/ядра они могут отличаться. Стоит собрать стоковые, если они нормальные. В данном случае codegen, это же mt6582, c 3.18 там уже в большей степени dts.

      Удалить
  7. Есть ли исходники рабочего ядра под MTK Mt6589 на Android 5.1.1 и как портировать на ZTE Skate 2 (ZTE V967S)?

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