天天看點

手把手帶你做LiteOS的樹莓派移植

摘要:樹莓派是英國的慈善組織“Raspberry Pi 基金會”開發的一款基于arm的微型電腦主機闆。本文介紹基于LiteOS的樹莓派移植過程。

作者: Lionlace 。

樹莓派是英國的慈善組織“Raspberry Pi 基金會”開發的一款基于arm的微型電腦主機闆。本文介紹基于LiteOS的樹莓派移植過程。

開發闆:Raspberry Pi 2 Model B(樹莓派2B)

CPU:Broadcom BCM2836

主頻:900MHz

記憶體:1GB

GPU:VideoCore IV GPU

本實驗使用了Raspberry Pi 2 Model B開發闆、USB轉TTL子產品、SDcard和讀卡器。

本實驗需要先按照碼雲上的LiteOS教程搭建好linux環境(make、arm-none-eabi編譯工具鍊)。環境搭建教程:https://gitee.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Build_and_IDE.md

本實驗需要下載下傳官方的鏡像制作工具(Raspberry Pi Imager),下載下傳位址:https://www.raspberrypi.org/software/

在targets目錄下新增Raspberry_Pi2B目錄,參考與cortex-A7架構差異較小的realview-pbx-a9的啟動流程進行移植。

将realview-pbx-a9目錄下的reset_vector.S和main.c拷貝到Raspberry_Pi2B目錄下并将reset_vector.S重命名為los_startup_gcc.S。

将realview-pbx-a9目錄下的board.ld和liteos.ld中内容合并到Raspberry_Pi2B目錄下liteos.ld檔案中。

拷貝realview-pbx-a9目錄下include、os_adapt檔案夾到Raspberry_Pi2B目錄下,并删除不需要的dma相關頭檔案include/asm/dma.h。

在los_startup_gcc.S檔案中增加關閉SMP和MMU的代碼。

關閉SMP功能

手把手帶你做LiteOS的樹莓派移植

上表是ACTLR(Auxiliary Control Register)寄存器bit6功能描述資訊,了解更多寄存器相關資訊可以參考Cortex-A7 MPCore Technical Reference Manual。

關閉MMU的功能

手把手帶你做LiteOS的樹莓派移植

上表是SCTLR (System Control Register)寄存器bit0功能描述資訊,了解更多寄存器相關資訊可以參考Cortex-A7MPCore Technical Reference Manual。

删除調用SMP相關函數

删除los_startup_gcc.S中的enable_scu和secondary_cpu_start。

以上前兩行代碼用于設定CP10和CP11的通路權限,後兩行用于設定寄存器FPEXC的EN位來使能FPU。

注:在arm的協處理器設計中,最多可以支援16個協處理器,通常被命名為cp0~cp15。

手把手帶你做LiteOS的樹莓派移植

上表為寄存器CPACR bit20-23功能描述資訊,了解更多寄存器相關資訊可以參考Cortex-A7 MPCore Technical Reference Manual。

樹莓派啟動時首先加載SD卡中的start.elf檔案,該程式會讀取SD卡中的config.txt檔案内容,該檔案記錄了一些配置資訊。如果沒有設定啟動位址和啟動檔案,則預設會加載kernel8.img檔案,該檔案是aarch64編譯的程式,啟動位址為0x80000。如果SD卡中無kernel8.img鏡像檔案,則會加載kernel7.img鏡像檔案,該檔案是32位編譯器編譯的程式,啟動位址為0x8000。樹莓派2B的cpu是32位架構,是以設定liteos.ld檔案中啟動位址為0x8000。

樹莓派2B啟動檔案los_startup_gcc.S中隻設定了SVC模式的sp寄存器,新增cpuInit函數來初始化其他模式的sp指針。如下所示:

以上代碼定義OS_SYS_MEM_ADDR為動态記憶體起始位址,LOS_HEAP_ADDR_END為動态記憶體結束位址,OS_SYS_MEM_SIZE為動态記憶體大小。

樹莓派2B原理圖引出了mini_uart序列槽TXD0、RXD0,對應的引腳為GPIO14、GPIO15,如下圖所示:

手把手帶你做LiteOS的樹莓派移植

建立usart.c和usart.h檔案,在usart.c中編寫序列槽初始化函數UartInit,并實作uart_debug.c檔案中uart_getc、uart_hwiCreate、uart_write接口,實作printf函數從序列槽輸出。

樹莓派2B的中斷屬于bcm特定的中斷控制器。在drivers/interrupt目錄下新增arm_control.c檔案,并在該檔案中實作HwiControllerOps結構體内的回調函數。

手把手帶你做LiteOS的樹莓派移植

以上表格是interrupt寄存器偏移位址,讀者想了解詳細寄存器相關資訊請參考官方晶片手冊。

樹莓派2B通過Timer(arm side)來觸發systick中斷。具體操作細節請參考檔案:drivers\timer\rasp_systick.c。

以上代碼配置定時器Timer為每1ms觸發一次systick中斷。

手把手帶你做LiteOS的樹莓派移植

以上是Timer寄存器偏移位址,讀者想了解詳細寄存器相關資訊請參考官方晶片手冊。

分别修改以下路徑Makefile(詳情請參考gitee倉庫對應檔案):driver/timer/Makefiledriver/interrupt/Makefiletargets/Raspberry_Pi2B/Makefile

在根目錄下Makefile中添加指令$(OBJCOPY) -O binary $(OUT)/[email protected] $(OUT)/kernel7.img,用來将生成的elf檔案轉換生成kernel7.img檔案。

使用Raspberry Pi Imager工具制作Raspberry Pi系統。

手把手帶你做LiteOS的樹莓派移植

Raspberry Pi Imager 下載下傳連結:https://www.raspberrypi.org/software/

将編譯生成的kernel7.img檔案替換掉SDcard中kernel7.img檔案。

将寫入鏡像檔案的SDcard插入樹莓派2B中并上電,樹莓派2B即可運作LiteOS系統。運作結果如下:

至此,LiteOS系統成功啟動和運作。該移植工程已經在Gitee LiteOS社群上線,相關代碼連結位址為:​​https://gitee.com/LiteOS/LiteOS/tree/master/targets/Raspberry_Pi2B​​

[1] Raspberry Pihardware - Raspberry Pi Documentation:https://www.raspberrypi.org/documentation/hardware/raspberrypi/README.md

[2] 樹莓派官方晶片手冊:

https://datasheets.raspberrypi.org/bcm2835/bcm2835-peripherals.pdf

[3] Cortex-A7 MPCore Technical Reference Manual:

https://developer.arm.com/documentation/ddi0464/f?lang=en

​​​​