把驅(qū)動(dòng)編譯進(jìn)內(nèi)核
驅(qū)動(dòng)程序的安裝---有兩種方法:
(1)模塊插入方式;
(2)直接編譯進(jìn)內(nèi)核;
本章我們來詳細(xì)講解---直接編譯進(jìn)內(nèi)核這種方法
我們把LED的驅(qū)動(dòng)程序編譯進(jìn)內(nèi)核為例:
一.首先準(zhǔn)備好LED的驅(qū)動(dòng)程序內(nèi)核模塊mini2440_leds.c如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "leds"
static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
static unsigned int led_cfg_table [] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = sbc2440_leds_ioctl,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
int i;
for (i = 0; i < 4; i++) {
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
}
ret = misc_register(&misc);
printk (DEVICE_NAME"tinitializedn");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
二.把mini2440_leds.c放到內(nèi)核代碼中去,即根據(jù)程序的功能放置;
(led驅(qū)動(dòng)程序是字符設(shè)備驅(qū)動(dòng),所以放到2.6.29內(nèi)核代碼的driverschar目錄下)如圖:
三.修改內(nèi)核代碼目錄下的drivers/char/Kconfig文件
(提醒:想在菜單里添加配置項(xiàng)則修改Kconfig文件)
為了更好的理解我們先看一下,修改前make menuconfig菜單如圖:
之后修改drivers/char/Kconfig文件,在100~105為添加內(nèi)容:
修改完后退出保存,再次用make menuconfig命令打開菜單:如圖:
四.配置項(xiàng)選擇的結(jié)果會(huì)在內(nèi)核頂層目錄下的.config中顯現(xiàn);
五.修改驅(qū)動(dòng)程序所放目錄下的Makefile(第114行為添加行)
(即,在內(nèi)核目錄下用命令:vim drivers/char/Makefile)
六.重新編譯內(nèi)核
在內(nèi)核頂層目錄,用命令:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
將編譯好的在內(nèi)核目錄的arch/arm/boot/目錄下的uImage為編譯好的內(nèi)核,把內(nèi)核放到/tftp目錄下,重新下到開發(fā)板里,開發(fā)板便具備了LED驅(qū)動(dòng)的功能