首页 > 系统相关 >正点原子第五十八章 Linux input子系统实验 文档之外(没提到的部分)

正点原子第五十八章 Linux input子系统实验 文档之外(没提到的部分)

时间:2023-07-17 18:13:30浏览次数:32  
标签:Struct 第五十八章 DEV cdev dev Key Linux input

使用 input 子系统,不需要分配设备号、注册设备、创建类等等工作。

也就是不需要以下的代码。

    //1. 由系统分配设备号
    if(Key_Struct.major != 0)
    {
        Key_Struct.devid= MKDEV(Key_Struct.major, 0);
        register_chrdev_region(Key_Struct.devid, DEV_CNT, DEV_NAME);
    }
    else    //major == 0
    {
        alloc_chrdev_region(&(Key_Struct.devid),0,DEV_CNT,DEV_NAME);
        Key_Struct.major = MAJOR(Key_Struct.devid);
        Key_Struct.minor = MINOR(Key_Struct.devid);
    }
    printk("new key major:%d; minor:%d\r\n", Key_Struct.major, Key_Struct.minor);
    
    //2. 注册设备
    Key_Struct.cdev.owner = THIS_MODULE;
    cdev_init(&(Key_Struct.cdev), &my_fops);
    cdev_add(&(Key_Struct.cdev), Key_Struct.devid, DEV_CNT);

    //3. 设置自动装载节点
    //创建类
    Key_Struct.class = class_create(THIS_MODULE, DEV_NAME);
    if (IS_ERR(Key_Struct.class)) {
        return PTR_ERR(Key_Struct.class);
    }
    //创建设备
    Key_Struct.device = device_create(Key_Struct.class, NULL, Key_Struct.devid, NULL, DEV_NAME);
    if (IS_ERR(Key_Struct.device)) {
        return PTR_ERR(Key_Struct.device);
    }
View Code

但这段代码还有很重要的部分:

比如给设备取了名字(例如 fireled),然后应用程序才能通过 /dev/fireled 调用驱动程序;

再比如注册设备过程中 cdev_init(&(Key_Struct.cdev), &my_fops); 将 my_fops 和设备联系起来;

现在这段代码被申请、初始化、注册 input_dev 结构体所取代,那么上面的两种情况如何解决呢?

情况1:没了名字(设备路径)怎么办?

文档中有写(P1406)

 当我们向 Linux内核成功注册 input_dev设备以后,会在 /dev/input目录下生成一
个名为“ eventX(X=0….n)”的文件,这个 /dev/input/eventX就是对应的 input设备文件。

也就是说  /dev/input/eventX 就是我们应用程序使用驱动时的路径。

当然,input_dev 结构体也有 name 成员,可以将原来的名字在初始化的时候,放在这个成员里面。

#define INPUT_DEV_NAME            "firekey_input"
.....
typedef struct
{
    struct input_dev * indevp; /* 输入子系统设备结构体指针*/
}DevStruct;
DevStruct Key_Struct;

...... Key_Struct.indevp->name = INPUT_DEV_NAME;

 

情况2:原来的 fops 结构体怎么办?

在应用程序中,一定有 read\write 等函数,现在 fops 与设备没联系,该怎么办呢?

答案是:其实驱动程序中把 fops 部分全删掉也没事。 我的猜想是 input_event 这个结构体代替了驱动中 xxx_read() 函数的作用。

例如应用程序如下,经过实验,在使用 input 子系统之后,即使驱动程序中没有相应的 xxx_read 函数,该应用程序仍然能正常运行。

1 static struct input_event myevt;  //定义input_event 结构体
 
3 int main(int argc, char *argv[])
4 {
     ....
6     read(fd, &myevt, sizeof(myevt));
     ...
8 }

 

标签:Struct,第五十八章,DEV,cdev,dev,Key,Linux,input
From: https://www.cnblogs.com/FBsharl/p/17560844.html

相关文章

  • Linux内存管理 - 大页 (二)
    为了解决页表项过多的问题,Linux提供了两种机制,就是多级页表和大页。 一.在阐述大页的优点之前,先来看一下内存映射的页表结构。 PGD: PageGlobalDirectoryPUD:Page UpperDirectoryPMD:PageMiddleDirectoryPTE: PageTableEntry二.TLB......
  • Linux网络编程(socket的udp通信)
    UDP是无连接的,即发送数据之前不需要建立连接,它尽最大努力交付,即不保证可靠交付,在一些要求实时性的通信中多有用到如游戏,视频等,UDP是面向报文的,有别于tcp的一对一通信,udp支持一对一、一对多、多对一和多对多的交互通信等。 一、udp通信用到的相关函数解析intsocket(intdoma......
  • Linux磁盘专题
    物理磁盘名次和其作用盘片:disk盘片上下都有磁头。磁盘面:盘片有上下两面,每一面叫磁盘面磁头:heads每个磁头负责一个磁盘面,负责读取数据、将数据写入磁道。磁头都是固定在机械臂上(机械臂就是磁头臂组支架)磁道:track每个磁盘面上围绕圆心划分出多个同心圆环,每个圆圈叫做磁......
  • Linux磁盘专题-常用分区命令
    划分分区fdisk专门用于划分MBR类型的分区。(mbr分区类型在linx中也叫msdos)注意:fdisk在centos7上已经可以用来划分gpt类型的分区。详细不说了,N年之前学习过gdisk专用与划分gpt类型分区。大致操作和fdisk一样,不记录了,N年前学过。。partedparted之前懒得学,现在看了下也是......
  • Linux磁盘专题-linux文件系统详解
    这可是我几年前的杰作笔记呀.....当初手写计算都会,现在忘光光....物理硬盘Block的概念和作用硬盘底层一次IO就是读、写一次扇区,一个扇区默认是512Byte。读写大量文件如果以扇区为单位会很慢、性能不好,所以出现了逻辑块的概念(logicblock),也就是硬盘Block。逻辑块Block是......
  • Linux下服务service使用记录
    在/etc/systemd/system/路径下添加MyService.service文件并写入一下内容()[Unit]Description=MyService[Service]Type=simple#工作路径WorkingDirectory=/home/software/net5.0/publish#执行的服务的dll文件ExecStart=/usr/bin/dotnet/home/software/net5.0/publish/M......
  • linux搭建code-server及使用中遇到的问题
    系统环境CentOS8.5docker搭建linux不太熟,但是用docker搭建是真的简单,有现成的镜像的话一句命令就可以搞定。dockerrun-itd--namemy-code-server\-p5580:8080\-v/data/mycode:/home/coder\-ePASSWORD=12345678\codercom/code-server:latest--authpassword......
  • linuxIP地址和主机名,再虚拟机中配置linux固定IP
    1.IP地址IPV4版本地址格式:a.b.c.d,其中abcd是0-255的数字可以通过ifconfig查看本机的IP地址2.特殊IP地址127.0.0.1,表示本机0.0.0.0,可以指代本机,也可以在端口绑定中用来确定绑定关系,还可以在IP地址限制中表示所有的IP允许所有IP访问3.主机名每一台电脑除......
  • Linux下建立NFS共享目录
    https://blog.csdn.net/anluo233/article/details/125921403https://blog.csdn.net/zhangxucumt/article/details/125935901......
  • java在指定目录执行linux命令
    在指定目录执行Linux命令的Java实现概述在Java程序中通过执行Linux命令可以实现一些系统级别的操作,比如启动、停止进程,创建、删除目录等。本文将向刚入行的小白开发者介绍如何在Java中执行Linux命令,并指导他完成该过程。步骤步骤动作代码1创建ProcessBuilder对象Pr......