Это старая версия документа!
Содержание
Video VoIP
Макет №3 на IMX6
Компиляция ПО
Компилятор
Использую «gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux»
u-boot
Скачиваем файл u-boot.mainline.tgz из папки Dropbox: https://www.dropbox.com/sh/302x26hgrncwkkl/AABqp9m4mIKzDeoG0R2FUCiwa?dl=0
$ tar xzf u-boot.mainline.tgz $ cd u-boot.mainline $ make ARCH=arm titanium_config $ make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin/arm-linux-gnueabihf- -j4
Если компиляция завершилась успешно, то должен появится файл u-boot.imx
kobs-ng
Утилита kobs-ng нужна для записи образа u-boot в NAND память, т.к. для загрузки u-boot с NAND требуется специальный заголовок, который u-boot добавлять не умеет. Скачиваем архив kobs-ng-3.0.35-4.0.0.tar.gz из https://www.dropbox.com/sh/302x26hgrncwkkl/AABqp9m4mIKzDeoG0R2FUCiwa?dl=0
распаковываем и выполняем команды:
$ export PATH=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin:$PATH $ ./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf-gcc $ make -j4 LDFLAGS=-static $ arm-linux-gnueabihf-strip src/kobs-ng
Если компиляция выполнена успешно, то получится утилита kobs-ng в папке src
imx_usb_loader
Утилита imx_usb_loader нужна, чтобы загрузить u-boot на абсолютно чистую плату после производства. В каком бы положении не были конфигурационные ноги у «чистого» процессора он всё равно загрузится в режим Serial Downloader, который предоставляет доступ к памяти процессора через USB-OTG
$ git clone https://github.com/boundarydevices/imx_usb_loader.git $ cd imx_usb_loader $ make
Перед загрузкой убедитесь, что процессор, подключенный к ПК определился верно:
$ lsusb Bus 002 Device 007: ID 15a2:0054 Freescale Semiconductor, Inc. i.MX6Q SystemOnChip in RecoveryMode
Непосредственно загрузка процессора:
$ ./imx_usb ../tmp/deploy/images/u-boot.imx
Ядро
Ядро макета №2, пока без изменений
Файловая система для запуска
Для первоначального запуска платы можно использовать компактную файловую систему, основанную на Busybox. Инструкции берем отсюда: https://community.freescale.com/docs/DOC-95046
Загрузка платы
Подготовка
Для записи загрузчика, ядра и файловой системы потребуется носитель Flash-drive, отформатированный как FAT32. Записываем на него файл u-boot.imx, ядро uImage, файлы модулей, файловую систему, утилиту kobs-ng.
Загрузка u-boot
Подключаем плату к USB порту ПК через кабель mini-USB (на плате разъем X7). В Linux плата (процессор) определяется как «Bus 002 Device 003: ID 15a2:0054 Freescale Semiconductor, Inc. i.MX6Q SystemOnChip in RecoveryMode». Если не определяется, то выпаиваем совершенно ненужные CP39/CP40 (на 5-ти первых платах я выпаял, не определялось) и снова подключаем. Если всё нормально определилось, то подключаем консольный кабель к X8 и выставляем стандартные параметры 115200/n8/no-parity/no-hw-control. Затем загружаем скомпилированный u-boot на плату:
sudo ../imx_usb_loader/imx_usb u-boot.imx
На консоле должен появится загруженный u-boot. Доступны команды работы с USB-host и NAND. Из u-boot можно записать только файл ядра uImage и файловую систему, а вот сам u-boot можно записать в NAND только утилитой kobs-ng из-под загруженного Linux.
Загрузка ПО в NAND
Прежде всего загружаем Linux. Для загрузки Linux потребуются два файла: файл ядра uImage и файл с файловой системой uInitrd, которые мы скомпилировали ранее. Берем USB флешку на 4GB (на 8GB почему-то работает с серьезными сбоями, практически не работает), которая отформатирована в стандартные FAT32 под Windows. Останавливаем обратный отсчет и вводим команду для загрузки Linux ramfs:
/ # run usb_boot
Либо все команды ручками:
Titanium > usb start Titanium > fatload usb 0 ${loadaddr} uImage Titanium > setenv rdaddr 0x13000000 Titanium > fatload usb 0 ${rdaddr} uInitrd Titanium > setenv video mxcfb0:dev=ldb,1280x800MR@60,if=RGB666 video=mxcfb1:dev=hdmi,1024x768MR@60,if=RGB24,bpp=32 fbmem=32M vmalloc=400M Titanium > setenv bootargs console=${console},${baudrate} rdinit=/sbin/init video=${video} Titanium > bootm ${loadaddr} ${rdaddr}
На консоле отображается лог загрузки и далее надо нажать Enter, чтобы появилась командная строка.
В логе загрузке должны отобразится разделы NAND:
[ 1.913029] Creating 5 MTD partitions on "gpmi-nand": [ 1.918090] 0x000000000000-0x000000300000 : "bootloader" [ 1.924126] 0x000000300000-0x000000320000 : "env1" [ 1.929530] 0x000000320000-0x000000340000 : "env2" [ 1.934951] 0x000000340000-0x000000840000 : "kernel" [ 1.940573] 0x000000840000-0x000010000000 : "rootfs"
Запись u-boot
Сначала включим питание USB-host:
/ # echo "1" > /sys/devices/virtual/gpio/gpio76/value [ 49.751917] usb 2-1: new high speed USB device number 2 using fsl-ehci [ 49.904940] scsi0 : usb-storage 2-1:1.0 [ 50.903611] scsi 0:0:0:0: Direct-Access SanDisk Cruzer 2.01 PQ: 0 ANSI: 6 [ 50.914373] sd 0:0:0:0: [sda] 7821312 512-byte logical blocks: (4.00 GB/3.72 GiB) [ 50.923851] sd 0:0:0:0: [sda] Write Protect is off [ 50.931219] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 50.950405] sda: sda1 [ 50.956215] sd 0:0:0:0: [sda] Attached SCSI disk
Видно, что определился диск /dev/sda1, монтируем его:
/ # mkdir /mnt / # mount /dev/sda1 /mnt / # ls -l /mnt -rwxr-xr-x 1 0 0 58224640 Jun 27 2016 armhf-rootfs-debian-wheezy.tar -rwxr-xr-x 1 0 0 477048 Jun 21 2016 evtest -rwxr-xr-x 1 0 0 463936 Jun 27 2016 kobs-ng -rwxr-xr-x 1 0 0 482204 Jun 27 2016 modules.tgz -rwxr-xr-x 1 0 0 437248 Jun 27 2016 u-boot.imx -rwxr-xr-x 1 0 0 3986812 Jun 27 2016 uImage -rwxr-xr-x 1 0 0 1608807 Jun 24 2016 uInitrd
Проверим какие у нас есть разделы на NAND:
/ # ls -l /dev/mtd* crw------- 1 0 0 90, 0 Jan 1 1970 /dev/mtd0 crw------- 1 0 0 90, 1 Jan 1 1970 /dev/mtd0ro crw------- 1 0 0 90, 2 Jan 1 1970 /dev/mtd1 crw------- 1 0 0 90, 3 Jan 1 1970 /dev/mtd1ro crw------- 1 0 0 90, 4 Jan 1 1970 /dev/mtd2 crw------- 1 0 0 90, 5 Jan 1 1970 /dev/mtd2ro crw------- 1 0 0 90, 6 Jan 1 1970 /dev/mtd3 crw------- 1 0 0 90, 7 Jan 1 1970 /dev/mtd3ro crw------- 1 0 0 90, 8 Jan 1 1970 /dev/mtd4 crw------- 1 0 0 90, 9 Jan 1 1970 /dev/mtd4ro brw------- 1 0 0 31, 0 Jan 1 1970 /dev/mtdblock0 brw------- 1 0 0 31, 1 Jan 1 1970 /dev/mtdblock1 brw------- 1 0 0 31, 2 Jan 1 1970 /dev/mtdblock2 brw------- 1 0 0 31, 3 Jan 1 1970 /dev/mtdblock3 brw------- 1 0 0 31, 4 Jan 1 1970 /dev/mtdblock4
u-boot записывают в самый первый раздел NAND по нулевому адресу, то есть в /dev/mtd0:
/ # /mnt/kobs-ng init -v -x /mnt/u-boot.imx MTD CONFIG: chip_0_device_path = "/dev/mtd0" chip_1_device_path = "(null)" search_exponent = 2 data_setup_time = 80 data_hold_time = 60 address_setup_time = 25 data_sample_time = 6 row_address_size = 3 column_address_size = 2 read_command_code1 = 0 read_command_code2 = 48 boot_stream_major_version = 1 boot_stream_minor_version = 0 boot_stream_sub_version = 0 ncb_version = 3 boot_stream_1_address = 0 boot_stream_2_address = 0 -- We add the 1k-padding to the uboot. .tmp_kobs_ng: verifying using key '00000000000000000000000000000000' .tmp_kobs_ng: is a valid bootstream for key '00000000000000000000000000000000' mtd: opening: "/dev/mtd0" NFC geometry : ECC Strength : 8 Page Size in Bytes : 2112 Metadata size : 10 ECC Chunk Size in byte : 512 ECC Chunk count : 4 Block Mark Byte Offset : 1999 Block Mark Bit Offset : 0 ==================================================== mtd: opened '/dev/mtd0' - '(null)' mtd: max_boot_stream_size_in_bytes = 1048576 mtd: boot_stream_size_in_bytes = 438272 mtd: boot_stream_size_in_pages = 214 mtd: #1 0x00100000 - 0x00200000 (0x0016b000) mtd: #2 0x00200000 - 0x00300000 (0x0026b000) FCB m_u32Checksum = 0x00000000 m_u32FingerPrint = 0x20424346 m_u32Version = 0x01000000 m_NANDTiming.m_u8DataSetup = 80 m_NANDTiming.m_u8DataHold = 60 m_NANDTiming.m_u8AddressSetup = 25 m_NANDTiming.m_u8DSAMPLE_TIME = 6 m_u32PageDataSize = 2048 m_u32TotalPageSize = 2112 m_u32SectorsPerBlock = 64 m_u32NumberOfNANDs = 0 m_u32TotalInternalDie = 0 m_u32CellType = 0 m_u32EccBlockNEccType = 4 m_u32EccBlock0Size = 512 m_u32EccBlockNSize = 512 m_u32EccBlock0EccType = 4 m_u32MetadataBytes = 10 m_u32NumEccBlocksPerPage = 3 m_u32EccBlockNEccLevelSDK = 0 m_u32EccBlock0SizeSDK = 0 m_u32EccBlockNSizeSDK = 0 m_u32EccBlock0EccLevelSDK = 0 m_u32NumEccBlocksPerPageSDK = 0 m_u32MetadataBytesSDK = 0 m_u32EraseThreshold = 0 m_u32Firmware1_startingPage = 512 m_u32Firmware2_startingPage = 1024 m_u32PagesInFirmware1 = 214 m_u32PagesInFirmware2 = 214 m_u32DBBTSearchAreaStartAddress = 256 m_u32BadBlockMarkerByte = 1999 m_u32BadBlockMarkerStartBit = 0 m_u32BBMarkerPhysicalOffset = 2048 m_u32BCHType = 0 m_NANDTMTiming.m_u32TMTiming2_ReadLatency = 0 m_NANDTMTiming.m_u32TMTiming2_PreambleDelay = 0 m_NANDTMTiming.m_u32TMTiming2_CEDelay = 0 m_NANDTMTiming.m_u32TMTiming2_PostambleDelay = 0 m_NANDTMTiming.m_u32TMTiming2_CmdAddPause = 0 m_NANDTMTiming.m_u32TMTiming2_DataPause = 0 m_NANDTMTiming.m_u32TMSpeed = 0 m_NANDTMTiming.m_u32TMTiming1_BusyTimeout = 0 m_u32DISBBM = 0 DBBT m_u32Checksum = 0x00000000 m_u32FingerPrint = 0x54424244 m_u32Version = 0x01000000 m_u32DBBTNumOfPages = 0 Firmware: image #0 @ 0x100000 size 0x6b000 - available 0x100000 Firmware: image #1 @ 0x200000 size 0x6b000 - available 0x100000 -------------- Start to write the [ FCB ] ----- mtd: erasing @0:0x0-0x20000 mtd: Writing FCB0 [ @0:0x0 ] (840) * mtd: erasing @0:0x20000-0x40000 mtd: Writing FCB1 [ @0:0x20000 ] (840) * mtd: erasing @0:0x40000-0x60000 mtd: Writing FCB2 [ @0:0x40000 ] (840) * mtd: erasing @0:0x60000-0x80000 mtd: Writing FCB3 [ @0:0x60000 ] (840) * mtd_commit_bcb(FCB): status 0 -------------- Start to write the [ DBBT ] ----- mtd: erasing @0:0x80000-0xa0000 mtd: Writing DBBT0 [ @0:0x80000 ] (800) * mtd: erasing @0:0xa0000-0xc0000 mtd: Writing DBBT1 [ @0:0xa0000 ] (800) * mtd: erasing @0:0xc0000-0xe0000 mtd: Writing DBBT2 [ @0:0xc0000 ] (800) * mtd: erasing @0:0xe0000-0x100000 mtd: Writing DBBT3 [ @0:0xe0000 ] (800) * mtd_commit_bcb(DBBT): status 0 ---------- Start to write the [ .tmp_kobs_ng ]---- mtd: Writting .tmp_kobs_ng: #0 @0: 0x00100000 - 0x0016b000 mtd: erasing @0:0x100000-0x120000 mtd: erasing @0:0x120000-0x140000 mtd: erasing @0:0x140000-0x160000 mtd: erasing @0:0x160000-0x180000 mtd: We write one page for save guard. * mtd: Writting .tmp_kobs_ng: #1 @0: 0x00200000 - 0x0026b000 mtd: erasing @0:0x200000-0x220000 mtd: erasing @0:0x220000-0x240000 mtd: erasing @0:0x240000-0x260000 mtd: erasing @0:0x260000-0x280000 mtd: We write one page for save guard. *
Запись файловой системы
Для примера загрузим файловую систему Debian 7.5 - файл debian-7.5-bare-armhf-2014-07-07.tar.xz, но можно и любую другую, инструкции сохраняются.
В домашней директории создадим временную папку ubi_fs