首页 > 其他分享 >符合input子系统的设备驱动之按键驱动(二)

符合input子系统的设备驱动之按键驱动(二)

时间:2023-07-12 18:13:13浏览次数:40  
标签:read drv second key input vals 驱动 open 子系统

作者:Bright-Ho

联系方式:[email protected]



符合input子系统的设备驱动之按键驱动(二)


上一节,我们大概的回顾了裸板按键驱动的方法,这一节,我们继续回顾,不带input子系统的按键字符设备驱动是怎么实现的?

 

这里直接上流程:

(1)构造file_operstions结构;

static struct file_operations second_drv_fops = {

.owner = THIS_MODULE,

.open = second_drv_open,

.read = second_drv_read,

};

(2)注册设备驱动;

major = register_chrdev(0,"second_drv",&second_drv_fops);

(3)创建类,会在sys/class下生成;

class_create(THIS_MODULE,"seconddrv");

(4)在类下面创建设备;

class_device_create(seconddrv_class,NULL,MKDEV(major,0),NULL,"buttons");

(5)映射寄存器地址

gpfcon = (volatile unsigned long *)ioremap(0x56000050,16); gpfdat = gpfcon + 1;

gpgcon = (volatile unsigned long *)ioremap(0x56000060,16); gpgdat = gpgcon + 1;


(6).open = second_drv_open函数实现什么内容?

static int second_drv_open(struct inode *inode,struct file *file){

 

printk("second drv open\n");

/*配置GPF0,2为输入引脚*/

*gpfcon &= ~((3<<0) | (3<<4));

/*配置GPG3,11为输入引脚*/

*gpgcon &= ~((3<<6) | (3<<22));

return 0;

}

    1.  .read = second_drv_read函数实现什么内容?

static ssize_t second_drv_read(struct inode *inode, const char __user *buf, size_t count, loff_t * ppos){

31

32 //printk("second drv write\n");

33

34 /*返回 4个引脚的电平*/

35 unsigned char key_vals[4];

36 int vals;

37

38 if(count != sizeof(key_vals)){

39 return -EINVAL;

40 }

41

42 /*读取GPF0,2*/

43 vals = *gpfdat;

44 key_vals[0] = (vals & (1<<0)) ? 1 : 0;

45 key_vals[1] = (vals & (1<<2)) ? 1 : 0;

46

47 /*读取GPG3,11*/

48 vals = *gpgdat;

49 key_vals[2] = (vals & (1<<3)) ? 1 : 0;

50 key_vals[3] = (vals & (1<<11)) ? 1 : 0;

51

52 copy_to_user(buf,key_vals,sizeof(key_vals)); /*从内核空间把参数传给用户空间*/

54 return 0;

55 }

 

 


整体流程来看,就是构造一个file_operations结构,并实现open,read等驱动接口,把该结构注册进内核;然后MDEV机制产生设备节点以备应用程序访问;映射寄存器地址;


在open函数中:设置“控制寄存器”,把按键配置成输入引脚;

在read函数中:通过“数据寄存器”来获得按键值;并通过copy_to_user()函数把按键值传递给用户空间的buf;


这一节有个重要的问题:在内核空间访问寄存器为什么要先ioremap?

这里大概说一下原因,原因是有mmu,地址都重映射了,datesheet中查到的寄存器地址,直接访问是访问不到的.所以需要ioremap !! 在内核中操作的都是虚拟地址,内核访问不到物理地址,只能通过ioremap映射为虚拟地址 内核才能访问此内存空间;

那么至于他是怎么映射的以后有时间我们再深入分析研究!!!


下一节,我们就来实现设备层;














标签:read,drv,second,key,input,vals,驱动,open,子系统
From: https://www.cnblogs.com/Bright-Ho/p/17548459.html

相关文章

  • 符合input子系统的设备驱动之按键驱动(三)
    作者:Bright-Ho联系方式:[email protected]符合input子系统的设备驱动之按键驱动(三)前两节我们回顾了按键实现的硬件原理,这一节我们就实现input系统的设备硬件层的内容;(1)首先看入口函数做了哪些事情?46staticstructinput_dev*buttons_dev;47staticstructpin_......
  • 字符设备驱动之输入子系统分析(四)
    作者:Bright-Ho联系方式:[email protected]这一节主要讲解“设备硬件层”;这一层的内容就需要我们自己来实现;这里主要讲解框架;在“核心层”里面会提供一个input_register_device()这样一个函数;在“设备硬件层”先构造并初始化一个structinput_dev*dev结构,通过input_regist......
  • 字符设备驱动之输入子系统分析(三)
     作者:Bright-Ho联系方式:[email protected]输入子系统之“事件处理层”分析:注意:我们现在只是涉及输入子系统的框架;具体细节会涉及到硬件的工作原理,在后面我们写驱动的时候会说到细节方面;这一节,我们接触到了“事件处理层”;事件处理层包含了evdev.c(事件设备),tsdev.c......
  • Windows 驱动程序签名教程(一) --- 开发测试篇
    一、内核驱动签名初篇1.大概聊一聊现有驱动情况1.开启安全启动(SecureBoot)1.使用微软WHQL签名2.使用2013-2015年签发的驱动签名,已过期未吊销未拉黑(不知道什么时候打个补丁会修复).2.关闭安全启动(SecureBoot)1.使用微软WHQL签名2.使用过期签名的sha1sha256都可以正常......
  • 高通个别驱动创建Buffer耗时高问题的解决
    前言最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(855,855+等),创建VB的耗时跟VB的数量成正比,这个应该是驱动的bug。跟官方人员确认过,确实是有这个问题,他们给的解决方案是减少Buffer的数量,经过一轮优化后,Buffer数量减少了将近30%,但是这个耗时的问题还是没能解决,在正常机......
  • 如何实现mysql驱动的具体操作步骤
    MySQL驱动简介及使用示例1.什么是MySQL驱动?MySQL驱动是用于连接和操作MySQL数据库的软件模块。MySQL是一种常用的关系型数据库管理系统,而驱动则是用于连接不同编程语言和MySQL数据库之间的桥梁。驱动有助于程序员使用编程语言操作MySQL数据库,例如执行查询、插入、更新和删除数据......
  • elementUI远程搜索功能遇到的坑(el-autocomplete) 如果是提前加载出全量数据 去掉v-mode
    elementUI远程搜索功能遇到的坑(el-autocomplete)如果是提前加载出全量数据去掉v-model.trim换为v-model=“nameinputvalue”原文链接:https://blog.csdn.net/CuiCui_web/article/details/95939746本文主要是解决下拉框根据返回值隐藏   动态设置建议列表值等问题结构写......
  • element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
    element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)原文链接:https://blog.csdn.net/wyhstars/article/details/81672195前段时间,在实现带输入建议并且支持模糊查询输入框的时候,发现了两个值得注意的小地方。整理出来,以供借鉴。废话不多说,直......
  • 使用input标签的时候报错,提示Form elements must have labels: Element has no title
    使用input标签的时候报错,提示Formelementsmusthavelabels:ElementhasnotitleattributeElementhasnoplaceholderattribute大概就是下面这样其实规范化一下,加个label就可以了......
  • VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动
    VMwareESXi7.0U3nmacOSUnlocker&OEMBIOS集成网卡驱动和NVMe驱动(集成驱动版)ESXi7U3标准版集成Intel网卡、USB网卡和NVMe驱动请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2023......