初解linux字符设备驱动的组成
2012-03-25 21:16
232 查看
怀着激动的心情,翻开买了N长时间的驱动参考书,现在终于有机会可以在实践任务运用它了。对于驱动这个玩意,还没接触之前,感觉是那么的神秘,但是,一旦接触后,由于N多原因,它还是那么神秘。所以,要逐步逐步的去征服它。不管别人怎么说难或者简单,它都在那里,只有你会或者不会。
下面就慢慢走近它吧,看看它到底是啥玩意。
首先由字符设备说起,它是驱动中稍微简单一点的,那现在就看看它的“五脏“是哪些吧。
//设备结构体
struct xxx_dev_t
{
struct cdev cdev;
...
} xxx_dev;
//设备驱动模块加载函数
static int _ _init xxx_init(void)
{ ...
cdev_init(&xxx_dev.cdev, &xxx_fops); //初始化 cdev
xxx_dev.cdev.owner = THIS_MODULE;
//获取字符设备号
if (xxx_major)
{
register_chrdev_region(xxx_dev_no, 1, DEV_NAME);
}
else
{
alloc_chrdev_region(&xxx_dev_no, 0, 1, DEV_NAME);
}
ret = cdev_add(&xxx_dev.cdev, xxx_dev_no, 1); //注册设备
...
}
下面就慢慢走近它吧,看看它到底是啥玩意。
首先由字符设备说起,它是驱动中稍微简单一点的,那现在就看看它的“五脏“是哪些吧。
//设备结构体
struct xxx_dev_t
{
struct cdev cdev;
...
} xxx_dev;
//设备驱动模块加载函数
static int _ _init xxx_init(void)
{ ...
cdev_init(&xxx_dev.cdev, &xxx_fops); //初始化 cdev
xxx_dev.cdev.owner = THIS_MODULE;
//获取字符设备号
if (xxx_major)
{
register_chrdev_region(xxx_dev_no, 1, DEV_NAME);
}
else
{
alloc_chrdev_region(&xxx_dev_no, 0, 1, DEV_NAME);
}
ret = cdev_add(&xxx_dev.cdev, xxx_dev_no, 1); //注册设备
...
}
/*设备驱动模块卸载函数*/ static void _ _exit xxx_exit(void) { unregister_chrdev_region(xxx_dev_no, 1); //释放占用的设备号 cdev_del(&xxx_dev.cdev); //注销设备 ... }
/* 读设备*/ ssize_t xxx_read(struct file *filp, char _ _user *buf, size_t count,loff_t*f_pos) { ... copy_to_user(buf, ..., ...); ... }
/* 写设备*/ ssize_t xxx_write(struct file *filp, const char _ _user *buf, size_t count,loff_t *f_pos) { ... copy_from_user(..., buf, ...); ... }
/* ioctl 函数 */ int xxx_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,nsigned long arg) { ... switch (cmd) { case XXX_CMD1: ... break; case XXX_CMD2: ... break; default: /* 不能支持的命令 */ return - ENOTTY; } return 0; }
字符设备驱动文件操作结构体模块: struct file_operations xxx_fops = { .owner = THIS_MODULE, //这不是一个操作,它是一个指向拥有这个结构模块的指针 .read = xxx_read, .write = xxx_write, .ioctl = xxx_ioctl, ... };
以上都是主要组成部分,具体可以参见《linux设备驱动开发详解》,那里有详细说明,这只是个简介,不过模块都是类似的。
相关文章推荐
- linux 驱动-----字符设备驱动的组成
- linux字符设备驱动中自动创建设备节点
- 嵌入式Linux之字符设备驱动
- Linux字符驱动中动态分配设备号与动态生成设备节点
- 一步步理解linux字符设备驱动框架(转)
- Linux字符设备驱动之cdev_init()
- Linux字符设备驱动-globalmem驱动编译加载遇到的问题及解决办法
- Linux字符驱动中动态分配设备号与动态生成设备节点
- linux高级字符设备驱动之 二 内核等待队列
- LINUX字符设备驱动学习
- Linux 字符设备驱动开发基础(一)—— 编写简单 LED 设备驱动
- 20 linux字符设备驱动相关的函数及参数
- linux驱动之字符设备
- Linux 驱动开发-字符设备驱动
- linux驱动开发-字符设备初级应用(管道)
- Linux设备驱动之字符设备驱动
- linux字符设备驱动-LED驱动
- linux驱动学习--第二十三天:第十二章:Linux 字符设备驱动综合实例(三)NVRAM 设备驱动 和 看门狗设备驱动
- Linux 设备驱动之字符设备(三)
- Linux字符设备驱动开发基础