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.     }  
  • 相关阅读:
    每天一道leetcode 搜索旋转排序数组(二分法)
    每天一道leetcode 统计重复个数(循环节)
    python3 简单web目录扫描脚本(后续更新完整)
    每天一道leetcode 盛最多水的容器 (双指针)
    python3 语法学习 类和继承
    python3 语法学习 文件操作及os方法
    python3 语法学习 输入输出美观
    TCP/IP 协议:IP 协议
    TCP/IP 协议:链路层概述
    Http权威指南(二)---读书笔记
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4237234.html
Copyright © 2011-2022 走看看