Инструменты пользователя

Инструменты сайта


wiki:video-voip3
no way to compare when less than two revisions

Различия

Показаны различия между двумя версиями страницы.


Предыдущая версия
Последняя версия
wiki:video-voip3 [2016/06/28 18:54] – [Ядро] maxx
Строка 1: Строка 1:
 +====== 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]]
  
 +<code>
 +$ 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
 +</code>
 +Если компиляция завершилась успешно, то должен появится файл **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]]
 +
 +распаковываем и выполняем команды:
 +<code>
 +$ 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
 +</code>
 +Если компиляция выполнена успешно, то получится утилита **kobs-ng** в папке **src**
 +===== imx_usb_loader =====
 +Утилита imx_usb_loader нужна, чтобы загрузить u-boot на абсолютно чистую плату после производства. В каком бы положении не были конфигурационные ноги у "чистого" процессора он всё равно загрузится в режим Serial Downloader, который предоставляет доступ к памяти процессора через USB-OTG
 +<code>
 +$ git clone https://github.com/boundarydevices/imx_usb_loader.git
 +$ cd imx_usb_loader
 +$ make
 +</code>
 +Перед загрузкой убедитесь, что процессор, подключенный к ПК определился верно:
 +<code>
 +$ lsusb
 +Bus 002 Device 007: ID 15a2:0054 Freescale Semiconductor, Inc. i.MX6Q SystemOnChip in RecoveryMode
 +</code>
 +Непосредственно загрузка процессора:
 +<code>
 +$ ./imx_usb  ../tmp/deploy/images/u-boot.imx
 +</code>
 +===== Ядро =====
 +Архив с ядром в папке Dropbox, либо можно отдельно взять board-wand.c и defconfig.
 +
 +<code>
 +cp defconfig .config
 +make ARCH=arm oldconfig
 +</code>
 +===== Файловая система для запуска =====
 +Для первоначального запуска платы можно использовать компактную файловую систему, основанную на 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 на плату:
 +<code>
 +sudo ../imx_usb_loader/imx_usb u-boot.imx
 +</code>
 +На консоле должен появится загруженный 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:
 +<code>
 +/ # run usb_boot
 +</code>
 +Либо все команды ручками:
 +<code>
 +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}
 +</code>
 +На консоле отображается лог загрузки и далее надо нажать Enter, чтобы появилась командная строка.
 +
 +В логе загрузке должны отобразится разделы NAND:
 +<code>
 +[    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"
 +</code>
 +===== Запись u-boot =====
 +Сначала включим питание USB-host:
 +<code>
 +/ # 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
 +</code>
 +Видно, что определился диск /dev/sda1, монтируем его:
 +<code>
 +/ # 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
 +</code>
 +Проверим какие у нас есть разделы на NAND:
 +<code>
 +/ # 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
 +</code>
 +u-boot записывают в самый первый раздел NAND по нулевому адресу, то есть в /dev/mtd0:
 +<code>
 +/ # /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. *
 +</code>
 +===== Запись файла ядра =====
 +Использование ключа '-p' - обязательно
 +<code>
 +/ # 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
 +</code>
 +===== Запись файловой системы =====
 +Для примера загрузим файловую систему 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
 +<code>
 +/ # mkdir ubidisk
 +</code>
 +Создадим UBI раздел на разделе NAND
 +<code>
 +ubiformat /dev/mtd4
 +ubiattach /dev/ubi_ctrl -m 4
 +ubimkvol /dev/ubi0 -s 235MiB -N rootfs
 +mount -t ubifs ubi0:rootfs ubidisk
 +</code>
 +Теперь можно перейти в директорию ubidisk и создавать и изменять файлы там и всё это будет записано как UBIFS. Запишем файловую систему Debian 7.5 на UBI раздел в NAND:
 +<code>
 +cd ubidisk/
 +tar xf /mnt/armhf-rootfs-debian-wheezy.tar
 +</code>
 +Теперь включим консоль, для этого надо в конец файла etc/inittab добавить строку:
 +<code>
 +T0:23:respawn:/sbin/getty -L ttymxc0 115200 vt102
 +</code>
 +Сохраняем изменения и можно просто перезагрузить плату и ничего не трогать. После загрузки должна загрузится ОС 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 страницы в секторе"
wiki/video-voip3.txt · Последнее изменение: 2016/07/14 15:08 — maxx