一,写驱动函数的步骤
1 写出led_open(),led_read()驱动函数。
2 怎么把驱动函数告诉内核
a:定义一个file_operations结构,将驱动函数填充进去。
b:把这个结构告诉内核,通过函数register_chrdev(major,"led_drv",&led_drv_fops);函数参数为主设备号,设备名,file_operations结构。在一个内核数组chrdev中以major为索引,将file_operations结构挂进去。
c:谁来调用上述函数,即驱动的入口函数,static int led_drv_init(void);
d:修饰入口函数,module_init(led_drv_init);
二,编写驱动程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//注意这两个头文件与视频所用内核不同,需要修改
static int led_drv_open(struct inode *inode, struct file *file)
{
printk("led_drv_open\n");
return 0;
}
static ssize_t led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("led_drv_write\n");
return 0;
}
static struct file_operations led_drv_fops = {
.owner = THIS_MODULE,
.open = led_drv_open,
.write = led_drv_write,
};
static int led_drv_init(void)
{
register_chrdev(111,"led_drv",&led_drv_fops);
}
static void led_drv_exit(void)
{
unregister_chrdev(111, "led_drv");
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE("GPL");
三,测试程序
#include
#include
#include
#include
int main(int argc, char **argv)
{
int fd;
int val = 1;
fd = open("/dev/led_drv", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
write(fd, &val, 4);
return 0;
}
四,编写makefile
KERN_DIR = /home/wxudong/mini2440/linux-2.6.32.2
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += led_drv.o
五, a,执行make生成led_drv.ko,
b,执行arm-linux-gcc -o led_drv_test led_drv_test.c 生成执行文件
c,将两个文件拷贝到开发板
d,chmod 777 led_drv_test修改文件属性
e,insmod mini2440_leds.ko加载驱动
f,mknod /dev/led_drv c 111 0创建设备节点
g,./led_drv_test 显示结果led_drv_open led_drv_write
阅读(1936) | 评论(0) | 转发(0) |