Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

开发多按键输入驱动,不妨采用这种方式

Posted on 2023年9月19日 by hackdl
源创会,线下重启!2023年7月1日深圳站—基础软件技术面面谈!免费票限时抢购!

多按键输入驱动

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

1、查找电路图

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

2、查找设备树

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

&lradc {
	vref-supply = ;
	status = "okay";
 
	button@200 {
		label = "Volume Up";
		linux,code = ;
		channel = ;
		voltage = ;
	};
 
	button@400 {
		label = "Volume Down";
		linux,code = ;
		channel = ;
		voltage = ;
	};
 
	button@600 {
		label = "Select";
		linux,code = ;
		channel = ;
		voltage = ;
	};
 
	button@800 {
		label = "Start";
		linux,code = ;
		channel = ;
		voltage = ;
	};
};

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

lradc: lradc@01c22800 {
			compatible = "allwinner,sun4i-a10-lradc-keys";
			reg = ;
			interrupts = ;
			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 ");
MODULE_LICENSE("GPL");

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
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 

上面这段代码是从其他地方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 chan0_map_count; i++) {
			diff = abs(lradc->chan0_map[i].voltage - voltage);
			if (diff chan0_map[i].keycode;
			}
		}
#else
		printk("val = %dn", val);
		if(val >=9 && val chan0_map[0].keycode;
		else if(val >=24 && val chan0_map[1].keycode;
		else if(val >= 35 && val chan0_map[2].keycode;
		else
			keycode = lradc->chan0_map[3].keycode;
#endif

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net

相关推荐: [ESP] 私有版Rainmaker User Mapping

[ESP] 私有版Rainmaker User Mapping 1. 设备烧录的程序rainmaker自带gpio示例 我这里是自己的工程,可以参照 idf.py set-target esp32 idf.py build idf.py -p /dev/tty…

Related posts:

  1. 临夏机柜租用
  2. 服务器托管企业规定:规范企业服务管理
  3. ansible脚本–playbook剧本
  4. 服务器应急托管软件
  5. 游戏服务器托管租用,稳定、高效的选择

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: 基于SSM的校园旧书交易交换平台一、项目简介二、系统功能 三、系统项目截图四、核心代码
下一篇: css 样式文件中的特殊符号 – 波浪号(也叫 tilde,squiggle,twiddle)

最新更新

  • 如何使用 Megatron-LM 训练语言模型
  • Android 开关机POWER键 长按短按代码分析
  • kubernates的集群安装-kubadm
  • java线程池最佳实践
  • 腾讯的认证到底有没有用?怎么样可以通过考试?

随机推荐

  • Linux 安装 Node Exporter
  • 用JavaScript撸一个静态链表
  • 石景山机房咨询与管理:专业服务。
  • 深入了解服务器托管机房考察方法
  • Oracle故障处理:ORA-00245: con

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8