关于如何编写杂项设备,上一篇文章介绍了一般过程,现在让我们实现最简单的杂项设备驱动程序。
http://blog.csdn.net/morixinguan/article/details/52700146以下有关先前字符设备的四篇文章可供参考:http://blog.csdn.net/morixinguan/article/details/55002774 http: //blog.csdn.net/morixinguan/article/details/55003176 http://blog.csdn.net/morixinguan/article/details/55004646 http://blog.csdn.net/morixinguan/article/details/55006654为什么学习其他设备的编程?因为,如果我们必须像原来那样为每个驱动器设备编写一个字符设备驱动程序,则必须分配主要设备号,次要设备号并实现相应的文件操作功能等,这将有点过多,并且记住它并不容易。
因此,Linux内核提供了一系列惰性技巧,以实现杂项设备。
实际上,杂项设备可以视为字符设备,但是字符设备是封装的。
看看下面的介绍。
知道吧首先让我们看一下misc设备的结构:// // miscdevice结构struct miscdevice& nbsp; {//通常将次设备号分配给MISC_DYNAMIC_MINOR ---->内核会自动将次设备号分配为int minor。
// misc设备的名称const char * name; //文件操作结构const struct file_operations * fops; struct list_head list; struct device * parent;结构设备* this_device; const char * nodename; umode_t模式; };在这里,我们编写最简单的Misc设备,我们只需要注意次要(次设备号),名称(设备名),fops(文件操作功能)。
看到这一点,我们可以想象misc设备是字符设备的重新封装,并且,在misc设备中,主要设备号相同,都是10,只有次要设备号不同。
不知道应该在内核中分配哪个设备号,我们可以直接分配次设备MISC_DYNAMIC_MINOR这个宏,这意味着它是内核,可以帮助我们分配次设备号。
不用说名称,如果设备成功注册,则在根文件系统/ dev /下将有已注册设备的名称。
fops是一系列文件操作功能,例如打开,读取,写入,ioctl等,很多,它与编写字符设备相同。
因此,接下来,让我们看一个示例,在这里,我将省略我的Makefile和Kcofig,您可以参考上一篇文章以轻松实现。
实施简单的其他设备驱动程序(在TINY4412开发板上编写)cdev_test.c #include& lt; linux / kernel.h& gt; #include& lt; linux / module.h& gt; #include& lt; linux / miscdevice.h& gt; #include& lt; linux / fs.h& gt; #include& lt; linux / types.h& gt; #include& lt; linux / moduleparam.h& gt; #include& lt; linux / slab.h& gt; #include& lt; linux / ioctl.h& gt; #include& lt; linux / cdev.h& gt; #include& lt; linux / delay.h& gt; & nbsp; #include& lt; linux / gpio.h& gt; #include& lt; mach / gpio.h& gt; #include& lt; plat / gpio-cfg .h& gt; //其他设备名称---& gt;是字符设备#define DEVICE_NAME“ misc_dev”; //执行打开函数int tiny4412_misc_dev_open(struct inode * inode,struct file * filp){printk(“ tiny4412 misc dev open! ”); return 0;} //执行关闭函数int tiny4412_misc_dev_close(struct inode * inode,结构文件* filp){printk(“ tiny4412 misc dev close! ”); return 0;} //初始化文件操作结构struct file_operations tiny4412_file_ops = {.owner = THIS_MODULE,.open = tiny4412_misc_dev_open,.release = tiny4412_misc_dev_close,}; //初始化misc设备结构struct miscdevice tiny4412_misc_dev = {//次设备号由内核自动分配。
minor = MISC_DYNAMIC_MINOR,//初始化设备名称。
name = DEVICE_NAME,//初始化文件操作结构。
fops =& tiny4412_file_ops,};静态int __init tiny4412_misc_dev_init(void)  {int ret_error; //注册其他设备int ret = misc_register(& tiny4412_misc_dev); if(ret!= 0){& nbsp; ret_error = ret; & nbsp; printk(“其他注册公平! ”); & nbsp; goto fair;} printk("杂项初始化成功! ”);返回ret公平:返回ret_error;}静态void __exit tiny4412_misc_dev_exit(void)  {//取消注册其他设备misc_deregister(& tiny4412_misc_dev);} module_init(tiny4412_misc_dev_init); module_exit(MO” dev_PLENS_misc_misc_dev_exit)); MODULE_AUTHOR(“ YYX添加其他驱动程序”);然后,在编译驱动程序之后,将zImage下载到板上。
我们可以看到启动时misc初始化成功打印,这证明misc设备已成功注册。
接下来,在Android的根文件系统中,我们打开/ dev /,您可以看到该设备