2013年4月17日 星期三

Raspberry Pi Set Up For Building External Modules

敘述


由於廠商提供的 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),即正確無誤!

沒有留言:

張貼留言