====== Linux SDK для AM437x Sitara ======
//Данное руководство относится к версии SDK: PROCESSOR-SDK-LINUX-AM437X 05_02_00_10//
Компиляция выполнялась на машине Ubuntu 16.04.2 LTS 64bit
===== Скачиваем необходимые ресурсы =====
Исходные тексты ядра и файловой системы, компилятор, а также уже скомпилированные бинарники для процессора AM437x находятся на странице: [[http://software-dl.ti.com/processor-sdk-linux/esd/AM437X/latest/index_FDS.html]]
Компилировать всё будем сами из исходных текстов, поэтому бинарные (уже скомпилированные версии) скачивать не будем.
1. Скачиваем компилятор
wget https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz
2. Скачиваем SDK в исходниках
wget http://software-dl.ti.com/processor-sdk-linux/esd/AM437X/05_02_00_10/exports/am437x-evm-linux-sdk-src-05.02.00.10.tar.xz
===== Распаковка исходников =====
Компилятор можно распаковать в локальную директорию, где будет происходить сборка, либо в директорию '/opt' (потребуются права root). Установка в локальную директорию "лучше" тем, что не загрязняет корень файловой системы, но хуже тем, что, если вам потребуется использовать этот же компилятор для сборки другого программного пакета, то пути придется прописывать в директорию, где этот компилятор распаковали, либо заново распаковывать компилятор в другой директории и тем самым плодить ненужные копии одного компилятора. Распаковка в '\opt' дает возможность всегда ссылаться на один экземпляр компилятора любому пользователю, зарегистрированному в системе (другой пользователь не сможет использовать компилятор, распакованный в домашней директории другого пользователя).
Сначала создадим директорию, где будем компилировать SDK:
mkdir am437x-evm-linux-sdk-src-05.02.00.10
cd am437x-evm-linux-sdk-src-05.02.00.10
Распакуем компилятор в локальной директории (исправьте абсолютный путь к реальному положению ваших архивов):
tar xf /media/winshare/am43xx/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz
У нас появился архив 'gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf'. Пропишем пути к GCC:
export CC=`pwd`/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
Проверим работает ли компилятор:
${CC}gcc -v
Using built-in specs.
COLLECT_GCC=/home/maxx/Projects/am437x/am437x-evm-linux-sdk-src-05.02.00.10/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/storage/Projects/am437x/am437x-evm-linux-sdk-src-05.02.00.10/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/7.2.1/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: '/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/snapshots/gcc.git~linaro-7.2-2017.11/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/sysroots/arm-linux-gnueabihf --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu
Thread model: posix
gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)
GCC выдал свою версию, поэтому всё в порядке. Теперь мы можем обращаться к компилятору через '${CC}'
2. Исходники SDK
Распакуем исходники SDK в локальную директорию рядом с SDK
tar xf /media/winshare/am43xx/am437x-evm-linux-sdk-src-05.02.00.10.tar.xz
Появилась директория 'board-support', в которой находятся:
board-support/extra-drivers:
cmem-mod-4.15.00.02+gitAUTOINC+0f39ed469f cryptodev-module-1.9 ti-sgx-ddk-km-1.14.3699939 uio-module-drv-2.2.1.0+gitAUTOINC+bda9260f22
board-support/linux-4.14.79+gitAUTOINC+bde58ab01e-gbde58ab01e:
arch certs CREDITS Documentation firmware include ipc Kconfig lib Makefile net samples security ti_config_fragments tools virt
block COPYING crypto drivers fs init Kbuild kernel MAINTAINERS mm README scripts sound TISDK-README usr
board-support/u-boot-2018.01+gitAUTOINC+313dcd69c2-g313dcd69c2:
api board common configs doc drivers env fs Kbuild lib MAINTAINERS net README snapshot.commit TISDK-README
arch cmd config.mk disk Documentation dts examples include Kconfig Licenses Makefile post scripts test tools
u-boot находится в директории **'u-boot-2018.01+gitAUTOINC+313dcd69c2-g313dcd69c2'**, а ядро Linux в **'linux-4.14.79+gitAUTOINC+bde58ab01e-gbde58ab01e'**
===== Компиляция =====
Дальнейшие действия будут в директории board-support:
cd board-support
==== Компиляция u-boot ====
SDK от Texas Instruments не поддерживает модуль uSomIQ, //хотя и легко запускается, если убрать чтение идентификатора платы из встроенной EEPROM//. Сначала скачаем и применим исправления исходных кодов для модуля uSomIQ:
wget http://mentorel.com/downloads/usomiq/patches/add-am437x-usomiq-u-boot-sdk-05.02.00.10.patch
Заходим в директорию 'u-boot-2018.01+gitAUTOINC+313dcd69c2-g313dcd69c2' и выполняем команду:
cd u-boot-2018.01+gitAUTOINC+313dcd69c2-g313dcd69c2
patch -p1 < ../add-am437x-usomiq-u-boot-sdk-05.02.00.10.patch
Теперь непосредственно компиляция:
make ARCH=arm distclean
make ARCH=arm am43xx_evm_usomiq_defconfig
make ARCH=arm CROSS_COMPILE=${CC}
Если всё сделано правильно, то появятся два файла: **MLO** и **u-boot.img**. Эти файлы надо будет скопировать на FAT раздел карточки SD
==== Компиляция ядра ====
SDK от Texas Instruments не поддерживает модуль uSomIQ, поэтому сначала скачаем и применим исправления исходных кодов для модуля uSomIQ:
wget http://mentorel.com/downloads/usomiq/patches/add-am437x-usomiq-kernel-sdk-05.02.00.10.patch
cd linux-4.14.79+gitAUTOINC+bde58ab01e-gbde58ab01e
patch -p1 < ../add-am437x-usomiq-kernel-sdk-05.02.00.10.patch
Непосредственно компиляция
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} tisdk_am437x-evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC} zImage modules dtbs
Если ваш компьютер имеет несколько процессорных ядер (не путать с логическими ядрами), то можно ускорить компиляцию запустив компилятор на каждом из ядер. Для этого компилятору gcc надо передать параметр **-j4**, если ядер 4, или 8, если ядер 8. То есть, команда для компиляции ядра будет выглядеть так (местоположение -j8 не имеет значения):
make ARCH=arm CROSS_COMPILE=${CC} zImage modules dtbs -j8
==== Подготовка SD карты ====
Возьмите SD карту объемом не менее 2ГБ. Далее разобьем общее пространство карты на два:
* boot - раздел fat32 для u-boot
* rootfs - раздел ext4 для файловой системы
//Разбивку карты выполняем в ОС Linux!//
Вставляете SD карту в ПК и определяете как к ней обращаться:
dmesg | tail
Появится что-то похожее:
[530052.702577] EXT4-fs (sdc2): mounted filesystem with ordered data mode. Opts: (null)
[535222.048372] sd 2:0:0:0: [sdc] 15431680 512-byte logical blocks: (7.90 GB/7.36 GiB)
[535222.056436] sdc: sdc1 sdc2
В данном примере карта уже разбита на два раздела, но нам интересно другое: "sdc: sdc1 sdc2". Теперь мы знаем, что карта в системе обозначена как '/dev/**sdc**'. Если бы карта имела один раздел или вовсе их не имела, то всё равно "sdc" мы бы увидели.
Итак, cначала удалим все разделы с карты:
sudo dd if=/dev/zero of=/dev/sdc bs=1M count=20
Далее, чтобы выполнить разметку карты выполняем команду:
sudo sfdisk --version
Если версия sfdisk >= 2.26.x (sfdisk from util-linux 2.27.1), то выполняем команду:
sudo sfdisk /dev/sdc <<-__EOF__
1M,12M,0xE,*
13M,,,-
__EOF__
На карте 16ГБ получилась такая карта разделов:
Device Boot Start End Sectors Size Id Type
/dev/sdc1 * 2048 26623 24576 12M e W95 FAT16 (LBA)
/dev/sdc2 26624 30965759 30939136 14.8G 83 Linux
Теперь форматируем разделы:\\
* Форматируем раздел 1 как "FAT" командой
sudo mkfs.vfat -F 16 -n BOOT /dev/sdc1
* Форматируем раздел 2 как "ext4" командой
sudo mkfs.ext4 -L rootfs /dev/sdc2
**Монтирование разделов**
Если в вашей системе не поддерживается автоматическое монтирование разделов носителей, то делаем это вручную:
sudo mkdir -p /media/boot
sudo mkdir -p /media/rootfs
sudo mount /dev/sdc1 /media/boot
sudo mount /dev/sdc2 /media/rootfs
==== Файловая система ====
Файловую систему скачаем готовую для SDK (размер архива 2ГБ):
wget http://software-dl.ti.com/processor-sdk-linux/esd/AM437X/05_02_00_10/exports/am437x-evm-linux-sdk-bin-05.02.00.10.tar.xz
Сначала распакуем весь архив:
tar xf am437x-evm-linux-sdk-bin-05.02.00.10.tar.xz
Получаем директорию "ti-processor-sdk-linux-am437x-evm-bin-05.02.00.10" с содержимым:
cd ti-processor-sdk-linux-am437x-evm-bin-05.02.00.10
ls
bin board-support filesystem Rules.make setup.sh
В данном архиве содержится несколько файловых систем, включая скомпилированные бинарники u-boot и ядро Linux для отладочных плат от Texas Instruments (для uSomIQ они не подойдут). Нас интересует директория **filesystem**:
arago-base-tisdk-image-am437x-evm.tar.xz
arago-base-tisdk-image-am437x-evm.ubi
arago-tiny-image-am437x-evm.tar.xz
arago-tiny-image-am437x-evm.ubi
tisdk-docker-rootfs-image-am437x-evm.tar.xz
tisdk-docker-rootfs-image-am437x-evm.ubi
tisdk-rootfs-image-am437x-evm.tar.xz
tisdk-rootfs-image-am437x-evm.ubi
Запишем на нашу SD карту файловую систему **tisdk-rootfs-image-am437x-evm.tar.xz**
cd filesystem
sudo tar xf tisdk-rootfs-image-am437x-evm.tar.xz -C /media/rootfs
===== Запись загрузчиков на карту =====
=== Запись u-boot на карту ===
Заходим в директорию u-boot 'u-boot-2018.01+gitAUTOINC+313dcd69c2-g313dcd69c2', далее выполняем команды:
sudo cp MLO /media/boot
sudo cp u-boot.img /media/boot
=== Запись ядра, модулей и dtb ===
Заходим в директорию ядра Linux 'linux-4.14.79+gitAUTOINC+bde58ab01e-gbde58ab01e', далее выполняем команды:
sudo cp arch/arm/boot/zImage /media/rootfs/boot/
sudo make ARCH=arm INSTALL_MOD_PATH=/media/rootfs modules_install
sudo cp arch/arm/boot/dts/am437x-usomiq.dtb /media/rootfs/boot/
Далее нужно обязательно отмонтировать оба раздела, иначе данные на карте не сохранятся:
sudo umount /dev/sdc1 /dev/sdc2
Теперь карту можно извлечь из ПК и загружать с нее модуль uSomIQ AM437x. Загрузка происходит автоматически без дополнительных действий. Логин для входа в Linux - root без пароля
===== Автономный старт с NAND =====
=== Запись загрузчика u-boot ===
Запишем идентификатор платы в EEPROM, установленную на плате модуля. Этот шаг необязателен, потому что данная версия u-boot игнорирует пустой или отсутствующий EEPROM, но, всё же, будет выполнять разный сценарий загрузки в зависимости от разных идентификаторов платы.
=> run eeprom_dump
Setting bus to 0
0000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Видно, что память EEPROM чистая, если модуль предварительно не прошивали. Запишем идентификатор и посмотрим на изменения:
=> run eeprom_usomiq
=> run eeprom_dump
Setting bus to 0
0000: aa 55 33 ee 41 4d 34 33 55 53 4f 4d ff ff ff ff .U3.AM43USOM....
0010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Теперь это однозначно uSomIQ AM437x.\\
Смотрим какие разделы присутствуют на флеш NAND:
=> mtd
device nand0 , # parts = 10
#: name size offset mask_flags
0: NAND.SPL 0x00040000 0x00000000 0
1: NAND.SPL.backup1 0x00040000 0x00040000 0
2: NAND.SPL.backup2 0x00040000 0x00080000 0
3: NAND.SPL.backup3 0x00040000 0x000c0000 0
4: NAND.u-boot-spl-os 0x00080000 0x00100000 0
5: NAND.u-boot 0x00100000 0x00180000 0
6: NAND.u-boot-env 0x00040000 0x00280000 0
7: NAND.u-boot-env.backup10x00040000 0x002c0000 0
8: NAND.kernel 0x00700000 0x00300000 0
9: NAND.file-system 0x1f600000 0x00a00000 0
active partition: nand0,0 - (NAND.SPL) 0x00040000 @ 0x00000000
defaults:
mtdids : nand0=nand.0
mtdparts: mtdparts=nand.0:256k(NAND.SPL),256k(NAND.SPL.backup1),256k(NAND.SPL.backup2),256k(NAND.SPL.backup3),512k(NAND.u-boot-spl-os),1m(NAND.u-boot),256k(NAND.u-boot-env),256k(NAND.u-boot-env.backup1),7m(NAND.kernel),-(NAND.file-system)
На всякий случай стираем флеш:
=> nand erase.chip
NAND erase.chip: device 0 whole chip
Erasing at 0x1ffe0000 -- 100% complete.
OK
В ходе выполнения стирания могут появляться сообщения о "плохих" блоках. Это особенность NAND флеш и ничего страшного нет, блоки будут помечены как плохие и это никак не повлияет на работу устройства в будущем.
mmc rescan
load mmc 0 ${loadaddr} MLO
nand write ${loadaddr} NAND.SPL
nand write ${loadaddr} NAND.SPL.backup1
Запись файла u-boot.img
load mmc 0 ${loadaddr} u-boot.img
nand write ${loadaddr} NAND.u-boot
Запись dtb файла
setenv devtype mmc
run findfdt
run loadfdt
nand write ${fdtaddr} NAND.u-boot-spl-os
Запись файла ядра
run loadimage
nand write ${loadaddr} NAND.kernel
=== Запись файловой системы ===
//Предварительно надо взять готовый образ файловой системы из архива am437x-evm-linux-sdk-bin-05.02.00.10, например, маленький образ 'arago-tiny-image-am437x-evm.tar.xz', чтобы он точно уместился во флеш памяти.//
теперь набираем команду 'boot' и загружаемся в Linux. Список разделов на флеш памяти можно посмотреть с помощью команды mtdinfo:
root@am437x-usomiq:~# mtdinfo
Count of MTD devices: 10
Present MTD devices: mtd0, mtd1, mtd2, mtd3, mtd4, mtd5, mtd6, mtd7, mtd8, mtd9
Sysfs interface supported: yes
Видим, что последний раздел **mtd9** - это именно раздел под файловую систему. Теперь, с помощью ubiutils создаем файловую систему на флеш памяти:
ubiformat /dev/mtd9 -s 2048 -O 2048
ubiattach /dev/ubi_ctrl -m 9 -O 2048
ubimkvol /dev/ubi0 -s 450MiB -N rootfs
mount -t ubifs ubi0:rootfs /mnt
Директория '/mnt' теперь это отформатированный раздел на флеш памяти NAND. Теперь запишем файловую систему, которую предварительно записали на SD карту в домашнюю директорию пользователя 'root':
cd /mnt
tar xf ~/arago-tiny-image-am437x-evm.tar.xz
Теперь можно набрать команду reboot или poweroff, извлечь карту и загружаться непосредственно с модуля без внешнего накопителя.