首页 > 其他分享 >全志V3S嵌入式驱动开发-多按键输入驱动

全志V3S嵌入式驱动开发-多按键输入驱动

时间:2023-06-19 10:04:56浏览次数:32  
标签:lradc code 全志 value V3S time 驱动 type Event

多按键输入驱动

前面我们说过,荔枝派的开发板上面,有4个按键本身不是通过gpio连接到soc上面的。它是通过ad的方法,连接到主芯片的。这个时候,不同的按键被按下的时候,就会生成不同的电压或者电流,那么完全可以根据对应的电信号,推算出当前是哪一个按键被按下去了。

1、查找电路图

在这里插入图片描述

简单看一下电路之后,下面就是去找设备树,对应的信号是什么、在哪里。

2、查找设备树

在sun8i-v3s-licheepi-zero-dock.dts文件当中,我们发现了这样的内容,

&lradc {
	vref-supply = <&reg_vcc3v0>;
	status = "okay";
 
	button@200 {
		label = "Volume Up";
		linux,code = <KEY_VOLUMEUP>;
		channel = <0>;
		voltage = <200000>;
	};
 
	button@400 {
		label = "Volume Down";
		linux,code = <KEY_VOLUMEDOWN>;
		channel = <0>;
		voltage = <400000>;
	};
 
	button@600 {
		label = "Select";
		linux,code = <KEY_SELECT>;
		channel = <0>;
		voltage = <600000>;
	};
 
	button@800 {
		label = "Start";
		linux,code = <KEY_OK>;
		channel = <0>;
		voltage = <800000>;
	};
};

很明显,每一个button都是和电路中的按键是一一对应的,这个没有问题。那么,我们不禁还有一个疑问,既然是ad转换得到的结果,那么肯定要知道ad相关的设备配置是恶还那么。仔细找了一下,可以在sun8i-v3s.dtsi文件发现这样的内容,

lradc: lradc@01c22800 {
			compatible = "allwinner,sun4i-a10-lradc-keys";
			reg = <0x01c22800 0x400>;
			interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
			status = "disabled";
		};

看到这里,大家应该放心了,确实是有这么一个ad的驱动。兼容的设备是sun4i-a10-lradc-keys,寄存器地址空间是0x01c22800,长度是0x400,中断是GIC_SPI类型,状态关闭。有了设备树,还有了兼容设备号,接下来的一步就是根据设备号sun4i-a10-lradc-keys找到对应的驱动文件。

3、查找驱动代码,准备测试程序

通过工具查找一下,不难发现,文件在这,即sun4i-lradc-keys.c,

static const struct of_device_id sun4i_lradc_of_match[] = {
	{ .compatible = "allwinner,sun4i-a10-lradc-keys", },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, sun4i_lradc_of_match);
 
static struct platform_driver sun4i_lradc_driver = {
	.driver = {
		.name	= "sun4i-a10-lradc-keys",
		.of_match_table = of_match_ptr(sun4i_lradc_of_match),
	},
	.probe	= sun4i_lradc_probe,
};
 
module_platform_driver(sun4i_lradc_driver);
 
MODULE_DESCRIPTION("Allwinner sun4i low res adc attached tablet keys driver");
MODULE_AUTHOR("Hans de Goede <[email protected]>");
MODULE_LICENSE("GPL");

大致看一下最后一段的代码,内容方面应该错不了。一般来说,如果按键ok的话,会在设备启动的时候生成个/dev/input/event0节点,此时,如果编写一个应用程序,读写这些节点,就完全可以获取相关的按键信息。所以,我们还得准备一个input.c的读写程序,

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/input-event-codes.h>
 
const char * path = "/dev/input/event0";
 
int main(char argc,char *argv[])
{
   int ret;
 
   int fd;
   struct input_event event;
 
   fd = open(path,O_RDONLY);
   if(fd < 0)
   {
      perror(path);
      exit(-1);
   }
 
   while(1)
   {
      ret = read(fd,&event,sizeof(struct input_event));
      if(ret == sizeof(struct input_event))
      {
            if(event.type != EV_SYN)
            {
               printf("Event: time %ld.%ld,",event.time.tv_sec,event.time.tv_usec);
               printf("type:%d,code:%d,value:%d\n", event.type,event.code,event.value);
            }
      }
   }
 
   close(fd);
 
   return 0;
}

上面这段代码是从其他地方copy而来,谢谢了。准备好了程序之后,下面就是交叉编译,下载到开发板上面。但是实际运行的时候,发现按键被按下的时候,有三个按键的数值居然是一样的,都是352,另外一个是114。这就非常蹊跷了。

4、发现问题、解决问题

一般情况下,遇到这种情况,第一个怀疑的就是电阻坏了,R24、R25、R26、R27当中肯定有三个被击穿了,不然这种情况是说不过去的。于是,我们拿掉sd卡,让v3s继续跑之前norflash里面的嵌入式系统,输入key程序,也就是按键测试程序,没想到结果居然是正常的。这说明,硬件,没问题。问题出在上层应用或者驱动程序。

回过头查看sun4i-lradc-keys.c,惊讶地发现电压判断标准是根据sun8i-v3s-licheepi-zero-dock.dts中的voltage来验证的,这并不符合实际的情况。我们通过printk&dmesg打印,也验证了这一想法,所以如果需要得到正确的按键数值,只需要修正一下sun4i-lradc-keys.c中的判断逻辑就可以了,修改方法如下,具体的标定数值可以做实验来解决,

#if 0 // by feixiaoxing
		voltage = val * lradc->vref / 63;
 
		for (i = 0; i < lradc->chan0_map_count; i++) {
			diff = abs(lradc->chan0_map[i].voltage - voltage);
			if (diff < closest) {
				closest = diff;
				keycode = lradc->chan0_map[i].keycode;
			}
		}
#else
		printk("val = %d\n", val);
		if(val >=9 && val <= 13)
			keycode = lradc->chan0_map[0].keycode;
		else if(val >=24 && val <= 29)
			keycode = lradc->chan0_map[1].keycode;
		else if(val >= 35 && val <= 40)
			keycode = lradc->chan0_map[2].keycode;
		else
			keycode = lradc->chan0_map[3].keycode;
#endif

经过这一次修改,我们重新编译kernel内核,烧入zImage,启动后输入key程序,这样就得到了我们想要的最终结果,即稳定地输出按键值,

# ./input 
[    8.623196] val = 10
Event: time 47.807318,type:1,code:115,value:1
Event: time 48.78567,type:1,code:115,value:0
[   10.920313] val = 26
Event: time 50.104437,type:1,code:114,value:1
Event: time 50.340531,type:1,code:114,value:0
[   12.709584] val = 37
Event: time 51.893708,type:1,code:353,value:1
Event: time 52.141508,type:1,code:353,value:0
[   14.549618] val = 45
Event: time 53.733726,type:1,code:352,value:1
Event: time 53.969827,type:1,code:352,value:0
[   16.186513] val = 11
Event: time 55.370623,type:1,code:115,value:1
Event: time 55.645799,type:1,code:115,value:0
[   17.514789] val = 27
Event: time 56.698907,type:1,code:114,value:1
Event: time 56.950631,type:1,code:114,value:0
[   20.823740] val = 39
Event: time 60.7851,type:1,code:353,value:1
Event: time 60.279112,type:1,code:353,value:0
[   21.987936] val = 44
Event: time 61.172044,type:1,code:352,value:1
Event: time 61.435486,type:1,code:352,value:0

标签:lradc,code,全志,value,V3S,time,驱动,type,Event
From: https://blog.51cto.com/u_15380233/6510883

相关文章

  • 驱动开发:文件微过滤驱动入门
    MiniFilter微过滤驱动是相对于SFilter传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在编写时更简单,多数IRP操作都由过滤管理器(FilterManager或Fltmgr)所接管,因为有了兼容层,所以在......
  • 领域驱动设计-软件核心复杂性应对之道 11-13
    11.分析模式的应用马丁分析模式:表示业务建模中的常见构造分析模式的最大作用是借鉴其他项目的经验,把那些项目中所做的广泛的设计方向讨论和实现结果的经验与当前的模型结合起来。记账:钱不会无中生有,也不会无故消失。它只能从一个账户迁移到另一个账户。当你可以幸运地使用一......
  • Reactive Extensions 响应式扩展 用于事件驱动编程的库,具有可组合的声明性模型
    响应式扩展这个存储库包含四个库,它们在概念上是相关的,因为它们都与LINQoverofthings序列有关:ReactiveExtensionsfor.NET又名Rx.NET或Rx( System.Reactive ):一个用于事件驱动编程的库,具有可组合的声明性模型AsyncRx.NET(实验性预览)(System.Reactive.Async):Rx的实验......
  • AP5125 外置MOS管平均电流型LED降压恒流驱动器
    产品描述 AP5125是一款外围电路简单的Buck型平均电流检测模式的LED恒流驱动器,适用于8-100V电压范围的非隔离式大功率恒流LED驱动领域。芯片采用固定频率140kHz的PWM工作模式,利用平均电流检测模式,因此具有优异的负载调整率特性,高精度的输出电流特性。AP5125芯......
  • 亚马逊云科技re:Inforce 2023全球大会,让安全成为业务发展驱动力
    S&P《企业之声:2022年信息安全、预算和展望》研究报告指出,有37%的受访者表示云基础设施安全是他们的主要安全支出,65%的受访者表示将计划采用云供应商的高级安全服务。安全是亚马逊云科技的重中之重,re:Inforce全球大会则深化了亚马逊云科技在安全领域的承诺。 关于re:Inforce的历史......
  • Oracle反连接和外连接中NESTED LOOPS无法更改驱动表
     Oracle反连接和外连接中NESTEDLOOPS无法更改驱动表 先说反连接,现有SQL如下:selectt.*fromtwheret.colnotin(select/*+nl_aj*/tt.colfromttwherett.colisnotnull)andt.colisnotnull;Planhashvalue:1434981293------------------------------......
  • 联想小新pro16 ubuntu18.04双系统、显卡驱动配置
    双系统安装注意了,所有的步骤都要按照这个链接来,跳过一步可能就出错了Ubuntu18.04安装教程每一步都有、多图卸载ubuntu方法一旦出错,先去计算机磁盘管理里面把ubuntu相关的区都给删掉,下面这个图不太清楚,主要就是上个链接中的四个区都格式化。然后,按照这个教程的第三步删除开......
  • 小功率LED驱动电源行业市场发展策略及趋向分析报告2023-2029
    2023-2029全球小功率LED驱动电源行业调研及趋势分析报告2022年全球小功率LED驱动电源市场规模约417亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近643亿元,未来六年CAGR为6.3%。从核心市场看,中国小功率LED驱动电源市场占据全球约......
  • 驱动开发:内核RIP劫持实现DLL注入
    本章将探索内核级DLL模块注入实现原理,DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可,驱动级别的注入有多种实现原理,而其中最简单的一种实现方式则是通过劫持EIP的方式实现,其实现原理可总结为,挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,并......
  • 使用 Spring 2.5 注释驱动的 IoC 功能
    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/概述注释配置相对于XML配置具有很多的优势:它可以充分利用Java的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用JPA注释配置ORM映射时,我们就不需要指定PO的属性名、类型等信息,如果关系表字......