字符设备驱动学习笔记
2015-04-07 21:57
253 查看
要使用某个驱动,必须先加载驱动模块,通常使用insmod加载驱动模块,rmmod移除驱动。insmod会调用驱动入口函数module_init,rmmod会调用module_exit。
加载驱动之后,app就可以通过open函数打开设备(所有设备都被当成文件),当app使用open、write、read对设备进行操作时,实际上是调用file_operations结构体的成员函数。具体函数内容由我们在驱动代码里定义。
static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops){return __register_chrdev(major, 0, 256, name, fops);}
int __register_chrdev(unsigned int major, unsigned int baseminor,
register_chrdev的作用就是向系统注册这个驱动模块,得到一个主设备号和一个设备类型,本例为字符设备类型,字符设备类型用c表示。
有入口就有出口,rmmod会调用出口函数first_drv_exit:
static void first_drv_exit(void)
{
unregister_chrdev(major, "first_drv"); // 卸载
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
iounmap(gpfcon);
}
主设备号有2种创建方式,一种是自动创建,另一种是手动创建。
自动创建的方法是创建一个类,
加载驱动之后,app就可以通过open函数打开设备(所有设备都被当成文件),当app使用open、write、read对设备进行操作时,实际上是调用file_operations结构体的成员函数。具体函数内容由我们在驱动代码里定义。
static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops){return __register_chrdev(major, 0, 256, name, fops);}
int __register_chrdev(unsigned int major, unsigned int baseminor,
unsigned int count, const char *name, const struct file_operations *fops) { struct char_device_struct *cd; struct cdev *cdev; int err = -ENOMEM; cd = __register_chrdev_region(major, baseminor, count, name); if (IS_ERR(cd)) return PTR_ERR(cd); cdev = cdev_alloc(); if (!cdev) goto out2; cdev->owner = fops->owner; cdev->ops = fops; kobject_set_name(&cdev->kobj, "%s", name); err = cdev_add(cdev, MKDEV(cd->major, baseminor), count); if (err) goto out; cd->cdev = cdev; return major ? 0 : cd->major; out: kobject_put(&cdev->kobj); out2: kfree(__unregister_chrdev_region(cd->major, baseminor, count)); return err; }
register_chrdev的作用就是向系统注册这个驱动模块,得到一个主设备号和一个设备类型,本例为字符设备类型,字符设备类型用c表示。
有入口就有出口,rmmod会调用出口函数first_drv_exit:
static void first_drv_exit(void)
{
unregister_chrdev(major, "first_drv"); // 卸载
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
iounmap(gpfcon);
}
主设备号有2种创建方式,一种是自动创建,另一种是手动创建。
自动创建的方法是创建一个类,
相关文章推荐
- 学习笔记:创建一个简单字符设备驱动的过程
- linux 学习笔记--字符设备驱动相关数据结构
- [Linux驱动]字符设备驱动学习笔记(二)———实例
- linux字符设备驱动学习笔记2
- linux字符设备驱动学习笔记1
- 字符设备驱动学习笔记(2.6.23)
- [Linux驱动]字符设备驱动学习笔记(一)
- 字符设备驱动-学习笔记
- Linux 驱动学习笔记3 -- 字符设备驱动实例(driver+client)
- 嵌入式linux学习笔记4之字符设备驱动
- 字符设备驱动学习笔记--点灯
- linux字符设备驱动学习笔记(一):简单的字符设备驱动
- linux字符设备驱动-重新学习-笔记-1
- 字符设备驱动学习笔记----异步通知机制
- Linux设备驱动程序学习笔记 高级字符驱动学习--阻塞型I/0
- [Linux驱动]字符设备驱动学习笔记(三)———高级
- 关于虚拟字符设备驱动的学习笔记globalmem
- 字符设备驱动学习笔记---并发
- 字符设备驱动学习笔记----查询方式取得按键值
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动