[Linux驱动]字符设备驱动学习笔记(三)———高级

一,ioctl使用实例

ioctl使用实例

驱动程序.h文件  memdev.h

 

[cpp] view plaincopy
 
  1. /* 定义幻数 */  
  2. #define MEMDEV_IOC_MAGIC  ‘k‘  
  3.   
  4. /* 定义命令 */  
  5. #define MEMDEV_IOCPRINT   _IO(MEMDEV_IOC_MAGIC, 1)  
  6. #define MEMDEV_IOCGETDATA _IOR(MEMDEV_IOC_MAGIC, 2, int)  
  7. #define MEMDEV_IOCSETDATA _IOW(MEMDEV_IOC_MAGIC, 3, int)  
  8. #define MEMDEV_IOC_MAXNR 3  


驱动程序.c文件

 

 

[cpp] view plaincopy
 
  1. /*IO操作*/  
  2. int memdev_ioctl(struct inode *inode, struct file *filp,  
  3.                  unsigned int cmd, unsigned long arg)  
  4. {  
  5.   
  6.     int err = 0;  
  7.     int ret = 0;  
  8.     int ioarg = 0;  
  9.       
  10.     /* 检测命令的有效性 */  
  11.     if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)   
  12.         return -EINVAL;  
  13.     if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)   
  14.         return -EINVAL;  
  15.   
  16.     /* 根据命令类型,检测参数空间是否可以访问 */  
  17.     if (_IOC_DIR(cmd) & _IOC_READ)  
  18.         err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));  
  19.     else if (_IOC_DIR(cmd) & _IOC_WRITE)  
  20.         err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));  
  21.     if (err)   
  22.         return -EFAULT;  
  23.   
  24.     /* 根据命令,执行相应的操作 */  
  25.     switch(cmd) {  
  26.   
  27.       /* 打印当前设备信息 */  
  28.       case MEMDEV_IOCPRINT:  
  29.           printk("<--- CMD MEMDEV_IOCPRINT Done--->\n\n");  
  30.         break;  
  31.         
  32.       /* 获取参数 */  
  33.       case MEMDEV_IOCGETDATA:   
  34.         ioarg = 1101;  
  35.         ret = __put_user(ioarg, (int *)arg);  
  36.         break;  
  37.         
  38.       /* 设置参数 */  
  39.       case MEMDEV_IOCSETDATA:   
  40.         ret = __get_user(ioarg, (int *)arg);  
  41.         printk("<--- In Kernel MEMDEV_IOCSETDATA ioarg = %d --->\n\n",ioarg);  
  42.         break;  
  43.   
  44.       default:    
  45.         return -EINVAL;  
  46.     }  
  47.     return ret;  
  48.   
  49. }  


应用程序

[cpp] view plaincopy
 
    1. #include "memdev.h"   
    2.     cmd = MEMDEV_IOCPRINT;  
    3.     if (ioctl(fd, cmd, &arg) < 0)  
    4.         {  
    5.             printf("Call cmd MEMDEV_IOCPRINT fail\n");  
    6.             return -1;  
    7.     }  
    8.     cmd = MEMDEV_IOCSETDATA;  
    9.     arg = 2007;  
    10.     if (ioctl(fd, cmd, &arg) < 0)  
    11.         {  
    12.             printf("Call cmd MEMDEV_IOCSETDATA fail\n");  
    13.             return -1;  
    14.     }  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。