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. Тепер можна скомпілювати ядро.