您的位置:首页 > 其它

字符设备驱动学习笔记

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,

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种创建方式,一种是自动创建,另一种是手动创建。

自动创建的方法是创建一个类,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: