以下步驟是在 開發機 上,利用 RPi Toolchain 進行 Cross-compile;
若想在 RPi 上直接編譯 kernel,
則可以省略設定 ARCH 與 CROSS_COMPILE 環境變數。
請先準備以下檔案:
1. Raspberry Pi' kernel 此處以 3.6.y 作為範例,請依據需要作選擇。 下載處:github 附註:個人喜歡在 linux 用 git 將整個 kernel source Repo. 複製下來, 未來方便直接用 git pull 將 kernel source 更新到最新; 需要用 3.2.27 版的 kernel source, 也可以直接用 git checkout rpi-3.2.27 切換。 2. Driver source code 此處以 IT913x driver 作為範例。 3. Raspberry Pi tools and toolchain 此工具包包含三個已編譯好的 x86 toolchains 和其他工具。 下載處:github
開始將 driver 製作成 module
1. 簡化指令長度,將以縮寫方式替代
<kernel source> : /home/bkdragon/rpi/linux-rpi-3.6.y <RPi toolchain> : /home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi <IT913x source> : /home/bkdragon/dvb/rpi/IT913x_SRC
2. 將 DVB IT913x source code 連同資料夾複製到 kernel source 中
$ cp -r <IT913x source> <kernel source>/drivers/media/dvb/dvb-usb
3. 切換目錄
$ cd <kernel source>/drivers/media/dvb/dvb-usb
4. 修改 Makefile,在文件底下的 ccflags-y 上方插入下面這行,儲存離開
obj-$(CONFIG_DVB_USB_IT913x) += IT913x_SRC/
請注意,IT913x_SRC 必須一樣,若存放 driver 的目錄名稱不同,請自行修改
5. 修改 Kconfig,在文件最下方插入以下資訊,儲存離開
config DVB_USB_IT913x tristate "ITEtech IT913x Rx USB2.0 support" depends on DVB_USB help Say Y here to support the ITE IT913x based DVB-T USB2.0 Rx
6. 回到 kernel source code 的根目錄
$ cd <kernel source>
7. 清除所有 generated files、config 和 various backup files
$ make mrproper
8. 從正在運行的 RPi 上,取得當前的 kernel configuration
(on RPi) $ zcat /proc/config.gz > .config
9. 從 RPi 上複製 .config 至 kernel source 中
(on RPi) $ scp .config bkdragon@my.ip:<kernel source>
10. 設定環境參數 CCPREFIX
$ export CCPREFIX=<RPi toolchain>/bin/arm-bcm2708hardfp-linux-gnueabi-
11. 更新 configuration
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
其中會在新加入的 module 停下,若為
ITEtech IT913x Rx USB2.0 support (DVB_USB_IT913x) [N/m/?] (NEW)
按下 m 使之製作成 module。
12. 萬事俱全,開始 build kernel
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX}
假設我的主機為 4 cores,可用 -j4。
13. 建立存放 new_kernel 的目錄
$ mkdir /home/bkdragon/rpi/new_kernel
14. 建立存放 module 的目錄
$ mkdir /home/bkdragon/rpi/new_kernel/modules
15. 設定環境參數
$ export MODULES_TEMP=/home/bkdragon/rpi/new_kernel/modules
16. 將編譯好的 module 安裝到指定目錄
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} modules_install
17. 切換目錄至 Image 放置位置
$ cd arch/arm/boot
18. 複製產生出來的 kernel image 到 new_kernel 目錄底下
$ cp Image /home/bkdragon/rpi/new_kernel/
19. 切換目錄
$ cd /home/bkdragon/rpi/new_kernel
20. 更改名稱以區別 kernel image 版本(Option,檔名隨意)
$ mv Image new_kernel_3.6.y.img
21. 以上步驟完成,便將更換 kernel 所需要的檔案備齊。
在此目錄中,分別有一個 image 檔,和一個 modules 資料夾。
更換 SD 卡中的 kernel
1. 將要更新 kernel 的 SD 卡中兩個磁區掛載起來:
開機磁區(放有 config.txt 和 kernel.img 等檔案)我以 sec1 代稱、
一般檔案空間(一般在 linux 根目錄底下能看到的東西)我以 sec2 代稱。
將 kernel.img 複製到 sec1,並修改 config.txt。
$ cd /mnt/sec1 $ cp /home/bkdragon/rpi/new_kernel/new_kernel_3.6.y.img . $ vi config.txt在文件最上方插入:
kernel=new_kernel_3.6.y.img儲存後離開。
2. 將 modules 資料夾中的 lib 目錄,複製到 sec2 的根目錄底下
$ cd /mnt/sec2 $ sudo cp -r /home/bkdragon/rpi/new_kernel/modules/lib .
3. 更換 kernel 完成。這裡有一個需注意的地方,若原本 RPi 運行的 kernel 版本,
和你想要更換的 kernel 版本差異太大(如 3.2.27 --> 3.6.11),
則必須連同 firmware 一起更新。
更新 firmware 方式請參考官方 wiki。
沒有留言:
張貼留言