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