LINUX.ORG.RU
ФорумTalks

rk3188: дисплей

 ,


0

3

Продолжаем наш нерегулярный сериал в толксах про треш, угар и линукс. Злобный некромант против чуда китайской мысли, Pipo MAX M6 Pro.

[ первая серия | вторая серия | третья серия ]

Неделька выдалась трудная, и потому от силы с мог посвятить дальнейшим копаниям пару-тройку вечеров, да и то когда мозги уже далеко не в лучшей форме.

Острой проблемой стоял дисплей, ибо без него все остальное будет просто бесполезнейшим бесполезняком. Проблем добавляло то, что именно моя LCD матрица в ядре никоим образом не упоминалась, что наводило на очень неприятные мысли о том, что тайминги придется добавать с матами, при помощи дизассемблера, мата и грубой силы. Ибо документации у меня было чуть меньше, чем вообще нихрена. Повезло, что в #linux-rockchip люди могли рассказать то, что не написано в документации даже мелким шрифтом на китайском и безо всяких NDA. Но не по поводу LCDC, ибо в основном там тусовка крутится вокруг андройд-стиков типа UG802 и тому подобных.

Итак, начнем с подключения. На LCDC0 и попутно на i2c-2 шине висит некая хрень, зовущаяся anx6345, являющаяся eDP трансмиттером. Документации на нее чуть меньше, чем вообще никакой, но суть примерно такая: входит в нее параллельный вход от LCDC, а из нее идет DP до LCD панели. Такая конфигурация в ядре есть, есть и драйвер на anx. Но вот, западло - панелька там другая, хоть тоже и ретина с тем же разрешением.

Попытки завести anx6345 с наскоку мне не удались. Оказалось, что там как-то очень хитро включается и отключается питание панели. Иными словами - на стоковом ядре я видел на i2c-2 по адресам 0x38, 0x39 и 0x3d этот anx, а на моем самосборе докрученном получал кукишь, несмотря на то, что gpio врубающие 3.3v, 1.8v я честно прописал.

Дальнейшие копания не выявили никаких i2c-gpio/spi-gpio расширителей, потому голос внутри моей головы тихо и ясно произнес - «а все ли я учел с gpio?»

Выяснилось, что нет.

Были там ноги, которые сдампил в виде "?" gpio-user-drv, то есть китайцы выполняя request_gpio не удосужились написать кому и зачем оно нужно.

Именно поэтому я полез в исходники драйвера GPIO и раскурил регистровую карту. Благо, одного хедера с дефайнами оказалось достаточно, чтобы найти по какому офсету лежит Data Register а по какому Direction Register.

Честно сдампив devmem'ом значения при работающем дисплее и восстановив их на своем ядре я опять получил фигу. На i2c-2 anx'а не появилось.

«Ну точно сдвиговый регистр! Или еще какая НЁХ.»

Следующая мысль была простая. Так как devmem ммапит в память приложения кусок физического пространства, то и обращения к нему будут явно сильно быстрее, чем через gpio api ядра. А значит, мы реально можем восстановить что там происходит! За пять минут из исходников devmem2.c я запилил тупой трейсер, который насилует указанный адрес памяти и логгирует все его изменения, после чего выводит историю изменений в консоль. Пара минут работы дампера, и у меня в руках скрипт который включает anx6345, и который успешно это делает в том числе и на моем ядре.

devmem 0x2000A000 32 0x515101
devmem 0x2000A000 32 0x515001
devmem 0x2000A000 32 0x514001
devmem 0x2000A000 32 0x515001
devmem 0x2000A000 32 0x511001
devmem 0x2000A000 32 0x515001
devmem 0x2000A000 32 0x515005
devmem 0x20080000 32 0xA8034E0
devmem 0x20080000 32 0x1A8034E0

Для начала я запихнул это в ядро, прямо перед инициализацией anx6345, потом разберусь что из этого оставить. Achievement unlocked: eDP трансивер заработал!

Но если Вы думаете, что на этом приключения закончились победой, Вы ошибаетесь. Экран по прежнему был черным, а драйвер anx сообщал что незадетектил клока.

Пришло время раскуривать сырцы rk-fb, rk-fb сам не раскурится. Клока anx скорее всего не видел потому, что lcdc0 не запускался. Чтобы это сделать надо его пнуть через файлик в sysfs. Влияет ли это на то успешно стартует anx6345 или нет? А хрен его знает, потому первым хаком я заставил lcdc0 заводиться автоматом сразу перед тем, как драйвер anx6345 будет делать свой probe.

Сообщение об отсутствующем клоке пропали. Но на экране все равно был шедевр Малевича вместо содержимого фреймбуфера. Так как панелька у меня не та, которая собиралась в ядре, у меня пошли нехорошие мысли. Не работать может из-за двух причин.

* Pipo черезжопно по-своему настраивают anx под эту панель.

* LCDC0 настроен на другие тайминги/параметры и требуют хаков. Самое время вспомнить про i2cdump, собрать его статически и снять дамп i2c регистров anx6345 на андроеде.

В пользу этого предположения говорило то, что в логе стока в инициализации панели говориться fps:56, а у меня fps:48 i2cdump и впрямь показал разницу. Так как из документации на anx6345 был только хедер с названиями регистров, пробежавшись по нему я понял, что это разница тупо в статусных регистрах. И говорили они что нихрена не работает.

Пришла пора дампить регистры LCDC0. Регистры сами не сдампятся. Еще минут пятнадцать медитации, запись единички в очередной файлик enable в sysfs и...

Успех!

Оказалось, что по дефолту LCDC, который умеет накладывать оверлеи выводит только бэкграунд, который был черным. Случайно лулза ради заменив в сырцах меджик намбер с нулей на 0xffки я получил белый экран, а немного поковыряв нашел тот enable, записав единичку в который наконец-то увидел содержимое fb. И вроде даже ничего никуда не поехало, и тайминги правильные оказались...

Achievement unlocked: LCD панелька заработала.

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

Кстати, fb консоль у меня так и не завелась. Если ее включить в ядре, то так и остается навека черный экран, даже без пингвина. Ох уж эти наркоманы...

★★★★★

Последнее исправление: ncrmnt (всего исправлений: 3)

а чем закончился дрочь с вафлей? у нас тут есть модуль ар6210 и в нем чудит броадкомовский бт. как бы сдампить пакеты что там ходят?

tmp_do
()

Чем больше читаю твои репорты, тем больше понимаю, какая жуть эти ваши армы... и тем меньше мне хочется свисток на рокчипе :(

pekmop1024 ★★★★★
()
Ответ на: комментарий от pekmop1024

Кстати со свистком у тебя особых проблем не будет. Под них готовые конфиги есть и все вылизано тов. omegamoon. А с Pipo M6 Pro я в этом плане первопроходец, оттого и веселье все.

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от ncrmnt

Ну и ARM тут какбы не причем, под тот же ARM Realview EB и ARM Versatile Express (официальные отладочные платы арма) с кодом все окей...

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от ncrmnt

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

pekmop1024 ★★★★★
()
Ответ на: комментарий от pekmop1024

В теории должно на любом пойти. Там однотипно все. На практике - я пока до иксов и декодера аппаратного не добирался. Да и xbmc меня не сильно интересует. hw декодер там on2, он всеядный вообще. Но не факт что его научились xbmc-ребята юзать. Кстати, емнип был xbmc for android, этот должен нативно заюзать андройдовский обвяз.

ncrmnt ★★★★★
() автор топика
Ответ на: комментарий от ncrmnt

Конечно. Но ведь у pekmop1024 конечная цель - плейер всеядный? С этой точки зрения уже неважно будет, что за чип там, лишь бы производительности хватало.

Quasar ★★★★★
()
Ответ на: комментарий от tmp_do

Заработало вроде. Донапиливать буду когда заведу иксы и мали.

ncrmnt ★★★★★
() автор топика

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

WerNA ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.