Портіруем android ics 4

Портіруем android ics 4

Android ICS 4.0.3 від Texas Instruments на процесорному модулі SomIQ-AM37

В даному дистрибутиві присутні вихідні для 3-х платформ:

Нас цікавлять тільки підтримка Beagleboard і пізніше AM37EVM, щоб додати WLAN.

Які цілі ставимо:
1) Android запускається і виводить графіку на HDMI монітор
2) Миша працює
3) Мережа Ethernet працює
4) Працюють утиліти, бенчмарки з збірки

Крок 1. Портіруем ядро ​​Linux

Далі описаний досить загальний процес адаптації ядра Linux від однієї платформи для подібної іншої платформи, тому правила, викладені тут, можуть бути застосовні не тільки до Android ICS і SomIQ-AM37, а й іншим платформам.

Ядро Linux являє собою збірку різних системних утиліт як планувальник завдань, управління пам'яттю, файлова система і т.п. Ці частини є загальними для всіх платформ і не вимагають (зазвичай) доробок для окремої платформи, тому що є апаратно незалежними. Що є апаратно залежним в Linux:

  • початкова ініціалізація апаратури
  • набір драйверів

Початкова ініціалізація платформи виконується в файлі (ми розглядаємо тільки ARM архітектуру, процесори TI Cortex-A8) / arch / arm / mach-omap2 / board-<название платформы>.c. Наприклад, для Beagleboard ініціалізація виконується в файлі «arch / arm / mach-omap2 / board-omap3beagle.c». Так як схема SomIQ-AM37 заснована на схемі Beagleboard, тому ми візьмемо за основу BSP (board support package) для Beagleboard.

Крок 1.1 Додамо архітектуру SOMIQ_AM37 в ядро ​​Linux

Крок 1.2 Додамо файл board- в ядро

Наступним кроком ми скопіюємо файл початкової ініціалізації Beagleboard в новий і виправимо його. У директорії «arch / arm / mach-omap2» скопіюємо файл board-omap3beagle.c в board-somiq_am37.c

Тепер додамо новий файл в Makefile. Відкрийте Makefile в тій же директорії «arch / arm / mach-omap2» і знайдіть рядки, які стосуються BEAGLE:

Копіюємо ці рядки і замінюємо в копії CONFIG_MACH_OMAP3_BEAGLE на CONFIG_MACH_SOMIQ_AM37, також замініть назву board-файлу:

Також в цьому Makefile файлі присутній включення файлу для підтримки камер, але нам поки це не потрібно.

Тепер потрібно додати архітектуру SOMIQ_AM37 в файл конфігурації Kconfig. Відкрийте файл Kconfig в директорії «arch / arm / mach-omap2» і знайдіть секцію, яка відноситься до BEAGLE:

Скопіюйте ці рядки і замініть MACH_OMAP3_BEAGLE на MACH_SOMIQ_AM37, а OMAP_PACKAGE_CBB на OMAP_PACKAGE_CUS. Остання заміна необхідна, тому що на Beagleboard використовують процесор в корпусі CBB, а на SomIQ-AM37 використовують процесори в корпусі CUS. Ця установка потрібна, щоб коректно налаштовувати PIN MUX в ядрі. PIN MUX це вибір однієї з семи функцій належить кожному висновку процесора. У підсумку ви додасте такі рядки в файл:

1.3 Редагування board-файлу

Спочатку йде блок включень файлів заголовків:

Потім йде шматок коду, який відповідає за підключення пристрою по USB (тут ми нічого змінювати не будемо):

Потім починається код, що відноситься до платформи Beagleboard:

Оскільки Beagleboard еволюціонірует протягом декількох років, то схема змінювалася неодноразово, змінювалися процесори, пам'ять, розташування ліній GPIO і т.п. Щоб мати одне ядро, яке буде керувати всіма цими конфігураціями розробники Beagleboard відвели 3 лінії процесора, якими вони задають ревізію плати. Тому перш за все BSP Beagleboard визначає на яку плату він працює. Модуль SomIQ-AM37 виконується в одній конфігурації (поки) і тому визначення ревізій плати не потрібно. Тому видаляємо наступний код:

Далі йде опис розділів на флеш NAND, якщо вона присутня на платі (залишаємо без змін):

Потім починається безпосередньо код, що відноситься до різних периферійних пристроїв на платі. Тут додають функції роботи з DSS контролером процесора, який відповідає за виведення графіки на кінцеве пристрій. Beagleboard безпосередньо може працювати тільки з телевізором через S-Video або HDMI / DVI дисплеєм, тому для них все і налаштовують:

  • функції beagle_enable_dvi / beagle_disable_dvi - відповідно включають і вимикають монітор (управляють GPIO лінією процесора, яка підключена до мікросхеми TFP410, вхідний сигнал Power-Down. Тобто переклад мікросхеми в режим Power Down відключає висновок на монітор;
  • створюють об'єкти структури omap_dss_device і описують фізичні пристрої: beagle_tv_device (ТВ) і beagle_dvi_device (DVI монітор);
  • прив'язують регулятори напруги до виходів ТВ і DVI: beagle_vdac_supply і beagle_vdvi_supply. Це потрібно, щоб по можливості знизити споживання енергії та вимикати відповідний регулятор, якщо він не використовується;
  • функція beagle_display_init () отримує доступ до лінії GPIO для включення / вимикання дисплея DVI. Номер GPIO зберігають в поле структури beagle_dvi_device.reset_gpio

З DSS закінчили і налаштовуємо MMC карту, вона ж SD:

Зверніть увагу, що у створеній структурі присутній поле gpio_wp (Write Protect від карти SD), але на несучої платі Somiqboard встановлений слот карти MicroSD, у якого немає лінії Write Protect. Тому замість присвоєння номера GPIO лінії 29 запишемо '-EINVAL', повідомивши тим самим драйверу MMC, що у нас такий сигнал відсутній. Також можна видалити прапор MMC_CAP_8_BIT_DATA, тому що карта у нас 4-х бітна. Після виправлень:

Тепер прив'язують фізичні регулятори напруги до драйверів:

beagle_vmmc1_supply залишаємо, а beagle_vsim_supply, beagle_vaux3_supply, beagle_vaux4_supply сміливо видаляємо, тому що VSIM, VAUX3, VAUX4 є тільки у контролера харчування TPS65950, а на використовуваному нами TPS65920 вони фізично відсутні. Однак ці визначення регуляторів можна і залишити, тому що вони в роботі заважати не будуть, але і користі від них немає.

Тепер налаштовуємо GPIO, які прив'язані до чіпу харчування TPS65920 (він має ряд функцій крім харчування). У функції beagle_twl_gpio_setup () видаляємо такі рядки:

У цьому фрагменті налаштовують лінію Write Protect, яку ми не використовуємо

Видаляємо згадка регулятора VSIM, тому що його у нас фізично немає:

Далі видаляємо управління ключем харчування USB, тому що на Somiqboard його немає:

Також видаляємо з тієї ж причини:

Тепер в цій функції призначають лінію управління вимиканням TFP410, хоча ця лінія прив'язана до процесора, а не TPS65920:

Збережемо спадкоємність, але призначимо іншу лінію (на зв'язці Somiqboard + SomIQ-AM37 це лінія GPIO_10) і інше видаляємо, залишаючи:

Повністю видаляємо наступний блок:

Ми залишаємо рядки управління світлодіодом на модулі SomIQ-AM37, зазначений як RDY. Його включає u-boot і він гасне, коли завантажиться ядро.

Наступний блок видаляємо повністю:

З функцією beagle_twl_gpio_setup закінчили і далі структуру beagle_gpio_data залишаємо без змін.

Тепер йде настройка регуляторів напруги і прив'язка їх до конкретних пристроїв:

  • beagle_vmmc1 - залишаємо без змін
  • beagle_vsim - видаляємо всю структуру, тому що у нас немає регулятора
  • beagle_vdac - залишаємо без змін
  • beagle_vpll2 - залишаємо без змін
  • beagle_vaux3 - видаляємо
  • beagle_vaux4 - видаляємо

Тепер налаштовують звуковий кодек в TPS65950, але на SomIQ-AM37 варто TPS65920, у якого немає звукового кодека, тому видаляємо:

І нарешті, в структурі яка описує TPS65920 (TWL) видаляємо рядки, що ми вже видалили раніше і отримаємо:

Далі структури beagle_i2c_boardinfo, beagle_i2c_eeprom і функцію omap3_beagle_i2c_init залишимо без змін. У структурі gpio_leds видалимо рядки, що описують світлодіоди usr0 і usr1, тому що з немає на Somiqboard.

Далі йде призначення лінії GPIO, до якої підключена кнопка USER на Beagleboard і Somiqboard - залишаємо без змін:

Переходимо до функції omap3_beagle_init_irq () і видаляємо входження omap3_beagle_version, отримаємо:

У цій структурі для Beagleboard призначають лінію GPIO_147 щоб скинути (reset) USB PHY. На модулі SomIQ-AM37 для цього використовують лінію 186, тому виправимо 147 на 186.

Тепер переходимо до головної функції, яку викликає ядро ​​при ініціалізації плати: omap3_beagle_init (). Видаляємо виклик функції omap3_beagle_init_rev () - вона визначає яка ревізія плати Beagleboard. Потім замінюємо цифри 170 на 10, тому що саме лінія 10 управляє включенням TFP410 (HDMI):

Тепер треба змінити Machine ID в цьому файлі, щоб викликалися функції саме з цього файлу, коли буде передача управління від u-boot. Подивіться на самий останній блок у файлі:

У макросі MACHINE_START вказано ідентифікатор Machine ID - OMAP3_BEAGLE і текстовий рядок, який друкується ядром при завантаженні. Замінимо їх на наступну:

На даному етапі ми практично повністю завершили роботу над створенням свого BSP для модуля SomIQ-AM37. Однак у нас залишилася нереалізована функція мережі Ethernet. На модулі SomIQ-AM37 встановлений Ethernet контролер Micrel KSZ8851SNLI, підключений до SPI1 процесора. Тому треба додати наступні рядки до виклику функції omap3_beagle_init ():

Також потрібно включити файл заголовків irq.h, щоб можна було працювати з перериваннями. Додайте наступний рядок на початку файлі, де йдуть всі включення «#include. »

Тепер потрібно додати ініціалізацію Ethernet контролера в функцію omap3_beagle_init (). Додайте виклик somiq_ks8851_init () перед рядком beagle_display_init ():

Ну, і нарешті можна виправити слова «beagle» на «somiq», щоб надалі не плутатися.

Крок 1.4 Створення файлу конфігурації

Фінальним кроком буде створення файлу конфігурації. Для цього скористаємося готової конфігурацією для Beagleboard і виправимо її. У корені початкових кодів ядра виконайте команду:

З'явився файл .config в якому міститься вся конфігурація ядра. Руками цей файл не правлять, а потрібно виконати команду:

З'явиться ціле структуроване меню, що містить конфігурацію ядра. Заходимо в System Type-> TI OMAP 2/3/4 Specific Features-> і пропуском прибираємо зірочку навпроти Beagleboard і навпаки додаємо зірочку навпроти SomIQ-AM37. Далі по меню піднімаємося вище до кореня і вибираємо Device Drivers-> Network device support-> Ethernet (10 or 100Mbit). Тут відзначаємо пункт «Micrel KS8851 SPI» зірочкою.

Усе. Тепер натискаємо EXIT кілька разів, поки не виникне питання «Чи збереже зміни в конфігурації?» - вибираємо YES. Тепер можна скомпілювати ядро.

Схожі статті