驱动框架

来源:互联网 发布:物业网络拓扑图 编辑:程序博客网 时间:2024/06/06 12:43

编写第一个驱动框架:

今天听了韦东山老师的课程,学到了一些驱动的知识,这里的内容是我对课程的一些总结,希望对学习驱动的同学有帮助。

0.现将头文件加进来

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
  

1.先写open,write,read等函数

static int seconds_drv_open(struct inode *inode,struct file *file)
{
//printk("seconds_drv_open\n");
/* 配置gpf4,5,6引脚为输出 */
return 0;
}

static ssize_t seconds_drv_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)
{
//printk("seconds_drv_write\n");
return 0;
}

2.写file_operations结构,然后将上面的open,write函数填充到相应函数指针处

static struct file_operations seconds_drv_fops={
.owner = THIS_MODULE, 
.open = seconds_drv_open,
.write = seconds_drv_write,
};

3.在入口函数中注册驱动程序

static int seconds_drv_init(void)
{
auto_major = register_chrdev(0,"seconds_drv",&seconds_drv_fops); //当第一个参数为0时,表明让内核分配主设备号,

     //此时内核会将没有用到的主设备号分配给auto_major
secondsdrv_class = class_create(THIS_MODULE,"secondsdrv");         
secondsdrv_class_dev = class_device_create(secondsdrv_class,NULL,MKDEV(auto_major,0),NULL,"ABCD");

return 0;
}

4.在出口函数中卸载驱动

static void seconds_drv_exit(void)
{
unregister_chrdev(auto_major,"seconds_drv");
class_device_unregister(secondsdrv_class_dev);
class_destroy(secondsdrv_class);
}

5.修饰入口函数和出口函数

module_init(seconds_drv_init);
module_exit(seconds_drv_exit);
MODULE_LICENSE("GPL");



原创粉丝点击