1、驱动理解
Linux下的驱动,主要是符合Linux驱动的框架,满足Linux函数要求。通过对驱动的学习,简单字符驱动整体框架如下:
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
struct cdev cdev1; //描述一个字符设备,属于Linux内部定义结构
dev_t devno; //设备号
static ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
printk("mem_write\r\n");
return 0;
}
static ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
printk("mem_read\r\n");
return 0;
}
int mem_open(struct inode *inode, struct file *filp)
{
printk("mem_open\r\n");
return 0;
}
int mem_release(struct inode *inode, struct file *filp)
{
printk("mem_release\r\n");
return 0;
}
static const struct file_operations mem_fops =
{ owner : THIS_MODULE,
write : mem_write,
read : mem_read,
open : mem_open,
release : mem_release,
};
static int driver_init(void)
{
int result;
//动态生存设备号,
result = alloc_chrdev_region(&devno, 0, 2, "dev0");
if (result < 0)
return result;
/*************初始化cdev结构体*****************/
//初始化cdev成员,并建立cdev与file_operation之间的连接
cdev_init(&cdev1, &mem_fops);
cdev1.ops = &mem_fops;
cdev1.owner = THIS_MODULE;
//注册字符设备
//还可以使用register_chrdev函数进行注册
cdev_add(&cdev1, devno, 1);
printk("driver_init\r\n");
return 0;
}
static void driver_exit(void)
{
printk("driver_exit\r\n");
unregister_chrdev_region(devno, 2); /*释放设备号*/
}
module_init(driver_init);
module_exit(driver_exit);
MODULE_AUTHOR("RK");
MODULE_LICENSE("GPL");
2、注意事项
static ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
static ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
write、read等函数类型都是不一样的
其实Linux驱动就是对 struct cdev结构体进行操作,初始化,匹配各个结构体中各个元素(其实也就是所谓的注册)。