Кажется, ну зачем в u-boot выводить logo, надо подождать всего несколько секунд и p-splash в linux нарисует красивую картинку. Но получается что в течении именно этих нескольких секунд пользователь устройства видит черный экран и не понимает включился дивайс или надо еще жать кнопку on/off. А если эту кнопку жать более 4х секунд — то устройство принудительно отрубается. Дабы не вводить пользователей в заблуждение будем выводить в u-boot logo.
Поддержка экрана OSD080TN52
Для начала добавим поддержку нашего экрана OSD080TN52, редактируем файл arch/arm/cpu/pxa/pxafb.c.
Создем структуру, описывающую экран:
#ifdef CONFIG_OSD_OSD080TN52 #define LCD_BPP LCD_COLOR16 vidinfo_t panel_info = { vl_col: 800, /* Number of columns */ vl_row: 600, /* Number of rows */ vl_width: 160, /* Width of display area in millimeters */ vl_height: 120, /* Height of display area in millimeters */ /* LCD configuration register */ vl_clkp: CONFIG_SYS_HIGH, /* Clock polarity */ vl_oep: CONFIG_SYS_HIGH, /* Output Enable polarity */ vl_hsp: CONFIG_SYS_LOW, /* Horizontal Sync polarity */ vl_vsp: CONFIG_SYS_LOW, /* Vertical Sync polarity */ vl_dp: CONFIG_SYS_HIGH, /* Data polarity */ vl_bpix: LCD_BPP, /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */ vl_lbw: 0, /* LCD Bus width, 0 = 4, 1 = 8 */ vl_splt: 0, /* Split display, 0 = single-scan, 1 = dual-scan */ vl_clor: 1, /* Color, 0 = mono, 1 = color */ vl_tft: 1, /* 0 = passive, 1 = TFT */ /* Horizontal control register. Timing from data sheet */ vl_hpw: 20, /* Horz sync pulse width */ vl_blw: 46, /* Wait before of line */ vl_elw: 210, /* Wait end of line */ /* Vertical control register. */ vl_vpw: 10, /* Vertical sync pulse width */ vl_bfw: 23, /* Wait before of frame */ vl_efw: 12, /* Wait end of frame */ }; #endif /* CONFIG_OSD_OSD080TN52*/ |
Далее надо определить значения, которые будут записаны в регистры LCCR0 и LCCR3. Для других экранов они определены ‘хардкодом’, но это не наш путь, сделаем все по-человечески:
#define REG_LCCR0 ( LCCR0_PAS | LCCR0_LDM | LCCR0_SFM | LCCR0_IUM | \ LCCR0_EFM | LCCR0_QDM | LCCR0_BM | LCCR0_OUM ) #define REG_LCCR3 ( LCCR3_Bpp( 4 ) | LCCR3_PCP | 3 ) |
Далее надо проинициализировать выводы контроллера для работы с lcd. Функция для pxa320 была почему-то пустая. На всех ножках добавим включение первой альтернативной функции:
static inline void pxafb_setup_gpio (vidinfo_t *vid) { GPIO6_2 = AF_SEL_1; GPIO7_2 = AF_SEL_1; GPIO8_2 = AF_SEL_1; GPIO9_2 = AF_SEL_1; GPIO10_2 = AF_SEL_1; GPIO11_2 = AF_SEL_1; GPIO12_2 = AF_SEL_1; GPIO13_2 = AF_SEL_1; GPIO63 = AF_SEL_1; GPIO64 = AF_SEL_1; GPIO65 = AF_SEL_1; GPIO66 = AF_SEL_1; GPIO67 = AF_SEL_1; GPIO68 = AF_SEL_1; GPIO69 = AF_SEL_1; GPIO70 = AF_SEL_1; GPIO71 = AF_SEL_1; GPIO72 = AF_SEL_1; GPIO14_2 = AF_SEL_1; GPIO15_2 = AF_SEL_1; GPIO16_2 = AF_SEL_1; GPIO17_2 = AF_SEL_1; } |
Конфигурационный файл
Изменяем конфиг include/configs/colibri_pxa320.h, добавляем строки:
#define CONFIG_CMD_BMP #define CONFIG_LCD #define CONFIG_OSD_OSD080TN52 #define LCD_BPP LCD_COLOR16 |
Компиляция, прошивка
Компилируем, как скомпилировать описано тут
Для того что бы прошить новый u-boot, входим в командную строку старого u-boot, набираем:
loady 0x81008000
Отправляем по протоколу Y-modem файл u-boot-nand.bin , затем выполняем:
nupdate 0x81008000 $filesize reset
Выводим logo
Загружаем bmp:
loady 0x81008000
Отправляем картинку по протоколу Y-modem.
Выводим bmp на экран:
bmp display 0x81008000
И если вам повезло и вас LCD подключен в режиме 16 бит, то на экране отобразится картинка. А я же отправляюсь добавлять поддержку дисплеев, подключенных в режиме 18bpp.
P/S
Кстати, u-boot понимает не все bmp. Что бы сконвертировать jpg в bmp c 8-ми битной палитрой можно воспользоваться утилитами для работы с PPM (Portable PixMap).
jpegtopnm logo.jpg | ppmquant 256 | ppmtobmp -bpp 8 > logo-8bit.bmp