1. 程式人生 > >ubuntu下zephyr開發環境搭建以及移植到iMX.7S的M4核心的過程

ubuntu下zephyr開發環境搭建以及移植到iMX.7S的M4核心的過程

zephyr開發環境搭建

首先介紹如何在ubuntu16.04 Desktop環境下搭建Zephyr開發環境。構建Zephyr開發環境除了需要正確獲取Zephyr原始碼和Zephyr SDK,還需要正確安裝python3、cmake和git等工具。

更新軟體源

sudo apt-get update
sudo apt-get upgrade

安裝依賴包

sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-pip python3-setuptools python3-wheel xz-utils file make gcc \
  gcc-multilib

Zephyr開發需要的cmake版本是3.8.2或者更高,通過ubuntu軟體倉庫安裝的cmake版本比較低,不能滿足要求。 可通過下面的步驟來安裝3.8.2版本的cmake。

# 安裝cmake到$HOME/cmake
mkdir $HOME/cmake && cd $HOME/cmake
wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh
yes | sh cmake-3.8.2-Linux-x86_64.sh | cat
#將CMake安裝目錄增加到使用者環境變數中,新增到使用者目錄中的.zephyrrc檔案中,也可以新增到使用者目錄.bashrc檔案中
echo "export PATH=$PWD/cmake-3.8.2-Linux-x86_64/bin:\$PATH" >> $HOME/.zephyrrc
#新建一個控制檯,驗證cmake工具是否安裝成功
cmake --version

克隆zephyr程式碼倉庫

把Zephyr原始碼克隆到使用者目錄中,例如克隆至Downloads/zephyr資料夾中。

git clone https://github.com/zephyrproject-rtos/zephyr

安裝Python依賴工具

下面,安裝Zephyr需要的Python包

# 進入zephyr資料夾
cd Downloads/zephyr
# 通過pip3工具安裝其他依賴項
pip3 install --user -r scripts/requirements.txt

安裝zephyr SDK

Zephyr SDK會自動安裝被支援硬體平臺所依賴的編譯、下載、除錯等工具。

# 下載最新的SDK,安裝過程中控制檯會出現Zephyr SDK的安裝路徑的提示,建議把Zephyr SDK安裝到home目錄下
wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.5/zephyr-sdk-0.9.5-setup.run
cd <sdk download directory>
sh zephyr-sdk-0.9.5-setup.run

# 設定環境變數,在使用者目錄.zephyrrc檔案(或.bashr檔案)末尾新增下面幾行程式碼
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=<sdk installation directory>

至此,Zephyr的開發環境已搭建完畢,下面在iMX7s平臺上執行hello world例程

iMX 7S平臺上執行Hello World

Zephyr支援多種ARM平臺,其中包括iMX 7D平臺,7S與7D只是少了一個A7的核心,M4核心並沒有變化,imx7d_m4的裝置樹檔案依然適合imx7s,因此不需要自定義soc和board檔案。

編譯應用程式

# 進入zephyr資料夾
cd Downloads/zephyr
# 設定編譯環境
source zephyr-env.sh
#編譯Hello World例程
cd samples/hello_world
mkdir imx7s_build && cd imx7s_build
cmake -DBOARD=colibri_imx7d_m4 ..
make

這時在imx7s_build/zephyr裡會包含最終的應用程式二進位制檔案(bin格式和elf格式)——zephyr.bin和zephyr.elf(預設的名字)。

使用uboot載入並執行程式

對於M4,Colibri iMX7D沒有QSPI flash。因此,M4需要通過A7核心來啟動。A7核心負責載入M4二進位制應用程式到RAM裡、put M4 in reset、set M4 Program Counter 和 Stack Pointer 以及 get M4 out of reset。這些步驟都由A7在bootloader階段或者linux系統啟動後完成。

M4能夠使用5塊不同的RAMs。

在編譯的時候使用者可以選擇使用哪塊RAM。這個配置選項在boards/arm/colibri_imx7d_m4/colibri_imx7d_m4.dts裝置樹檔案裡,配置引數有“zephyr,flash"(當 CONFIG_XIP=y)和"zephyr,sram"。可以選擇的配置如下:(預設是tcml)

"zephyr,flash"
- &ddr_code
- &tcml_code
- &ocram_code
- &ocram_s_code
- &ocram_pxp_code
- &ocram_epdc_code

"zephyr,sram"
- &ddr_sys
- &tcmu_sys
- &ocram_sys
- &ocram_s_sys
- &ocram_pxp_sys
- &ocram_epdc_sys

下面,通過使用uboot從A7載入zephyr,並M4上執行。

複製zephyr.bin檔案到SD卡的第一分割槽上(可以是FAT檔案系統),並插入imx7s的板子上。上電並停止u-boot執行,設定u-boot環境變數,並從合適的記憶體執行zephyr.bin。

setenv bootm4 'fatload mmc 0:1 $m4addr $m4fw && dcache flush && bootaux $m4addr'
# TCML
setenv m4tcml 'setenv m4fw zephyr.bin; setenv m4addr 0x007F8000'
setenv bootm4tcml 'run m4tcml && run bootm4'
run bootm4tcml
# TCMU
setenv m4tcmu 'setenv m4fw zephyr.bin; setenv m4addr 0x00800000'
setenv bootm4tcmu 'run m4tcmu && run bootm4'
run bootm4tcmu
# OCRAM
setenv m4ocram 'setenv m4fw zephyr.bin; setenv m4addr 0x00900000'
setenv bootm4ocram 'run m4ocram && run bootm4'
run bootm4ocram
# OCRAM_S
setenv m4ocrams 'setenv m4fw zephyr.bin; setenv m4addr 0x00180000'
setenv bootm4ocrams 'run m4ocrams && run bootm4'
run bootm4ocrams
# DDR
setenv m4ddr 'setenv m4fw zephyr.bin; setenv m4addr 0x80000000'
setenv bootm4ddr 'run m4ddr && run bootm4'
run bootm4ddr

程式預設使用串列埠B列印輸出hello world,通過串列埠裝置接入電腦中,執行minicom,可以看到輸出的hello world。