敘述
由於廠商提供的 IT913x 的 Testkit,編譯時需要使用到 kernel external modules,
而 RPi 預設是沒有將 kernel source 放到 RPi 中,
使用者必須自行下載 kernel source 並放置到 /usr/src/linux-rpi-$(uname -r) 底下。
而在先前的文章
Raspberry Pi Kernel Compilation,
由於我的 RPi kernel 和 modules 是在開發機上編譯,
將 modules 複製到 RPi 後,發現到在 RPi 上編譯 IT913x Testkit,執行 Testkit 時顯示 KERNEL_VERSION 為 (3.2.25),而非實際使用的 (3.6.11),
之後才發現到 /lib/modules/$(uname -r)/build 連結到的位置是錯的 (target 為開發機的目錄),
因此也必須修改 /lib/modules/$(uname -r)/build,連結到正確位置,
並在 kernel source 目錄下,執行 make oldconfig、make modules_prepare 等指令,
之後 IT913x testkit 才會取得正確的 kernel external modules 去編譯。
問題
在 RPi 上編譯 IT913x Testkit,執行 Testkit 時顯示 KERNEL_VERSION 為 (3.2.25),而非實際使用的 (3.6.11)。
適用範圍
在 RPi 上編譯程式,需要使用到 kernel external modules 的狀況。
步驟
本篇文章記錄下每一個步驟,供需要的人參考。
以下步驟是在 開發機 上,利用 RPi Toolchain 進行 Cross-compile;
若想在 RPi 上直接編譯 kernel,
則可以省略設定 ARCH 與 CROSS_COMPILE 環境變數。
1. 下載 kernel source 3.6.y (個人 RPi 是指用 3.6.y 版的 kernel)
請參考
Raspberry Pi Kernel Compilation。
2. 為簡化指令長度,將以縮寫方式替代
<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
3. 切換目錄至 <kernel source>
$ cd <kernel source>
4. 清除所有 generated files、config 和 various backup files
$ make mrproper
5. 從正在運行的 RPi 上,取得當前的 kernel configuration
(on RPi) $ zcat /proc/config.gz > .config
6. 從 RPi 上複製 .config 至 kernel source 中
(on RPi) $ scp .config bkdragon@my.ip:<kernel source>
7. 設定環境參數 CCPREFIF
$ export CCPREFIX=<RPi toolchain>/bin/arm-bcm2708hardfp-linux-gnueabi-
8. 更新 configuration
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
9. Set up for building external modules
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules_prepare
10. (Option) 若使用 git clone 下載 kernel source,刪除 .git 目錄以節省空間
$ rm -rf .git
11. 切換目錄至 /tmp (隨意位置)
$ cd /tmp
12. 將 kernel source 封裝成 TAR.GZ
$ tar -czvf linux-rpi-3.6.y.tar.gz <kernel source>
13. 將 linux-rpi-3.6.y.tar.gz 複製到 RPi
$ scp linux-rpi.3.6.y.tar.gz pi@my.rpi.ip:~
以下步驟是在 RPi 上執行
14. 將 linux-rpi-3.6.y.tar.gz 移動至 /usr/src
$ sudo mv linux-rpi-3.6.y.tar.gz /usr/src
15. 切換目錄至 /usr/src
$ cd /usr/src
16. 解壓縮 linux-rpi-3.6.y.tar.gz
$ sudo tar -xzvf linux-rpi-3.6.y.tar.gz
17. 切換目錄至 /lib/modules/$(uname -r) 底下
$ cd /lib/modules/$(uname -r)
18. 移除 build、source
$ sudo rm build source
19. 建立 symbolic link build 連結至 kernel source 目錄
$ sudo ln -s /usr/src/linux-rpi-3.6.y build
20. 建立 symbolic link source 連結至 kernel source 目錄
$ sudo ln -s /usr/src/linux-rpi-3.6.y source
21. 編譯 IT913x testkit,執行 testkit 檢查顯示的 KERNEL_VERSION 是否正確。
如果顯示 KERNEL_VERSION(3, 6, 11),即正確無誤!