U-Boot и uClinux

U-Boot и uClinux.

Старт MPU ARM. SAMA5D3 — Xplained.

U-Boot и uClinux.

U-Boot.

U-Boot – универсальный загрузчик ориентированный на встраивание систем на базе архитектур ARM, NIOS II, MIPS и других. Может быть установлен в загрузочную ПЗУ и от туда запущен, является загрузчиком второго уровня (в основном). U-boot ориентирован на запуск Linux, для микроконтроллеров uClinux(может быть использован для загрузки обычных прошивок).

Статья посвящена U-Boot и uClinux. Основной тип операционных систем используемых для микроконтроллеров остается RTOS. При наличии большой бизнес логики используют Linux. Для обеспечения реального времени применяют AMP, RTLinux и др. U-Boot (Universal bootloader) — универсальный загрузчик.

Запуск U-boot на одной из поддерживаемых им плат обычно не требует редактирования исходного кода. Зная, что файл настроек include/configs/”Платформа.h” уже составлен, необходимо выбрать нужную конфигурацию, скомпилировать и записать получившийся образ на загрузочный носитель (NAND, NOR т.д.).

Что касается микроконтроллеров, необходимо значительный объем памяти на микроконтроллере, или поддержка нативной адресации ПЗУ (ROM) со стороны внешней памяти микроконтроллера, в случае отсутствии последнего, bin файл загружается из внешней памяти (NOR, SD и др.) в RAM с нативной адресацией.

Важность Das U-Boot в Embedded Linux системах достаточно лаконично изложена в книге Embedded Linux системы, Карим Ягмур. Текст о U-Boot начинается словами: «Хотя существует довольно много других загрузчиков, Das U-Boot, универсальный загрузчик, возможно, является самым богатым, самым гибким и наиболее активно развивающимся из загрузчиков с открытым исходным кодом». U-boot может использовать следующие файловые системы:

  • Cramfs
  • ext2
  • ext3
  • ext4
  • FAT
  • FDOS
  • JFFS2
  • ReiserFS
  • UBIFS

Для работы с U-Boot и uClinux для микроконтроллеров понадобиться репозиторий с github u-boot.

Все эксперименты будут происходит на базе данного репозитория, в качестве отладочной платы используется stm32f746g-disco и операционная система ubuntu 14.04 (можно использовать иные дистрибутивы Linux).

Для сборки u-boot нам понадобиться GNU Cross-Build Tools (возможно вам придется еще установить ia32-libs).

~$ sudo apt-get install ia32-libs
~$ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0
~$ sudo apt-get install gcc-multilib

Распаковываем Cross-Build Tools и добавляем его в PATH.

~$ gedit ~/.bashrc

В конце файла добавляем строку.

export PATH=`pwd`/arm-2010q1/bin:$PATH

Основные директории для нашей отладочной платы:

u-boot-linux-cortexm-1.14.3/board/stm/stm32f746-discovery
u-boot-linux-cortexm-1.14.3/include/asm-arm/arch-stm32
u-boot-linux-cortexm-1.14.3/cpu/arm_cortexm3/stm32
u-boot-linux-cortexm-1.14.3/drivers/gpio
u-boot-linux-cortexm-1.14.3/drivers/net
u-boot-linux-cortexm-1.14.3/drivers/serial

Для примера изменим файл board.c функцию checkboard.

/*
 * Dump pertinent info to the console.
 */
int checkboard(void)
{
	printf("Board: STM32F746 Discovery Rev %s, www.mcu.by\n",
		CONFIG_SYS_BOARD_REV_STR);

	return 0;
}

В директории lib-arm нужно открыть файл config.mk и изменить компилятор на arm-uclinuxeabi (можно передать как аргумент при сборке системы).

CROSS_COMPILE ?= arm-uclinuxeabi-

Сохраняем файл и в корне каталога выполняем следующею команду.

$ make stm32f746-discovery_config
Configuring for stm32f746-discovery board...

$ make
...
arm-uclinuxeabi-objcopy -O srec u-boot u-boot.srec
arm-uclinuxeabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
~/uClinux/u-boot-linux-cortexm-1.14.3$ 

Затем находим необходимый VCP(COM-порт).

$ dmesg | grep tty
[15026.283665] usb 3-4: FTDI USB Serial Device converter now attached to ttyUSB0
[15156.039945] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
$ lsusb
Bus 003 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Затем bin файл зашиваем в плату с помощью openocd.

Запускаем sudo minicom -s или запускаем sudo gtkterm и

Embedded Linux для микроконтроллеров. U-Boot.
подключить VCP к Serial 6.

U-Boot 2010.03 (Feb 08 2016 - 10:33:19)

CPU  : STM32F7 (Cortex-M7)
Freqs: SYSCLK=200MHz,HCLK=200MHz,PCLK1=50MHz,PCLK2=100MHz
Board: STM32F746 Discovery Rev 1.A, www.mcu.by
DRAM:   8 MB
In:    serial
Out:   serial
Err:   serial
Net:   STM32_MAC
Hit any key to stop autoboot:  0

Для читателей которые еще не использовали openocd, переходим по ссылке openocd и скачиваем данный репозиторий к себе на компьютер.

$ openocd/0.10.0-201601101000-dev/bin/openocd --version
GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:31)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
 
$ sudo ./openocd/0.10.0-201601101000-dev/bin/openocd -f openocd/0.10.0-201601101000-dev/scripts/board/stm32f7discovery.cfg 
GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:31)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Info : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.216787
Info : stm32f7x.cpu: hardware has 8 breakpoints, 4 watchpoints

sudo ./openocd/0.10.0-201601101000-dev/bin/openocd -f openocd/0.10.0-201601101000-dev/scripts/board/stm32f7discovery.cfg -c "program /home/and1chaosmario/u-boot-stm32f746g-disco/u-boot.bin exit 0x08000000"
GNU ARM Eclipse 64-bits Open On-Chip Debugger 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:31)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Info : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.216787
Info : stm32f7x.cpu: hardware has 8 breakpoints, 4 watchpoints
stm32f7x.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08000374 msp: 0x20020000
** Programming Started **
auto erase enabled
Info : device id = 0x10016449
Info : flash size = 1024kbytes
wrote 98304 bytes from file /home/and1chaosmario/u-boot-stm32f746g-disco/u-boot.bin in 3.583859s (26.787 KiB/s)
** Programming Finished **
shutdown command invoked

или

and1chaosmario@and1chaosmario-Aspire-V5-552G:~$ sudo /home/and1chaosmario/eclipse_for_arm/openocd/0.10.0-201601101000-dev/bin/openocd -f /home/and1chaosmario/eclipse_for_arm/openocd/0.10.0-201601101000-dev/scripts/board/stm32f7discovery.cfg -c  "program /home/and1chaosmario/u-boot-stm32f746g-disco/u-boot.bin exit 0x08000000"

uClinux.

Следующим моментом будет настройка tftp сервера.

sudo apt-get install openbsd-inetd tftpd tftp

Настройка tftpd.

sudo gedit /etc/inetd.conf

Аргумент /srv/tftp команды in.tftpd указывает на каталог в котором будут храниться файлы TFTP сервера. Заменим /srv/tftp на /tftpboot.

tftp		dgram	udp	wait	nobody	/usr/sbin/tcpd	/usr/sbin/in.tftpd /tftpboot

Создадим директорию /tftpboot:

sudo mkdir /tftpboot

Чтобы новые настройки вступили в силу, перезапустим службу inetd:

sudo /etc/init.d/openbsd-inetd restart

нужно записать в директорию с проектом networking.uImage (скачиваемым образ с emcraft) и настраиваем окружение для u-boot (нужно воспользоваться командой setenv, saveenv, printenv).

STM32F746-DISCO> printenv
bootargs=stm32_platform=stm32f7-disco console=ttyS5,115200 panic=10
bootcmd=run netboot
baudrate=115200
hostname=stm32f7-disco
loadaddr=0xC0007FC0
args=setenv bootargs stm32_platform=stm32f7-disco console=ttyS5,115200 panic=10
addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:eth0:off
envmaddr=08040000
stdin=serial
netboot=tftp ${image};run args addip;bootm
envmboot=run args addip;bootm ${envmaddr}
envmupdate=tftp ${image};cptf ${envmaddr} ${loadaddr} ${filesize}
ethact=STM32_MAC
netmask=255.255.255.0
image=networking.uImage
ipaddr=172.17.6.136
ethaddr=c0:b1:3d:88:88:89
bootdelay=5
gatewayip=172.17.6.1
serverip=172.17.6.1

Environment size: 675/4092 bytes
STM32F746-DISCO>

U-Boot и uClinux.

U-Boot и uClinux.

U-Boot и uClinux.

Итого: установили U-Boot и uClinux, собрали исполняемый bin файл и запустили uClinux.