zoukankan      html  css  js  c++  java
  • Linux 字符设备控制技术

    字符设备控制技术

    一。字符设备控制理论

      1.作用

        大部分设备除了具有《读写设备》的能力,还应该有《控制设备》的能力。比如改变 波特率

      2. 应用程序接口

        在用户空间中使用 Ioctl系统来控制设备,原型如下:

        int ioctl (int fd,unsigned long cmd,...);

        fd :控制的设备文件描述符

        cmd :发送给设备的控制命令

        .... : 第三个参数是可选参数,存在与否是依赖与控制命令

      3.设备驱动方法

        当系统用 ioctl系统调用时,驱动程序将由如下函数来响应:

        1. 内核是2.6.36之前的内核

          long (*ioctl) (struct inode* node ,struct file* filp, unsigned int cmd,unsigned long arg)

        2. 内核是2.6.36 之后的内核

          long (*unlocked_ioctl) (struct file *filp, unsigned int cmd, unsigned long arg)

          参数cmd: 通过应用函数ioctl传递下来的命令

    二。字符设备控制实现

        1.    命令从其实质而言就是一个整数,但为了让这个整数具备更好的可读性,我们通常会把这个整数分为几个段:

              类型(8位),序号,参数传送方向,参数长度。

          #Type(类型/幻数): 表明这是属于哪个设备的命令。

          #Number(序号),用来区分同一设备的不同命令

          #Direction:参数传送的方向,可能的值是_IOC_NONE(没有数据传输), _IOC_READ, _IOC_WRITE(向设备写入参数)

          #Size:参数长度

        2.    Linux系统提供了下面的宏来帮助定义命令:

          #_IO(type,nr):不带参数的命令

          #_IOR(type,nr,datatype):从设备中读参数的命令

          #_IOW(type,nr,datatype):向设备写入参数的命令

          例:#define MEM_MAGIC  ‘m’  //定义幻数

            #define MEM_SET_IOW(MEM_MAGIC, 0, int)

        3.unlocked_ioctl函数的实现通常是根据命令执行的一个switch语句。

          但是,当命令号不能匹配任何一个设备所支持的命令时,返回-EINVAL.编程模型:

          Switch cmd

          Case 命令A://执行A对应的操作

          Case 命令B://执行B对应的操作

          Default:// return -EINVAL

    三。自己手动写程序

          

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include "memdev.h"
    
    
    int main()
    {
        int fd = 0;
        fd = open("dev/memdev0",O_RDWR);
        
        ioctl(fd,MEM_SET,115200);
        
        ioctl(fd,MEM_RESTART);
        return 0;
    }                   
  • 相关阅读:
    Python2 cmp() 函数
    Python round() 函数
    Python floor() 函数
    Python ceil() 函数
    Python abs() 函数
    Python oct() 函数
    Python ord() 函数
    Python hex() 函数
    Python2 unichr() 函数
    Android--------工具类StatusBarUtil实现完美状态栏
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/5073373.html
Copyright © 2011-2022 走看看