顯示具有 source code 標籤的文章。 顯示所有文章
顯示具有 source code 標籤的文章。 顯示所有文章

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時非常非常大項分法所需要撰寫的程式說明。

2009年10月24日 星期六

如何撰寫在kernel的原始碼中的Kconfig

在整個的kernel source code中是一個非常有模組化的管理,而其中在2.6.x之後使用一種檔設定來管理選擇那些是要static link至kernel,而那些要是要模組化,而其檔名為Kconfig,其散佈在各個原始碼的目錄中,而在這個檔中將會描述各個模組的名稱及可以設定yes, no or module, 它也可以像c語言一樣可以include其它的Kconfig,當你在原始碼的目錄之下執行'make menuconfig'將可以看到以下的書面 :













其中有幾個基本的語法指令如下:
#用這個#開頭的這一行表示為註解,不會有任何作用

comment "這是選單上的說明文字, 無法選擇"

menu "這是一個選單的項目,你可以在定義你的選單名稱,將會和後面的endmenu成為一對"
source "這是引用另一個Kconfig的檔案"
........
endmenu

config USER_DEFINE_NAME #設定完之後將會使用這個名字在前面再加CONFIG_
bool "這個訊息將會被顯示出來,而前面的bool代表是為布林,表示這個選項只有Yes or No的選擇“
depend on OTHER_ITEM #這邊可以使用和C語言相同的邏輯運算,且在這個運算為真時這個選項才可以被選
select OTHER_ITEM #當這個選項USER_DEFINE_NAME為真時,OTTHER_ITEM也會同時被設定
default y #這是設定default value
--- help ---
這是說明文字,可有可無。

在以上bool的設定還有以下設定選項
tristate "這個選項會有三種可以,就是Yes, No or Module,多了一個選項為可以用模組的方式來編繹,所以這通常是在設定驅動程式時所用"
int "這應不難看出是在設定一個數值,可以和另一個設定range來檢查輸入所要的數值範圍是否正確"

以上是常用到的設定選項,其餘還有則較不常用,通常熟悉以上的選項就夠用了。
string "這是可以輸入字串的設定選項"

2009年10月18日 星期日

Linux原始碼存放架構

你可以在http://www.linux.org的網頁取得所有的Linux原始碼,網路上放的通常會是一個壓縮縮檔,當你取得之後你必須將其解壓縮在你將使用的開發平台上,而其中幾個較大的目錄解釋如下:
arch - 存放和CPU相關的基本原始碼,主要是和硬體有關,例如cache,mmu,interrupt等等
+- arm - ARM CPU相關的原始碼,以及用它做的的主板,在這個目錄之下所放的程式主要為HAL的程式碼
++- default - 這是放每一個平台的初始設定
++- kernel ﹣這是kernel程式的進入點,以及中斷程式的進入點
++- boot ﹣這是在build kernel時的link描述檔以及解壓縮的程式碼
++- mm ﹣ 這是記憶體處理的最底層程式,以及cache處理程式
++- lib ﹣ 這是一些公共的kernel library
++- match-xxxx - 這是各家平台的一些初始化程式
+- x86 - x86 CPU相關的原始碼
block - 一些區塊的驅動程式, 例如IDE, CD-ROM
crypto - 有關加解密的library,給kernel使用
Documentation - 存放各種說明文件
drivers - 各種週邊設備的驅動程式
+-char - 種字元型驅動程式, 或者需要tty_io處理的驅動程式
+-net - 網路底層的驅動程式, 泛指ethernet的實體層驅動程弍
+-usb - 存放USB host及常用的USB class device driver
+-mmc - MMC controller及MMC protocol的程式
+-pci - 此為PCI host (包含Card bus, PCI bridge, PCI host等等)
fs - 檔案系統,包含最上層的虛擬檔案系統,給使用者API呼叫使用
include - 所有的include file
init - kernel初始化的主要程式
ipc - kernel內部溝通訊息用
kernel - 主要是核心程式
lib - 在kernel中較常用的library
mm - 有關記憶體管理的程式碼
net - 和網路協定的相關原始碼,而且原則上和硬體無關,例如IPV4,TCP,UDP,ICMP等等
scripts - 在compile kernel時所使用的shell script, 以及menuconfig所用到的source code
security - 這是和加解密的kernel API source code, 以及軟體加解密引擎, 若有硬體支援加解密, 是放在driver/crypto
sound - 這是有關聲音的驅動程式
+-core
+-usb
+-pci
+-drivers
usr