一、驱动程序框架:
1.编写程序 led_writer(struct file *file, const char __user *buf, size_t counr, loff_t *ppos)
2.定义相关结构体 static struct file_operations led={ .ower = THIS_MODULE, .write = led_write}
3.注册驱动程序 register_chdev(
major
, "led", &led)
卸载驱动程序 un
register_chdev(major, "led")
4.驱动入口函数 frist_init(register_chdev
)
驱动出口函数 frist_exit
(
unregister_chdev)
5.修饰入口函数 module_init(frist_init
)
修饰出口函数 module_exit(
frist_exit
)
#include "linux/init.h"
#include "linux/module.h"
static int hello_init(void)
{
printk(KERN_ALERT"Hello World linux-driver-modulen");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT"Goodbye linux-driver-modulen");
return 0;
}
module_init(hello_init); 安装驱动
module_exit(hello_init); 卸载驱动
MODULE_LICENSE("GPL");
2.编写Makefile 注:文件名一定要为 Makefile M不能为小写
ARCH=arm 内核
CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- 交叉编译工具地址
APP_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
obj-m := app.o 编译不链接
KDIR := /usr/android-kernel-samsung-dev/ 内核目录
PWD := $(shell pwd) 当前文件夹地址
default:
make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) mod ules 编译生成驱动模块,即.ko文件
app:app
$(APP_COMPILE)gcc -o app app.c 交叉编译.c文件
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean 清除
3.安装与卸载驱动
安装驱动:insmod app.ko 打印出:“Hello World linux-driver-module”
查看驱动信息:lsmod app/app.ko app 583 0 - Live 0xbf018000
卸载驱动:rmmod app/app.ko 需创建 /lib/modules/内核版本 目录
这里的驱动没有创建节点,所以没有应用程序来调用。