PDA

Просмотр полной версии : Подключение штатного монитора Toyota к android


ak1976
02.12.2014, 11:04
Данная тема является развитием аналогичной (http://compcar.ru/forum/showthread.php?t=1441) на соседнем форуме, только применительно к платформе Android.
Судя по моим ЛС данный вопрос достаточно актуален и интересен не только мне. Да и самому, чтобы не забыть, желательно где-то записать :)

Сразу хочу выразить благодарность пользователю KiLLWarez c 4pda.ru, от него я узнал о самой возможности реализовать нестандартное разрешение под android. Он же рассказал мне ключевые моменты технологии.

Зачем все это нужно. С помощью изменения прошивки удалось реализовать вывод через VGA разрешения 800*480 и подключить Mele A2000 к штатному монитору Toyota Harrier Hybrid 2008 г. (через GVIF адаптер). Изображение на порядок лучше, чем при подключении через AV вход.

Для начала просто скопирую свой ответ из ЛС про реализацию нестандартного разрешения на Mele A2000 (Allwinner A10, 512Mb, VGA). Если тема будет интересна, постараюсь расширить этот пост деталями.

Прошивка собиралась из исходников и по инструкции из этого поста (http://docs.cubieboard.org/tutorials/cb1/installation/building_android_ics_a10_image). Все выполнялось на Ubuntu 12.04 (http://docs.cubieboard.org/tutorials/cb1/development/cubieboard/building_environment_for_android).

Правил файлы
./lichee/linux-3.0/drivers/video/sun4i/disp/de_bsp/de/disp_lcd.c
./lichee/boot/boot1/driver/drv_de_hdmi/de_bsp/de/disp_lcd.c
./lichee/boot/boot1/driver/drv_de/de_bsp/de/disp_lcd.c
./lichee/linux-3.0/drivers/video/sun4i/disp/de_bsp/de/disp_clk.c
./lichee/boot/boot1/driver/drv_de_hdmi/de_bsp/de/disp_clk.c
./lichee/boot/boot1/driver/drv_de/de_bsp/de/disp_clk.c
./lichee/linux-3.0/drivers/video/sun4i/disp/de_bsp/de/ebios/de_lcdc.c
./lichee/boot/boot1/driver/drv_de_hdmi/de_bsp/de/ebios/de_lcdc.c
./lichee/boot/boot1/driver/drv_de/de_bsp/de/ebios/de_lcdc.c
./android/system/core/init/init_disp.c

В файлах disp_lcd.c и init_disp.c для одного из штатных разрешений поправил параметры. Взял разрешение 1360x768, правил соответственно на 800x480

В файлах de_lcdc.c правятся тайминги VGA сигнала.
За основу я брал вот такой Modeline (подбирал его с помощью PowerStrip, на компьютере с Windows)
# "800x480" 29,664 800 826 898 958 480 542 545 575 +hsync +vsync
Для понимания как все это перевести в термины (ht, hbp, vt, vbp, vspw, hspw) очень полезная статья http://skif.bas-net.by/bsuir/admin/node85.html
у меня получились вот такие параметры
cfg.src_x = cfg.scl_x = cfg.out_x = 800;//HA
cfg.src_y = cfg.scl_y = cfg.out_y = 480;//VA
cfg.ht = 958;//HT-1=-1 horizontal total time
cfg.hbp = 132;//HS+HBP-1=+-1 back porch
cfg.vt = 1150;//VT*2=*2 vertical total time
cfg.vbp = 33;//VS+VBP-1=+-1 vertical back porch
cfg.vspw = 3;//VS-1=-1 vertical sync pulse width in pixels
cfg.hspw = 72;//HS-1=-1 horizontal sync pulse width
тут есть тонкость, что
cfg.vt - это vertical total time умноженный на 2
cfg.vbp - vertical back porch умноженный vertical sync pulse
cfg.hbp - аналогично.
формулы в комментариях написаны.
какой потаенный смысл в формуле типа HS-1=-1 я так и не понял, поставил туда просто ширину синхросигнала.
можно еще управлять полярностью синхросигналов через параметр
cfg.io_pol
значения я сейчас точно не вспомню, как то так по моему
cfg.io_pol = 0x04000000; // +hsync +vsync
cfg.io_pol = 0x00000000; // -hsync -vsync
или наоборот, в общем оказалось, что у меня гораздо лучше изображение при стандартном cfg.io_pol = 0x00000000;
как получить другие варианты полярности синхросигнала по моему тут нужно искать http://linux-sunxi.org/Display_Contr...#LCD_Registers
там определенные биты в регистре нужно cfg.io_pol нужно выставлять.

ну и остался файл disp_clk.c
в нем описывается частота тактового генератора, или, если точнее, частота выдачи точек на монитор
у меня там используются следующие значения
{ 29600000 , 1 , 29600000, 222000000 , 0 }, // DISP_VGA_H800_V480 //
первое число LCDx_CH1_CLK2
третье оно же
четвертое PLL_CLK
попробую объяснить как их получить. Сразу ссылку на доки http://linux-sunxi.org/Clock_Control_Module
Для начала нам нужно определить какая частота нам нужна.
Берем из Modeline частоту в МГц 29,664
В принципе это и длжно быть значение LCDx_CH1_CLK2, но т.к. A10 не умеет генерировать произвольную частоту нужно подобрать ближайшую из тех, что он умеет.
Из доков формулы LCD[01]_CH1_CLK2 = PLL_CLK / M, где M может быть от 1 до 16.
Как я понял PLL_CLK это PLL3 из доков, т.е. он умеет выдвать частоту из ряда 3МГц * M, где M может быть от 9 до 127
вот подбирая значения M для этих двух частот и нужно получить LCDx_CH1_CLK2 наиболее близкий к требуемому.

Чтобы было проще подбирать, а написал небольшой скрипт (http://hhll.ru/1/pll_clock.php). Ему нужно задать нужную частоту в Гц, он выдаст пары значений PLL_CLK и LCDx_CH1_CLK2 отсортированные по наименьшей разнице с заданным значением.
Правда если задать ему 29664000 скрипт не выдаст пары 29600000, 222000000. Связанно это с тем что изначально я использовал в 2 раза меньшую частоту 14,832 Мгц
Для нее скрипт выдает пару 222000000, 14800000 точно уже не скажу почему взял не самый верний результат, скорее всего потребовалось немного поднять частоту.
Потом я выяснил, что если взять частоту в 2 раза выше, то изображение на мониторе получается качественней, и просто увеличил 14800000 в два раза, и не стал подбирать новые пары.

Так же выяснилось что mele в качестве внутреннего разрешения (то в котором изначально формируется изображение, можно посмотреть в antutu, далее при выводе на vga, hdmi оно просто масштабируется до требуемог).
Так вот в качестве внутреннего разрешения используется разрешение режима который прописан в script.bin параметр screen0_output_mode
По умолчанию там стоит 1280*720, мелковато получается. Я поставил разрешение поменьше.

В качестве смесителя синхросигнала использовалась схема на 555ЛП5 с соседнего форума
http://compcar.ru/forum/attachment.php?attachmentid=9067&d=1353957753&thumb=1
На двух резисторах смеситель синхросигналов не заработал. Оказалось причина в том, что mele выдает синхроимпульсы амплитудой около 3В, сравнивал с обычным компьютером, там амплитуда синхроимпульсов в районе 5В. Похоже 3В моей голове не хватало. Т.е. смеситель на 555ЛП5 у меня по большому счету только уровень синхроимпульсов поднимает, ну и заодно смешивает синхросигналы. С обычного компьютера все работало и от двух резисторов

Пробовал еще изменять разрешение на HummingBird A31 в нем достаточно script.bin исправить.

Файл прошивки и исправленные файлы исходников для нее для Allwinner A20, cubietruck (Правилось разрешение 640x480 - переделал его в 800x480)
https://yadi.sk/d/joxxW73FmqNx8

-=zds=-
02.12.2014, 17:05
Скажите а в какой Toyota вы это реализовали, и можно фото посмотреть? Видел андроид на AV входе, скажу честно, полное Г, хотелось бы посмотреть на сколько лучше у вас все показывает.

ak1976
03.12.2014, 12:31
Делал все это на toyota harrier hybrid 2008г. Фотографии поищу, если не найду завтра в машине сделаю. Через AV все действительно очень плохо. Через rgbs намного лучше. Жалко что раньше не знал насколько лучше - купил бы gvif интерфейс на год раньше.

vladj
03.12.2014, 17:25
А тач работает? Если да, то как его к приставке привязал ?

Vova
04.12.2014, 15:26
Я вот никак не могу понять, почему у меня изображение в два раза вытянуто, я так полагаю, что при использовании режима interlace ни только частота строк уменьшается в два раза, но и количество линий...Тогда исходя из этого, чтобы вывести rgbs с железки на android, нужно либо указывать 800х240 либо вообще 400х240...Пока эксперименты продолжаются, удалось получить хоть чтото...но наложенное друг на друга...

ak1976
05.12.2014, 04:32
А тач работает? Если да, то как его к приставке привязал ?
Тач пока не работает, но есть идее по его подключению.
Голова шлет навигации через AVCLan информацию о нажатии на тач. Я собираюсь получать эти данные через свой адаптер (http://compcar.ru/forum/showthread.php?t=4835) и с помощью друго контроллера (http://pccar.ru/showthread.php?p=253140) эмулировать световое перо (правда, тут придется прошивку поправить).
Все это делать на одном конроллере я не хочу, потому как думаю производительности ардуины не хватит на обе задачи, а портировать обе платы на другую платформу будет дороже, чем стоит вторая ардуина.

ak1976
05.12.2014, 04:43
Я вот никак не могу понять, почему у меня изображение в два раза вытянуто, я так полагаю, что при использовании режима interlace ни только частота строк уменьшается в два раза, но и количество линий...Тогда исходя из этого, чтобы вывести rgbs с железки на android, нужно либо указывать 800х240 либо вообще 400х240...Пока эксперименты продолжаются, удалось получить хоть чтото...но наложенное друг на друга...

Наткнулся сейчас на интересный проект Low Resolution Modeline Calculator (http://lrmc.sourceforge.net/)
Попробуйте им modeline посчитать как нибудь так
lrmc 400 234 30 -cga

Vova
05.12.2014, 19:08
Как ни странно но этот калькулятор помог, вижу изображение с правильной частотой, без всяких перекрытий и наложений, но опять проблема, оно вытянуто, меняю размер экрана с помощью am display-size и делаю меньше, но изображение уменьшается и получается как бы по центру того что было вытянуто, и у нового изображения я вижу только верх, т.к. его центр где-то внизу за нижним краем экрана.
Так вот вопрос, может кто знает как поднять саму картинку вверх?

Правда режим подбирал для 800х480 и он мне выдавал 800х240 .....

slden
05.12.2014, 22:43
Правда режим подбирал для 800х480 и он мне выдавал 800х240 .....
К сожалению нет инфрмации - что вы пытаетесь настроить и на чем видеть результат...
Как правило, контроллеры стоковых мониторов автомобильных навигационных систем начала текущего века относятся к классу WQVGA и работают в режиме interlaced. Далеко не все графические подсистемы современных PC способны поддерживать подобные режимы. В некоторых случаях удается синхронизировать OEM WQVGA контроллер в прогрессивном режиме. При этом, фактические тайминги находятся в зоне 800x240.
Для примера, рабочие настройки графики nvidia для OEM 7 inch 480x234:

http://images55.fotki.com/v1618/photos/9/1747809/9479150/ION2toOEM-vi.png

Vova
08.12.2014, 13:05
Проблема оказывается в следующем, если я изменяю 640х480 то у меня получается по высоте картинка нормальная, но по ширине уже, как бы 4:3, а если я меняю 800х480, то по ширине нормальная, а по высоте больше, соответственно и с другими разрешениями в таком же стиле...
Изменения производил во всех перечисленных выше файлах (искал поиском)...
Но при загрузке, пока идет надпись андройд, все ок, получается где-то что-то надо еще изменять именно в исходниках андройда, т.к. получается в исходниках ядра все ок.

Vic26
08.12.2014, 13:13
посмотри в build.prop параметр video.use.overlay
если он =1 попробуй поменять на =0

Vova
08.12.2014, 15:14
У меня нет такой строчки в build.prop

Vic26
08.12.2014, 15:23
android какой?

Vova
08.12.2014, 16:04
Android 4.2

Vic26
08.12.2014, 16:10
посмотри что wm size выдает

Vova
08.12.2014, 16:15
в 4.2 не "wm size", а "am size", вопрос в другом, am size это размер картинки, а не физический, у меня получается размер физический не правильный.

Vic26
08.12.2014, 16:42
ну я опираюсь на свои пляски с 4.4, там wm size, и он когда физический и виртуальный размеры не совпадают выдает оба значения.
Есть еще прога для андроида Dev Tools, в ней тоже можно параметры посмотреть

Vic26
08.12.2014, 16:49
еще можно так попробовать
cat /sys/class/graphics/fb0/mode

Vova
08.12.2014, 17:01
ничего не выдает, wm это в 4.4, а в 4.2 не умеет похоже выдавать значения, можно видимо только менять.
через cat /sys/class/graphics/fb0/mode тоже ничего...

Vic26
08.12.2014, 17:03
ну еще такой вариант
cat /sys/class/graphics/fb0/screen_info
если нет, то уж не знаю...

Vova
08.12.2014, 17:11
Ничего не выдал

ak1976
09.12.2014, 12:01
Проблема оказывается в следующем, если я изменяю 640х480 то у меня получается по высоте картинка нормальная, но по ширине уже, как бы 4:3, а если я меняю 800х480, то по ширине нормальная, а по высоте больше, соответственно и с другими разрешениями в таком же стиле...
Изменения производил во всех перечисленных выше файлах (искал поиском)...
Но при загрузке, пока идет надпись андройд, все ок, получается где-то что-то надо еще изменять именно в исходниках андройда, т.к. получается в исходниках ядра все ок.
Я когда искал в каких файлах править разрешение, делал поиск по исходникам стоки 1360 (разрешение было такое 1360*768) и дальше смотрел в найденных файлах. Возможно в 4.2 нужно разрешение править еще где-то кроме ./android/system/core/init/init_disp.c
попробуйте в каталоге android выполнить
grep -R --exclude=*.o 1360 * > 1360_list.txt
совпадений будет много, поэтому проще в файл их отправить. Дальше уже нужно смотреть сами файлы из списка.

Vova
15.12.2014, 18:26
Мной был найден еще один файл в папке devices под названием display.cpp, но как написал выше ak1976, лучше пользоваться поиском, получается в разнах исходниках некоторые моменты разные...

smizero
16.01.2015, 11:47
Вопрос снят с повестки дня...

ak1976
12.01.2016, 16:16
В шапке выложил прошивку для Allwinner A20, cubietruck и исправленные файлы исходников от нее. Правилось разрешение 640*480 на 800*480

YuryY
22.06.2016, 17:24
Хотел бы уточнить у уважаемого ak1976, возможно ли создать на cubietruck пользовательское разрешение 800х480i с определенным Modeline и выводом сигнала по VGA. Родное разрешение штатного монитора 400х234.

ak1976
04.07.2016, 17:08
Хотел бы уточнить у уважаемого ak1976, возможно ли создать на cubietruck пользовательское разрешение 800х480i с определенным Modeline и выводом сигнала по VGA. Родное разрешение штатного монитора 400х234.

800х480 точно можно, по поводу черезстрочной развертки я не проверял, но у структуры cfg есть поле
b_interlace; //1=b_interlace, 0=progressive
т.е. попробуйте в файлах прошивки de_lcdc.c для выбранного разрешения пропистать
cfg.b_interlace = 1;
для остальных разрешений, чтобы они продолжали работать
cfg.b_interlace = 0;
и закомментировать
cfg.b_interlace = 0;
в конце функции tcon1_set_vga_mode