17字符设备控制技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17字符设备控制技术相关的知识,希望对你有一定的参考价值。

字符设备控制技术

技术分享

技术分享

技术分享

前面的学习,我们学习了驱动程序,实现程序的读写功能。现在设备还有一项更重要的功能--控制。

控制设备的函数:ioctl。

技术分享

Cmd:参数是我们发送的命令,例如重启。

第三个参数:是依赖第二个,例如我们要修改波特率的值,我们就会在第三个参数传上波特率的值。当第二个不需要参数,就是空值。

技术分享

前面知道,当我们系统调用read函数的时候,系统会自动调用***.read函数。上面是我们ioctl系统调用的时候,系统调用的函数版本。参数一一对应传递。

总结:我们从上面的学习read和write的内容知道,我们在程序里调用read函数,在系统会调用***_read函数,然后找在内核的相应的实现函数。Write也是一样的:write->***_write,他在内核的实现。所以现在控制程序:ioctl,对应系统的unlock_ioctl,接下来也是看系统是如何实现的。

技术分享

 

 

 

 

 

 

定义命令:

技术分享

系统用宏来定义命令:

技术分享

我们知道类型是8位的,然后一个字母刚好是8位,一个字符例如m。

0是命令的序号,最后int是命令的类型。

 

 

技术分享

通过上面知道,我们知道了如何实现。下面看程序的实现,功能:第一实现设备的重启的命令,第二是设参数。

首先是定义命令宏:memdev.h:

技术分享

接着就是在mem_fops结构里添加我们的控制函数:

技术分享

接下来就是我实现控制函数:

 

在内核的unlocked_ioctl的函数原型:

技术分享

从上面我们得到:

Long mem_iotcl(struct file *filp, unsigned int cmd, unsigned long arg).我们知道里面有一个switch的选择结构。

记得是在struct结构的前面实现

技术分享

运行的结果:

技术分享

接下来是写个应用程序来测试一下,mem_ctl.c:

技术分享

编译结果:

技术分享

 

写好了驱动程序memdev.ko和应用程序mem_ctl,拷贝到我们的开发板:

技术分享

首先是安装memdev.ko驱动并查看主设备号:

技术分享

技术分享

接下来创建字符设备文件:memdev0:

技术分享

接下来运行我们的应用程序:

./mem_ctl执行了这个命令之后会输出:

Arg is 115200

Restart devices

以上是关于17字符设备控制技术的主要内容,如果未能解决你的问题,请参考以下文章

字符设备控制技术

Linux驱动开发-字符设备控制技术笔记 3

Linux驱动开发-字符设备控制技术笔记 3

字符设备控制学习

字符设备控制

Linux驱动开发之LED驱动