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。