如何正確開發 linux bsp?

1. bsp 開發是不是給一個新的 arm linux 系統開發能夠支持板子外設的 linux 內核源碼 的過程?

2. bsp 開發的任務界限是什麼呢?即哪些內容開發屬於這部分任務,而不是 bootloder 和 根文件系統開發部分的任務?(是否包含內核移植,需要重新初始化cpu,內存,哪些關鍵必要外設,和網路之類的用於內核中?)

3. 有沒有主流的開發流程呢?(是不是應先解決 cpu 內存,再找已有驅動的代碼,再開發特殊外設驅動,再規範源碼結構,這種流程?)


簡單點說Linux BSP開發就是把Linux在某個板子上跑起來。

這個板子不一定是ARM的,可能是任何一個arch的,比如PPC/MIPS,甚至x86也可以算上,還有一些比較少見的像SPARC/ColdFire之類的。

題主可能比較疑惑BSP應該開發到什麼程度是吧?也就是說要把Linux跑到什麼程度?是有個串口能跑shell就可以了?還是網路、USB什麼的都要全弄起來?

據我了解(我隔壁就是BSP Team),跑到什麼程度,看公司(客戶、老闆)的開發要求,同時也看公司有沒有上層的開發人員專門管這些事情。

比如,你這個板子只用在很簡單的環境里,網路、USB都不需要,那麼串口能起來就基本可以了。但是如果恰好客戶有要求網路必須是OK的,那做BSP的人一般就要把網路也調通,如果客戶要求USB能用,那麼做BSP的人可能也要弄USB。

實際開發過程中,BSP開發的邊界在哪,看老闆、客戶的要求。

一般來說開發流程,初始化CPU、內存這些是第一步,然後是串口、shell、文件系統也要起來,然後就是根據需求是否要調一些基本的驅動了。

我見過有些板子,客戶只要最基本的東西,這種BSP開發很輕鬆,但是有些板子,連USB-OTG都要起來,那麼開發BSP的人就很苦逼,因為USB-OTG太難搞了,但沒辦法,只能硬著頭皮去學、去搞。

BSP開發的邊界就是沒邊界,當然,有些公司比較好,會專門招幾個驅動工程師,這種公司里,開發BSP的人會稍微輕鬆點,搞不定的就丟給寫驅動的人了——就是我這樣的。


就我的有限經驗:

  1. 不僅是 ARM,也有 MIPS 或者 PPC 等架構的 SoC;BSP 開發是在原廠給出的開發包基礎上,根據硬體的不同修改配置(以及代碼)和驅動最小系統(CPU、匯流排、串口、內存、快閃記憶體)。
  2. (3.)根據維基百科相關信息,BSP 開發的工作(也是流程)包括:
  • 初始化 CPU
  • 初始化匯流排
  • 初始化中斷控制器
  • 初始化時鐘
  • 初始化內存設置
  • 配置地址段
  • 從快閃記憶體中載入 Bootloader 到內存並運行

參考:

Board support package


簡單來說就是在開發版上運行bootloader,初始化硬體,根據需要引導啟動操作系統。說白了就是讓你寫bootloader 和硬體驅動。

目前領導對要求我寫的 bsp 要完成的工作。


推薦閱讀:

linux mmap匿名映射的作用是什麼?
segfault at xxx的地址是物理地址還是線性地址,objdump出來的呢?
Linux的啟動過程中,滿足什麼條件可以不用initramfs而直接掛載/?
ELF文件裡面section的虛擬地址是如何在鏈接(link)時確定的?

TAG:操作系統 | Linux | 嵌入式系統 | Linux內核 | 驅動程序開發 |