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

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


wiki:video-voip3

Это старая версия документа.


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

Загрузка платы

Подготовка

Для записи загрузчика, ядра и файловой системы потребуется носитель 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. *

Запись файла ядра

Использование ключа '-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 страницы в секторе»

wiki/video-voip3.1467129272.txt.gz · Последние изменения: 2016/06/28 18:54 — maxx