编写第一个驱动框架:
今天听了韦东山老师的课程,学到了一些驱动的知识,这里的内容是我对课程的一些总结,希望对学习驱动的同学有帮助。
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");