Исходная задача: имеется контроллер mini2440 c установленным u-boot загрузчиком (не важно в NOR или NAND) Допустим Вам захотелось в полный экран показывать картинку-заставку при работе u-boot (это время между включением и началом загрузки ядра ~ 7 сек) Сразу скажу что с началом загрузки ядра картинку тоже можно показывать, причем в ядре даже движущуюся. Если говорить о анимации по факту можно вывести две картинки одну при старте загрузчика, другую непосредственно до начала старта ядра (через 3 сек.)
итак как это делается:
подключаем mini2440 serial и USB портами
получаем в одной консоли доступ на mini2440 в другой работаем по конфигурации и сборке на x86 линуксе
кросс компилятор для архитектуры armv4tl-softfloat-linux-gnueabi должен быть настроен в x86 линуксе (читай предыдущие статьи как это сделать)
получаем текущий репозитарий u-boot и устанавливаем окружение кросс компиляции. cd ~ mkdir uboot ; cd uboot git clone git://repo.or.cz/u-boot-openmoko/mini2440.git export CROSS_COMPILE=armv4tl-softfloat-linux-gnueabi- cd mini2440
качаем из вложения патч, выкладываем в корне папки сборки u-boot и накладываем патч calculate mini2440 # patch -p1 < ./u-boot-splash.patch
размер раздела splash 256k (кратно страницам NAND) а размер картинки 225k (240x320x3) что позволяет сохранить в том же разделе ещё одну небольшую картинку размером 240x44 | 200x52 | 100x105 и вывести её чуть позже основной, при загрузке (спустя 3 сек от старта, параметр bootdelay)
dfu-util -a 0 -D ./RoboForum_Logo_240_320.bmp MINI2440 # cp.b 32000000 31000000 38400 // сохранение pix1 в другое место в RAM dfu-util -a 0 -D ./загрузка.bmp MINI2440 # cp.b 32000000 31038400 7c00 // сохранение pix2 со смещением MINI2440 # nand erase splash MINI2440 # nand write 31000000 splash // сохранение pix1+pix2 в NAND MINI2440 # setenv splashimage nand read 0x32000000 splash\; bmp display 0x32000000 MINI2440 # setenv bootcmd bmp display 0x32038400 50 270\; ${bootcmd} MINI2440 # saveenv
используется видеодрайвер CONFIG_VIDEO_S3C2440 (drivers/video/s3c2440_fb.c), оригинально использовался драйвер 2410, там малость кривая инициализация LCD (циклическая перезагрузка)
используются команды работы с .bmp CONFIG_CMD_BMP
используется логотип пингвинчик при отсутствии splash - CONFIG_VIDEO_LOGO (include/linux_logo.h) можно вместо linux_logo использовать bmp_logo.h (включение опции CONFIG_VIDEO_BMP_LOGO) к слову сказать в каталоге tools лежат инструменты ( easylogo & bmplogo) для изменения и этих картиночек, я особого смысла в этом не увидел, хоть и эксперементировал
самая интересная здесь опция CONFIG_SPLASH_SCREEN - позволяет отрабатывать переменную окружения splashimage сразу после загрузки
далее идут параметры устройства, вроде бы они не особо нужны но лучше их оставить. параметр LCD_VIDEO_ADDR важный и обязательный
немного удобств запускаются как # run uboot_reflash и # run splash_reflash это я просто утомился при отладе много раз набирать длинные строки стирания nand и копирования в него из памяти залитых образов
автопоказ splash картинки здесь обращаю вимание на грабли по которым прошел - по непонятной мне причине показать BMP файл из NAND нельзя, требуется предварительное копирование в RAM
про видеодрайвер drivers/video/s3c2440_fb.c рассказывать особо не буду, он копия drivers/video/s3c2410_fb.c из которого удалено лишнее и подправлен размер видеопамяти (из за него и происходила перезагрузка)
в файле конфигурации борды board/mini2440/mini2440.c стоит обратить внимание на следующие изменения: здесь вторая строчка включает подсветку экрана
gpio->GPGUP = ((1 << 15) -1) // disable pullups for all pins & ~(1 << 4) // Pull-up lcd ;
полностью переписал параметры дисплея, то что было поставил в ремарку для сохранения связи по названиям переменных а вот сами переменный переназвал, ибо в оригинале нихрена не понятно что это оригинальные параматры картинку помещают на несколько строк ниже и правее (картинка сдвинута вправо/низ )
Resident писал(а):А картинку для 7го экранчика получится вставить? там вродя как разрешение поболее будет, и размер соответственно...
для 7" экрана нужно вносить соответствующие изменения во всем вышеописанным файлам, для этого нужно пересчитывать все адраса/смещения/ размеры и параметры инициализации дисплея. это не очень сложно но нужно иметь рабочее устройство на руках. может кто то решит заняться, я проконсультирую.
нашел способ как съэкономить 128k памяти NAND: нет смысла держать картинку в 24bpp цветах когда дисплей отображает всего 16bpp нашел как сохранить картинку непосредственно в формате в котором оно в видеопамять ложиться.
Примечательно во втором скрипте используется автоматическая передача команд на mini2440 (пока без контроля)
в приложении готовый образ загрузчика с уменьшенным до 128k размером раздела splash (реально используется не более 32k) но меньше одной страницы 128k не выделить.
но тогда нужно перемещать процедуру инициализации lcd и некоторые процедуры из SPLASH_SCREEN в инициализацию борды. фрейм буфер в принципе не нужен тк пишем прямо в видеопамять. но так кодить на низком уровне мне сейчас лень, если пойдет борьба за свободное пространство NAND нужно помнить этот путь.
Последний раз редактировалось Vooon 14 июл 2010, 00:45, всего редактировалось 1 раз.
Причина:[code=perl,bash,cpp] эвристика не хочет работать :(
384k@0(u-boot) как я понимаю это размер раздела под загрузчик, т.е. 384k, что означает @0? у меня загрузчик получился размером 962412, это нормально?
setar писал(а):[*] заливаем с хоста новый образ загрузчика dfu-util -a 0 -D ./u-boot.bin
при этой команде у меня появляется ошибка:
dfu-util - (C) 2007-2008 by OpenMoko Inc. This program is Free Software and has ABSOLUTELY NO WARRANTLY
dfu-util does currently only support DFU version 1.0
Opening USB Device 0x0000:0x0000... Claiming USB DFU Runtime Interface... Determining device status: state = dfuERROR, ststus = 14 dfuERROR, clearing status not at least 2 device changes found?!? Opening USB Device... Found Runtime: [0x1457:0x511b] devnum=3, cfg=0, intf=0, alt=0 name="Control Interface" Claiming USB DFU Interface... Cannot claim interface: could not claim interface 2: Device or resource busy
В чем может быть проблемма? Linux прекрасно видит мини в vbox как MINI2440 S3C2440 Bootloader U-Boot 1.3.2-mini2440
@0 это начиная с адреса 0, дальше разделы по порядку длинна Вашего загрузчика чрезмерно большая, из за чего ? нужно менять резервирование памяти под него (анализируйте мои патчи, там в нескольких местах меняется) но лучше уменьшить
причину почему нельзя писать прямо в канал alt2 я не нашел, у меня так же. делал через буфенрую память (alt0) P.S. судя по "could not claim interface 2" у вас параметр -a 2
почему такой размер получился не знаю собирал строго по вашему мануалу, дважды пересобирал, результат тот же. какой у вас размер загрузчика получился?
setar писал(а):нужно менять резервирование памяти под него (анализируйте мои патчи, там в нескольких местах меняется) но лучше уменьшить причину почему нельзя писать прямо в канал alt2 я не нашел, у меня так же. делал через буфенрую память (alt0) P.S. судя по "could not claim interface 2" у вас параметр -a 2
а можно про резервирование и патчи более простым языком описать?
отвечу завтра , сейчас миньки с собой нету, а эмуль на серверах не хочу запускать - они восстановлением занимаются после BlackOUT
Добавлено спустя 3 минуты 12 секунд: кстати я пока писал статью всю работу проделал, вам компилить загрузчик надобности нет, всё лежит тут http://projects.roboforum.ru/mini2440/u-boot/ Вам нужен u-boot.bin.lcdsplash он получился чуть больше 256к поэтому пришлось увеличивать размер до ближайшей кратной страницы (384k)
setar писал(а):... размер картинки 225k (240x320x3) что позволяет сохранить в том же разделе ещё одну небольшую картинку размером 240x44 | 200x52 | 100x105 и вывести её чуть позже основной...
почему именно такие разрешения? допустим 96х30 или иное нельзя использовать как 2-е изображение?
setar писал(а):MINI2440 # cp.b 32000000 31000000 38400 // сохранение pix1 в другое место в RAM MINI2440 # cp.b 32000000 31038400 7c00 // сохранение pix2 со смещением MINI2440 # setenv bootcmd bmp display 0x32038400 50 270\; ${bootcmd}
откуда взялись цифры 38400 и 7с00? как я понимаю это размер картинки в битах переведенный в hex?! 50 270 - это координаты смещения картинки? как отключить вывод 2-й картинки?
Наконец то доввел до ума загрузчик. 1. Из под виртуалки почему то не работали dfu-utils, с хостового линукса заливал образы без проблемм 2. Необходимо неомного доработать статью, после комманды dynpart уменьшается splash, см. ниже
[*] заливаем с хоста новый образ загрузчика dfu-util -a 0 -D ./u-boot.bin [*] на контроллере стираем место под старый загрузчик и заменяем его новым MINI2440 # nand erase u-boot MINI2440 # nand write 0x32000000 u-boot [*] после перезагрузки контроллер ругнется на отсутствие правильных переменных окружения. восстановим их: MINI2440 # dynpart после этой комманды проверяем таблицу разделов, т.к. она у меня уменьшила в 2 раза размер splash, если необходимо востанавливаем MINI2440 # setenv mtdparts mtdparts=mini2440-nand:384k@0(u-boot),128k(u-boot_env),5m(kernel),256k(splash),-(rootfs) MINI2440 # dynenv set u-boot_env MINI2440 # saveenv Остальное без изменений
статья правильная, просто Вы вырывали из нее куски ибо то что делает dynpart (размеры разбиения) в явном виде прописаны в исходниках u-boot и в приложенном патче это правится.
Всем привет! Если кому интересно я переделал патч под 7" жки. Тестировал на своем. Вроде все работает корректно. Обращаю ваше внимание что изменения так же есть в файле драйвера видика. т.е. его тоже надо переписывать из архива.
Патч правда правил ручками на основе изменений что сделал в своих файлах но вроде не ошибся. Но если что пишите подправлю Проверять наложение было лениво