====== 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 ===== Ядро ===== Архив с ядром в папке Dropbox, либо можно отдельно взять board-wand.c и defconfig. cp defconfig .config make ARCH=arm oldconfig ===== Файловая система для запуска ===== Для первоначального запуска платы можно использовать компактную файловую систему, основанную на Busybox. Инструкции берем отсюда: [[https://community.freescale.com/docs/DOC-95046|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: Titanium > 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. * ===== Запись файла ядра ===== Использование ключа '-p' - обязательно / # nandwrite -p /dev/mtd3 /mnt/uImage Writing at 0x00000000 Writing at 0x00020000 Writing at 0x00040000 Writing at 0x00060000 Writing at 0x00080000 Writing at 0x000a0000 Writing at 0x000c0000 Writing at 0x000e0000 Writing at 0x00100000 Writing at 0x00120000 Writing at 0x00140000 Writing at 0x00160000 Writing at 0x00180000 Writing at 0x001a0000 Writing at 0x001c0000 Writing at 0x001e0000 Writing at 0x00200000 Writing at 0x00220000 Writing at 0x00240000 Writing at 0x00260000 Writing at 0x00280000 Writing at 0x002a0000 Writing at 0x002c0000 Writing at 0x002e0000 Writing at 0x00300000 Writing at 0x00320000 Writing at 0x00340000 Writing at 0x00360000 Writing at 0x00380000 Writing at 0x003a0000 Writing at 0x003c0000 ===== Запись файловой системы ===== Для примера загрузим файловую систему Debian 7.5 - файл debian-7.5-bare-armhf-2014-07-07.tar.xz, но можно и любую другую, инструкции сохраняются. К сожалению, в составе Busybox нет утилиты ubiformat, необходимая для создания раздела UBI, поэтому необходимо скомпилировать MTD-Utils. Пользуемся инструкциями отсюда: [[cross-compiling-mtd-utils]], но не копируем скомпилированные утилиты! Мы возьмем только ubiformat, а остальные работают без ошибок из сборки busybox. Скопируйте файл из MTD-Utils 'sbin/ubiformat' в файловую систему 'busybox/_install/usr/sbin', загрузите полученную файловую систему на Круиз-В. Далее, создадим временную папку ubidisk / # mkdir ubidisk Создадим UBI раздел на разделе NAND ubiformat /dev/mtd4 ubiattach /dev/ubi_ctrl -m 4 ubimkvol /dev/ubi0 -s 235MiB -N rootfs mount -t ubifs ubi0:rootfs ubidisk Теперь можно перейти в директорию ubidisk и создавать и изменять файлы там и всё это будет записано как UBIFS. Запишем файловую систему Debian 7.5 на UBI раздел в NAND: cd ubidisk/ tar xf /mnt/armhf-rootfs-debian-wheezy.tar Теперь включим консоль, для этого надо в конец файла etc/inittab добавить строку: T0:23:respawn:/sbin/getty -L ttymxc0 115200 vt102 Сохраняем изменения и можно просто перезагрузить плату и ничего не трогать. После загрузки должна загрузится ОС Debian. ===== Конфигурация BOOT_CFG ===== Для старта процессора с NAND необходимо обеспечить следующее состояние резисторов на плате: BOOT_CFG1 = 0x80 | R88 | нет | | R89 | нет | | R87 | нет | | R90 | нет | | R132 | нет | | R92 | нет | | R129 | нет | ^ R95 ^ ДА | BOOT_CFG2 = 0x02 | R93 | нет | ^ R91 ^ ДА | | R96 | нет | | R94 | нет | | R131 | нет | | R130 | нет | | R97 | нет | | R86 | нет | То есть получится "загрузка с NAND, 64 страницы в секторе"