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

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


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

Ядро

Ядро макета №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

wiki/video-voip3.1467059195.txt.gz · Последнее изменение: 2016/06/27 23:26 — maxx