2009年11月9日 星期一

如何porting linux kernel給一顆新的ARM CPU

ARM CPU是目前使用最多的embedded CPU, 所以這邊會就我個人經驗來分享如何porting一顆新的ARM CPU Linux platform, 在porting之前有幾項硬體規格必須事先弄清楚:
  • CPU是何種ARM core, 例如arm926, 是V5, V6還是V7等等
  • SoC多少週邊元件在這顆Embedded ARM CPU之內
  • interrupt如何設定及使用, 這裏所指的是interrupt controller
  • timer如何設定及使用
  • DRAM & Flash mapping至CPU那個位置
收集這些資訊之後, 開始要做Linux kernel porting的工作, 以下是它的工作步驟
  • 修改源始碼根目錄的Makefile, 將其中幾個變數做修改如下
ARCH := ARM
CROSS_COMPILE := arm-linux-gnueabi
INSTALL_MOD_PATH := `pwd`/installed_modules
  • 在arch/arm目錄之下建立一個子目錄其名字為mach-開頭, 之後你可以取一個名字, 例如mach-victorcpu, 而在這目錄下的程式皆為HAL層的程式碼
  • 在arch/arm/tools目錄之下有一個文字檔 "mach-types" , 仿照其它CPU的寫法, 你必須定一個ID號碼, 必須是唯一的。
  • 在你建立的mach-victorcpu目錄建立Makefile & Kconfig, 並將你建立的Kconfig檔加入至arch/arm/Kconfig的include之中
  • 在新建mach-victorcpu的新目錄中, 必須幾個檔案而其內容如下:
  • MACHINE_DESCRIPTION
  • interrupt controller initialization
  • timer controller initialization
  • mapping fixed some SoC address to be virtual address, 有些SoC的元件在開機就必須使用到的, 就需要使用事先定對好的方式來設定, 例如timer
  • 若有PCI host, 則必須撰寫其HAL層在此, 而PCI BUS Driver則會在driver/pci的目錄中, 不用撰寫。
  • 若在cahce操作部若有和ARM的標準不同, 則必需撰寫其差異部分的程式在arch/arm/mm的目錄之下。
  • 接下來必需要開始撰寫各個SoC進來元件的device driver, 你要依照硬體的設計來撰寫個別device driver。
以上為porting Linux kernel時非常非常大項分法所需要撰寫的程式說明。