linux如何配置驅動的內嵌和模組
1.核心編譯命令(makefile)
obj-y:把由foo.c 或者 foo.s 檔案編譯得到foo.o 並連線進核心.
obj-m: 則表示該檔案作為模組編譯.
除了y、m以外的obj-x 形式的目標都不會被編譯。
2.核心編譯 (make menuconfig)
make menuconfig
*標識編譯到核心,
M標識作為核心模組編譯.
空格,表示該功能不編譯到核心中,即新的核心將不支援該功能.
3.模組靜態編譯到核心和編譯成模組例項
【實驗目的】
配置編譯支援目標板的Linux-2.6.22.6的核心,熟悉Linux核心的配置選項和編譯過程。
熟悉模組靜態編譯到核心和編譯成模組,動態載入的方法和過程。
【實驗環境】
1、主 機:Ubuntu 10.10 發行版 [首先得配置好開發環境]
2、目標機:FS2410開發板以及移植好的u-boot-2010.03、核心原始碼包:linux-2.6.22.6.tar.bz2(打補丁後便支援FS2410)
4、交叉編譯器 arm-linux-gnu-gcc-3.4.5
【實驗步驟】
一、模組靜態編譯到核心
(1) 解壓核心
$tar xvfz linux-2.6.22.6.tar.bz2
進入解壓後的linux-2.6.22.6目錄打補丁
$patch -p1 < ../linux-2.6.22.6_jz2440.patch
進入核心目錄
$cd linux-2.6.22.6
(2)修改Makefile檔案
修改核心目錄樹根下的的Makefile,指明交叉編譯器:
$vim Makefile
找到ARCH和CROSS_COMPILE,修改
ARCH = arm
CROSS_COMPILE = arm-linux-gnu-
儲存退出
(3)新增程式檔案
將 2410GPIO_TEST_drv.c 檔案拷貝到核心程式碼目錄 drivers/char 中
(4)修改Makefile和Kconfig檔案
進入核心的 drivers/char 目錄
$vim Makefile
找到在 obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o
obj-$(CONFIG_2410GPIO_TEST_DRV) += 2410GPIO_TEST_drv.o
儲存退出vim
(5)修改Kconfig檔案
$vim Kconfig
在以下程式碼段下面
menu "Character devices"
加入以下資訊:
config 2410GPIO_TEST_DRV
tristate "S3C2410 test drv Device Support"
depends on ARCH_S3C2410
---help---
support led test device driver on FS2410 develop board
(6)配置核心將 2410GPIO_TEST_drv.c 靜態編譯金核心
$cp config_ok .config (使用提供的配置檔案 或 make s3c2410_defconfig 使用預設的配置檔案)
$make menuconfig
選擇 “Character devices” 選單項,進入後出現如下:
在第一項“S3C2410 test drv Device Support (NEW)”按“空格”鍵使其前面括號中的出現“*”,<*> 。
選“exit”退出,繼續選“exit”退出,出現提示:
選擇 Yes,退出。
(7)編譯核心產生uImage檔案, 並將uImage拷貝到/tftpboot目錄中,復位開發板,重新啟動。編譯命令:
$ make uImage
$ sudo cp -f uImage /tftpboot//uImage
$ sudo chmod 777 -R /tftpboot
(8)交叉編譯 2410GPIO_TEST_APP.c
arm-linux-gnu-gcc 2410GPIO_TEST_APP.c –o test
(9)複製 test 到 /opt/filesystem(NFS檔案系統)目錄下
$ sudo cp test /opt/filesystem/root
重新給目標板上電,讓它使用新的核心
[注意,以下10,11步驟在目標板的終端視窗中執行]
(10)建立 GPIO_TEST 裝置節點,在開發板上執行如下命令:
# mknod -m 666 /dev/GPIO_TEST c 252 0
(11) 執行 test 測試,在開發板上執行如下命令:(此時進入的為/root目錄下)
# ./test
此時,D12LED燈在閃爍。
二、編譯成模組
(1) 重新配置編譯核心,將GPIO_TESt編譯成模組,動態載入
進入到 linux-2.6.22.6目錄執行
$make menuconfig
選擇 “Character devices” 選單項,進入後出現如下:
在第一項“S3C2410 test drv Device Support (NEW)”按“空格”鍵使其前面括號中的出現“M”,<M> ,如下圖:
選“exit”退出,繼續選“exit”退出,出現提示:
選擇 Yes,退出。
(2)編譯核心產生uImage檔案, 並將arch/arm/boot/uImge拷貝到/tftpboot目錄中,復位開發板,重新啟動:
$ make uImage modules
$sudo cp -f uImage /tftpboot/uImage
(3)複製 linux-2.6.22.6/drivers/char/2410GPIO_TEST_drv.ko 到/opt/filesystem/lib下
$ sudo cp drivers/char/2410GPIO_TEST_drv.ko /opt/filesystem/lib
重新給目標板上電,讓它使用新的核心
[注意,以下4, 5, 6步驟在目標板的終端視窗中執行]
(4)載入模組 2410GPIO_TEST_drv,在開發板上執行如下命令:
#insmod /lib/2410GPIO_TEST_drv.ko
(5)建立 GPIO_TEST 裝置節點,在開發板上執行如下命令:
# mknod -m 666 /dev/GPIO_TEST c 252 0
(6) 在/root/目錄下執行 test 測試,在開發板上執行如下命令:
# ./test
此時,D12LED燈在閃爍。