字符设备控制技术

17、字符设备控制技术

17、字符设备控制技术

17、字符设备控制技术

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

控制设备的函数:ioctl。

17、字符设备控制技术

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

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

17、字符设备控制技术

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

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

17、字符设备控制技术

 

 

 

 

 

 

定义命令:

17、字符设备控制技术

系统用宏来定义命令:

17、字符设备控制技术

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

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

 

 

17、字符设备控制技术

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

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

17、字符设备控制技术

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

17、字符设备控制技术

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

 

在内核的unlocked_ioctl的函数原型:

17、字符设备控制技术

从上面我们得到:

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

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

17、字符设备控制技术

运行的结果:

17、字符设备控制技术

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

17、字符设备控制技术

编译结果:

17、字符设备控制技术

 

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

17、字符设备控制技术

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

17、字符设备控制技术

17、字符设备控制技术

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

17、字符设备控制技术

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

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

Arg is 115200

Restart devices

相关文章:

  • 2022-12-23
  • 2021-12-04
  • 2021-05-05
  • 2021-08-07
  • 2022-02-17
  • 2022-12-23
  • 2021-10-18
猜你喜欢
  • 2022-01-18
  • 2021-10-06
  • 2022-12-23
  • 2021-06-16
  • 2022-02-08
  • 2021-09-11
  • 2021-11-01
相关资源
相似解决方案