字符设备驱动程序的编写
2017-10-07 17:24
288 查看
字符设备是3类设备(字符设备、块设备、网络设备)中的一类,其驱动程序的完成的主要工作是初始化、添加和删除cdev结构体,申请和释放设备号。以及填充file_operations结构体中的操作函数,实现file_operations结构体中的read()、write和ioctl()等函数是驱动程序设计的主体工作。(参考宋宝华老师的书籍) cdev结构体 struct cdev{ struct kobject kobj; //内嵌的kobject对象 struct module *owner; //所属模块 struct file_operation *ops; //文件操作结构体 struct list_head list; dev_t dev; //设备号 unsigned int count; }; 1.dev_t dev 定义了设备号,位32位,12位主设备号,20位次设备 号 获取设备号: MAJOR(dev_t dev); //主设备号 MINOR(dev_t dev); //此设备号 生成dev: MKDEV(int major, int minor); 分配和释放设备号 //已知主设备 int register_chrdev_region(dev_t from, unsigned count, const char *name); //避免设备号冲突 int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name); 2.操作cdev结构体的函数如下: void cdev_init(struct cdev * , struct file_operations *); struct cdev *cdev_alloc(void); void cdev_put(struct cdev *p); int cdev_add(struct cdev*, dev_t, unsigned); void cdev_del(struct cdev*); 实现细节如下: void cdev_init(struct cdev *cdev,struct file_operations *fops) { memset(cdev, 0 ,sizeof(*cdev)); INIT_LIST_HEAD(&cdev->list); kobject_init(&cdev->kobj, &ktype_cdev_default); cdev->ops = fops;//将传入的文件操作结构体指针赋值给cdev的ops } //动态申请一个cdev内存 struct cdev *cdev_alloc() { struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL); if(p){ INIT_LIST_HEAD(&p->list); kobject_init(&p->kobj, &ktype_cdev_dynamic); } return p;
}
cdev_add()和cdev_del()分别向系统添加和删除一个cdev file_operations结构体: 里面的函数比较多,主要是read()、write()、ioctl();
相关文章推荐
- 字符设备驱动程序的编写_点亮LED灯
- Linux字符设备驱动程序的编写框架
- [转]ubuntu 编写字符设备驱动程序
- Linux字符设备驱动程序编写基本流程
- Linux字符设备驱动程序的编写框架
- 第12课第2.1节 字符设备驱动程序之LED驱动程序_编写编译
- Linux字符设备驱动程序的编写框架
- linux字符设备驱动程序的编写
- vxWorks下编写字符设备驱动程序的方法。
- Ubuntu编写字符设备驱动程序——内核树
- Linux字符设备驱动程序编写基本流程
- Linux字符设备驱动程序的编写框架
- Linux字符设备驱动程序的编写框架
- Linux字符设备驱动程序编写基本流程
- Linux字符设备驱动程序的编写框架
- Linux字符设备驱动程序的编写框架
- 第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码
- Linux字符设备驱动程序的编写框架
- Linux字符设备驱动程序的编写框架
- Linux字符设备驱动程序的编写框架