Pandaboard

written on Saturday, January 5, 2013

Мене знайшла чергова робота, цього разу пов'язана з вбудованими лінуксами. Видали казенний пандаборд та ще мішок обладнання — пару днів сидів і сетапив це барахло.

Традиційно сетапив без консолі, тому POEL і засетапився.

Залізо

По функціоналу залізка радує і чимось нагадує тримслайс, теоретично може юзатися замість десктопа — Ethernet, HDMI вихід, USB хост для клавіатури та флешок, вбудований Wi-Fi і все таке. Ну і консоль стирчить звісно ж, для якої у мене немає кабелю і адаптера теж немає, хоча я думав, що є. На відміну від тримслайса, тут є вихід для звуку, значить можна цю штуку юзати як базу для музичної коробочки з якимось людським аналогом mpd. Звісно ж є апаратний декодер відео і всякі модняві OpenGL ES.

А тепер починається угар і треш, бо це ж непорядок, коли у людей все добре! Сюрприз перший — у залізки немає системного флешу, куди можна насетапити свої убунти і срачлінупсарми. Зовсім немає. Тому систему ставимо на SD-картку, яка звісно ж повільна і яка вставляється в SD-слот, який один. Ой. В певному сенсі це звісно добре — запоротий рут можна підключити до великої машини і там починити, благо що все крім макоеб вміють EXT4.

Для забавників з паяльником є опція: поставити на якісь дві ноги резистор на хрінадцять кілоом і система буде бутитися з USB. Точніше з USB буде бутитися ядро і інітрд, а куди ми систему засунемо — це в командлайні ядра написано і ніякий резистор-зв'язистор нам не указ.

Сюрприз номер два: RTC немає тож, бо немає батарейки на платі. Вийняв питалово, включив назад — все, бігом в інтернети за священним вогнем мирного атома в часах точного часу. Я не схвалюю такі архітектурні рішення.

Софт

Ну ви ж поняли, да? Ну таки да, софт тут зовсім да. Система не виглядає як тихоокеанський атол після випробування ядерної бомби, як це було на моторолах, але все одно напряг є. Якщо прослідковувати по тих пристроях, до яких я дотягувався за останні, скільки ж їх було, років, то ситуація стабільно покращується. Такими темпами всі кривомуди, на кшталт мотороли, нарешті здохнуть і інтеграція лінупса буде робитися вже зовсім руками.

Можна взяти звичайно-дерев'яний арчлінуксарм, розбити карту пам'яті на два розділи — ядро і initrd на першому і рутфс на другому. Ядро, initrd і командлайн пакуються стандартним убутовським утилітом, який є в дистрибутиві, а не мутними скриптами на перлі. Взагалі на диво мало магії.

Ядро ставиться відносно свіже — після апдейту приїжджає 3.6 прямо з репозиторію зі всякими омапо-патчами.

Wi-Fi

Вайфай — це така технологія, для якої характерно вилітати нахер і не працювати на всіх апаратних і програмних платформах. Жодної системи, де б вайфай не вішався і не вилітав, я ще не бачив. В тому тарболі, який роздають на archlinuxarm.org, вайфай типу як є, але реально не працює. Інтерфейс є, сканує нормально, але при підключенні — різноманітні вилітання, від таймаутів і срачу в логах до уходу вайфайного чіпа в паніку з подальшим срачем в логах. Після апдейту до 3.6 воно чиниться, але це якось підло, ящитаю.

Консоль

Все було б взагалі прекрасно, якби у мене була консоль. Ну або хоча б монітор з клавіатурою, але я же бомж-турист на піратському острові, звідки у мене. Спеціально для таких лохів в лінуксі є мережевий інтерфейс поверх USB з'єднання. З rc.local прогрузив g_ether на залізці, IP проставив і все — можна ходити по ssh. Це звісно у нормальних людей з пристойного суспільства, де є ssh і стандартні паролі.

Убунту же роблять дивні пацани, тому там ssh по дефолту не піднятий і взагалі не встановлений. І сама система бутиться в oem-config, щоб в неї тикати пальчиком.

Хардварні кодеки

Щоб заюзати хардварні кодеки, треба накатити апдейти з окремого репозиторію з омапо-специфічними пакетами. Я взагалі очікував побачити OMX, навіть нагуглив якусь хуйню, але OMX — мертва технологія, тому посани просто написали плагін для gst. GST — це звісно ще той розсадник добра, місяця і справедливості, але його юзають живі проекти і там все робоче.

З хардварними кодеками не все так просто, як хотілося б. Крім плагіна для гстрімера, відбувається купа всякої іншої порнографії. Почати треба з того, що сам гстрімер теж патчений, наскільки я поняв, на предмет шарінга буферів між компонентами. І пакет з бейз-плагінами теж патчений.

Сам плагін (gst-ducati) залежить від ліби libdce (distributed codecs engine), яка залежить від якогось плагіна до libdrm. При чому тут libdrm я не зовсім уловив, але мабуть це зручний спосіб працювати з замапленими чортікуди буферами, причому працювати як через ікси, так і мимо них. Для збірки якихось кусків з цього набору, звісно ж, потрібні ядерні хедери. Від усього цього на ланчпаді є сорси і пакетовані під убунту бінарники.

Крім юзерспейсового плагіна звісно ж є ядерна частина і там теж не все так просто, як хотілося б. В ядрі є модуль omapdrm, який поки що живе в staging каталозі, що натякає. В арчлінуксовому бінарнику ядра він вимкнений в конфізі. Крім цього модуля ще є omapdrm_pvr, тобто специфічний для відеокарти PowerVR SGX. Сама відеокарта мене не цікавить зовсім, але drm потрібен. У цього модуля якийсь дуже стрімний пакет з укуреними мейкфайлами, які чомусь викликають dos2unix і займаються іншими сумнівними речами, і який чомусь пакетується через DKMS, а не нормально. Наскільки я догадуюся, там бінарні блоби в помірній кількості.

На модулі omapdrm_pvr народна творчість не закінчується. Я навіть трохи сумніваюся, чи потрібен він для роботи кодеків, але перевірити поки не вийшло. Спілкування з сопроцесором (ipu) йде через ще rmsg, якого в офіційному дереві ядра ще немає, а в арчлінуксове він у вигляді патча не утащений. По деяких ознаках я догадуюся, що remotemsg — це такий generic механізм, який використовується не тільки омаповським драйвером, а ще й механізмом virtio для спілкування паравіртуалізованих драйверів з хостовим ядром. Це трохи несподівано, але вобщемто логічно. Треба перевірити, наскільки правильно я догадався. Самі модулі не грузяться автоматично, тому для них в /etc/init кладеться спеціальний таск, з циклом modprobe.

Але на цьому знову ж не все. Ці ядерні драйвера ще й чекають якогось особливого пинка від udev. Що найсмішніше, в самій убунті цей пинок приходить тільки в разі загрузки з initrd. Без initrd ці драйвера чомусь не дожидаються підключення до них удева і ругаються на таймаут. Хардварне укорення при цьому відвалюється з достатньо мутним повідомленням від юзерспейсового libdrm.

Коли хардварні кодеки працюють, вони працюють вельми ок. High profile декодить тільки в путь, а енкодер встигає фігачити майже в риалтаймі, коли софтовий не встигає взагалі ніяк.

Todo

Пост про g_serial, g_ether. Пост з конкретикою про кодеки (логи помилок, заміри цифірок, пакети, драйвера)

This entry was tagged