zoukankan      html  css  js  c++  java
  • [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---> ");  
    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 ---> ",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 ");  
      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 ");  
      13.             return -1;  
      14.     }  
  • 相关阅读:
    owlCarousel 用法心得1 -20170405
    js数组去重的四种方法
    js获取url参数值
    jq index()
    jQuery(expression,[context])
    音乐播放器的实现+显示当前时间的歌词(只显示当前时间的文本)
    iOS自动布局框架-Masonry详解
    ios -完全实现代码设置 Could not find a storyboard named 'Main' in bundle NSBundle
    Python使用MySQL数据库的
    iOS 阿里百川SDK集成注意点
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4237234.html
Copyright © 2011-2022 走看看