0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Tina Linux Key快速配置使用指南

嵌入式Linux那些事 来源:嵌入式Linux那些事 作者:嵌入式Linux那些事 2023-03-06 11:03 次阅读

Tina Linux Key 快速配置使用指南

1 前言

1.1 文档简介

本文介绍Tina 平台key 相关的快速配置和使用方法。

1.2 目标读者

Allwinner key 驱动驱动层/应用层的使用/开发/维护人员。

1.3 适用范围

表1-1: 适用产品列表

产品名称 内核版本 平台架构
R18 Linux-4.4 cortex-a53(64 位)
R30 Linux-4.4 cortex-a53(64 位)
R328 Linux-4.9 cortex-a7(32 位)
R329 Linux-4.9 cortex-a53(64 位)
R818 Linux-4.9 cortex-a53(64 位)
R818B Linux-4.9 cortex-a53(64 位)
MR813 Linux-4.9 cortex-a53(64 位)
MR813B Linux-4.9 cortex-a53(64 位)
R528 Linux-5.4 cortex-a7(32 位)
D1 Linux-5.4 risc-v(64 位)
H133 Linux-5.4 cortex-a7(32 位)

2 模块介绍

2.1 Key 配置

Allwinner 平台支持三种不同类型的Key:GPIO-Key,ADC-Key,AXP-Key。其中,GPIOKey又包括普通的gpio 按键和矩阵键盘。

按键相关配置根据平台不同内核会有部分差异,下面作详细介绍。

说明

若板子上没有使用我司的带有按键功能的PMU,则就没有对应的AXP 按键。

2.2 相关术语介绍

2.2.1 软件术语

表2-1: Key 软件术语列表

术语 解释说明
Key 按键
GPIO-Key 使用GPIO 检测按键的设备
ADC 模数转换器
ADC-Key 通过ADC 读取电压检测按键的设备
LRADC 精度为6 位的单通道ADC
GPADC 精度为12 位的多通道ADC
PMU 电源管理单元
AXP-Key 连接在电源芯片的按键

3 GPIO-Key

3.1 4.4 以及4.9 内核

4.4 以及4.9 内核的按键相关配置是一样的。涉及到的驱动文件位于如下位置:

其中,64 位平台和32 位平台的dts 文件位置是不一样的。

lichee/linux-*/arch/arm/boot/dts/平台代号.dtsi //32位平台的dts文件位置

lichee/linux-*/arch/arm64/boot/dts/sunxi/平台代号.dtsi //64位平台的dts文件位置

其中drivers/input/keyboard/目录下的相关文件为驱动文件,而平台名称.dtsi 为设备树文件,例如R328 的dts 文件sun8iw18p1.dtsi,下面以R328 为例进行说明。

支持interrupt-key,poll-key 驱动文件如下:

lichee/linux-*/drivers/input/keyboard/gpio-keys-polled.c //gpio poll key

lichee/linux-*/drivers/input/keyboard/gpio-keys.c //interrupt key

R328 的dts 文件:

lichee/linux-4.9/arch/arm/boot/dts/sun8iw18p1.dtsi

配置这种类型的gpio-key 时,请先查询,当前的gpio 是否可以用作中断功能,如果该引脚可以用作中断功能,则采用interrupt 触发方式获取按键信息,若不能用

作中断功能,则只能采用轮询的方式查询按键的状态信息。

GOIO-Key 的硬件配置图参考下图所示:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228142536350

图3-1: GPIO-Key 配置图

3.1.1 普通GPIO 采用poll 方式

修改设备树文件

根据原理图arch/arm/boot/dts/sun8iw18p1.dtsi 文件中添加对应的gpio。例如音量加减键分别用到PH5,PH6 这两个GPIO,则修改方法如下:

gpio-keys {

compatible = "gpio-keys";

status = "okay";

vol-down-key {

gpios = <&pio PH 5 1 2 2 1>;

linux,code = <114>;

label = "volume down";

debounce-interval = <10>;

wakeup-source = <0x1>;

};

vol-up-key {

gpios = <&pio PH 6 1 2 2 1>;

linux,code = <115>;

label = "volume up";

debounce-interval = <10>;

};

};

• compatible:用于匹配驱动。 • status:是否加载设备。 • vol-down-key:每一个按键都是单独的一份配置,需要分别区分开来。 • gpios:GPIO 口配置。 • linux,code:这个按键对应的input 键值。 • label:单个按键对应的标签。 • debounce-interval:消抖时间,单位为us。 • wakeup-source:是否作为唤醒源,配置了这个项的按键可以作为唤醒源唤醒系统。

确认驱动是否被选中

确认gpio_keys_polled.c 是否编译进系统,在tina 目录下执行make kernel_menuconfig,需要将Polled GPIO buttons 选成“[*]”。

Device Drivers

└─>Input device support

└─>Keyboards

└─>Polled GPIO buttons

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228142913846

图3-2: linux4.4/4.9 轮询按键配置图

3.1.2 普通GPIO 采用中断方式

跟采用poll 方式一样,也需要完成如下步骤:

修改设备树文件 可见普通gpio 采用poll 方式,不一样的是这里gpio 采用中断的方式。

gpio-keys {

compatible = "gpio-keys";

status = "okay";

vol-down-key {

gpios = <&pio PH 5 6 2 2 1>;

linux,code = <114>;

label = "volume down";

debounce-interval = <10>;

wakeup-source = <0x1>;

};

vol-up-key {

gpios = <&pio PH 6 6 2 2 1>;

linux,code = <115>;

label = "volume up";

debounce-interval = <10>;

};

};

• compatible:用于匹配驱动。

• status:是否加载设备。

• vol-down-key:每一个按键都是单独的一份配置,需要分别区分开来。

• gpios:GPIO 口配置。

• linux,code:这个按键对应的input 键值。

• label:单个按键对应的标签。

• debounce-interval:消抖时间,单位为us。

• wakeup-source:是否作为唤醒源,配置了这个项的按键可以作为唤醒源唤醒系统。

确认驱动是否被选中 在tina 目录下执行make kernel_menuconfig,确保GPIO Buttons 被选上。

Device Drivers

└─>Input device support

└─>Keyboards

└─>GPIO Buttons

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228143516377

图3-3: linux4.4/4.9 中断按键配置图

3.2 5.4 内核

Linux-5.4 内核相对4.4/4.9 来说,GPIO 子系统有所变化,因此dts 的配置也不大一样。

dts 文件位置:

lichee/linux-5.4/arch/arm/boot/dts/平台代号.dtsi //32位平台的dts文件位置

lichee/linux-5.4/arch/riscv/boot/dts/sunxi/平台代号.dtsi //risc-v架构平台的dts文件位置

其中drivers/input/keyboard/目录下的相关文件为驱动文件。

支持interrupt-key,poll-key 驱动文件如下:

lichee/linux-5.4/drivers/input/keyboard/gpio-keys-polled.c //gpio poll key lichee/linux-5.4/drivers/input/keyboard/gpio-keys.c //interrupt key

3.2.1 普通GPIO 采用poll 方式

修改设备树文件

gpio-keys { compatible = "gpio-keys"; status = "okay"; vol-down-key { gpios = <&pio PH 5 GPIO_ACTIVE_LOW>; linux,code = <114>; label = "volume down"; debounce-interval = <10>; wakeup-source = <0x1>; }; vol-up-key { gpios = <&pio PH 6 GPIO_ACTIVE_LOW>; linux,code = <115>; label = "volume up"; debounce-interval = <10>; }; };

• compatible:用于匹配驱动。 • status:是否加载设备。 • vol-down-key:每一个按键都是单独的一份配置,需要分别区分开来。 • gpios:GPIO 口配置。 • linux,code:这个按键对应的input 键值。 • label:单个按键对应的标签。 • debounce-interval:消抖时间,单位为us。 • wakeup-source:是否作为唤醒源,配置了这个项的按键可以作为唤醒源唤醒系统。

与4.4/4.9 相比,主要是gpios 配置方式变化了。

选上驱动 GPIO-Key 轮询驱动kernel_menuconfig 路径:

Device Drivers └─>Input device support └─>Keyboards └─>Polled GPIO buttons

3.2.2 普通GPIO 采用中断方式

修改设备树文件

gpio-keys { compatible = "gpio-keys"; status = "okay"; vol-down-key { gpios = <&pio PH 5 GPIO_ACTIVE_LOW>; linux,code = <114>; label = "volume down"; debounce-interval = <10>; wakeup-source = <0x1>; }; vol-up-key { gpios = <&pio PH 6 GPIO_ACTIVE_LOW>; linux,code = <115>; label = "volume up"; debounce-interval = <10>; }; };

• compatible:用于匹配驱动。 • status:是否加载设备。 • vol-down-key:每一个按键都是单独的一份配置,需要分别区分开来。 • gpios:GPIO 口配置。 • linux,code:这个按键对应的input 键值。 • label:单个按键对应的标签。 • debounce-interval:消抖时间,单位为us。 • wakeup-source:是否作为唤醒源,配置了这个项的按键可以作为唤醒源唤醒系统。

选上驱动 GPIO-Key 中断驱动kernel_menuconfig 路径:

Device Drivers └─>Input device support └─>Keyboards └─>GPIO Button

3.2.3 矩阵键盘 当需要使用大量按键的时候,如果单独给每一个按键配一个GPIO 的话,那GPIO 是远远不够的。这时,可以使用矩阵键盘的方式,使用N 个GPIO,就可以最大支持N*N 个按键。矩阵按键的硬件原理图如下所示:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144144489

图3-4: 矩阵按键硬件原理图

警告 矩阵键盘的GPIO 建议使用SOC 自带的IO 口,不使用扩展IO 芯片的IO 口。因为矩阵键盘扫描按键的时间比较短,而扩展IO 芯片的IO 是通过I2C/UART 等等的总线去修改IO 状态的,修改一次状态时间比较长,可能会导致矩阵按键扫描按键检测失败的。

这里以R528 为示例,dts 为:

lichee/linux-5.4/arch/arm/boot/dts/sun8iw20p1.dtsi

驱动文件为:

lichee/linux-5.4/drivers/input/keyboard/matrix_keypad.c

修改设备树文件 根据R528 原理图来添加对应行和列的gpio,分别写在row-gpios 和col-gpios,详细设备树文件为:

matrix_keypad:matrix-keypad { compatible = "gpio-matrix-keypad"; keypad,num-rows = <6>; keypad,num-columns = <7>; row-gpios = <&pio PG 17 GPIO_ACTIVE_LOW        &pio PG 18 GPIO_ACTIVE_LOW        &pio PG 1 GPIO_ACTIVE_LOW        &pio PG 2 GPIO_ACTIVE_LOW        &pio PG 3 GPIO_ACTIVE_LOW        &pio PG 4 GPIO_ACTIVE_LOW>; col-gpios = <&pio PG 0 GPIO_ACTIVE_LOW        &pio PG 5 GPIO_ACTIVE_LOW        &pio PG 12 GPIO_ACTIVE_LOW        &pio PG 14 GPIO_ACTIVE_LOW        &pio PG 6 GPIO_ACTIVE_LOW        &pio PG 8 GPIO_ACTIVE_LOW        &pio PG 10 GPIO_ACTIVE_LOW>; linux,keymap = <        0x00000001 //row 0 col0        0x00010002        0x00020003        0x00030004        0x00040005        0x00050006        0x00060007        0x01000008 //row 1 col0        0x01010009        0x0102000a        0x0103000b        0x0104000c        0x0105000d        0x0106000e        0x0200000f //row 2 col0        0x02010010        0x02020011        0x02030012        0x02040013        0x02050014        0x02060015        0x03000016 //row 3 col0        0x03010017        0x03020018        0x03030019        0x0304001a        0x0305001b        0x0306001c        0x0400001d //row 4 col0        0x0401001e        0x0402001f        0x04030020        0x04040021        0x04050022        0x04060023        0x05000024 //row 5 col0        0x05010025        0x05020026        0x05030027        0x05040028        0x05050029        0x0506002a    >; gpio-activelow; debounce-delay-ms = <20>; col-scan-delay-us = <20>; linux,no-autorepeat; status = "okay"; };

设备树文件参数描述如下: • keypad,num-rows:行数 • keypad,num-columns:列数 • row-gpios:行对应的gpio 口,从第一行开始 • col-gpios:列对应的gpio 口,从第一列开始 • linux,keymap:每一个按键对应的键值 • gpio-activelow:按键按下时,行线是否为低电平。用于触发中断,必须配置。 • debounce-delay-ms:消抖时间。 • col-scan-delay-us:扫描延时,如果IO 状态转换时间过长可能会导致按键扫描错误。 • linux,no-autorepeat:按键按下时是否重复提交按键, 设1 就是不重复, 设0 重复。

确认驱动是否被选中在tina 目录下执行运行make kernel_menuconfig,确认以下配置:

Device Drivers └─>Input device support └─>Keyboards └─>GPIO driven matrix keypad support

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144512150

图3-5: 矩阵键盘配置图

4 ADC-Key

ADC-Key 一共有两种adc 检测方式,分别是LRADC 和GPADC。LRADC 分辨率为6 位,GPADC 分辨率为12 位,因此后者精度会更高。

下面将分别讲述两种不同的方式。

4.1 4.4 以及4.9 内核

4.1.1 LRADC-Key

LRADC-Key 有如下特性:

1.Support voltage input range between 0 to 2V。 2.Support sample rate up to 250Hz,可以配置为32Hz,62Hz,125Hz,250Hz,R328 sdk中默认配置为250Hz。

3.当前lradc key 最大可以支持到13 个按键(0.15V 为一个档),通常情况下,建议lradc key最大不要超过8 个(0.2V 为一档),否则由于采样误差、精度等因素存在,

会很容易出现误判的情况。

如下图所示,lradc-key 检测原理是当有按键被按下或者抬起时,LRADC 控制器(6bit) 检测到电压变化后,经过LRADC 内部的逻辑控制单元进行比较运算后,产生相

应的中断给CPU, 同时电压的变化值会通过LRADC 内部的data register 的值(0~0x3f) 来体现。

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144650067

图4-1: LRADC 按键原理图

下面以R328 为例进行说明,驱动文件:

linux-4.9/drivers/input/keyboard/sunxi-keyboard.c linux-4.9/arch/arm/boot/dts/sun8iw18p1.dtsi

如果使用adc-key , 请先确保softwinner KEY BOARD support 有被选择上。

Device Drivers └─>Input device support └─>Keyboards └─>softwinnner KEY BOARD support

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144827271

图4-2: linux4.4/4.9 LRADC 按键配置图

在lradc-key 驱动中涉及两个重要的结构体

static unsigned char keypad_mapindex[64] = { 0,0,0,0,0,0,0, /* key 1, 0-7 */ 1,1,1,1,1,1, /* key 2, 8-14 */ 2,2,2,2,2,2, /* key 3, 15-21 */ 3,3,3,3,3, /* key 4, 22-27 */ 4,4,4,4,4, /* key 5, 28-33 */ 5,5,5,5,5, /* key 6, 34-39 */ 6,6,6,6,6,6,6,6,6, /* key 7, 40-49 */ 7,7,7,7,7,7,7,7,7,7,7,7,7 /* key 8, 50-63 */ }; static unsigned int sunxi_scankeycodes[KEY_MAX_CNT] = { [0 ] = KEY_VOLUMEUP, [1 ] = KEY_VOLUMEDOWN, [2 ] = KEY_HOME, [3 ] = KEY_ENTER, [4 ] = KEY_MENU, [5 ] = KEY_RESERVED, [6 ] = KEY_RESERVED, [7 ] = KEY_RESERVED, [8 ] = KEY_RESERVED, [9 ] = KEY_RESERVED, [10] = KEY_RESERVED, [11] = KEY_RESERVED, [12] = KEY_RESERVED, };

keypad_mapindex[] 数组的值跟LRADC_DATA0(0x0C) 的值是对应的,表示的具体意义是:key_val(lradc_data0 寄存器的值) 在0~7 范围内时,表示的是操作

key1,依此类推,key_val为8~14 的范围之内时,表示的操作key2。正常来说,按照R16 推荐的硬件设计,该数组内无需任何更改,当个别情况下,如遇到adc-

key input 上报的keycode 有异常时,需要依次按下每个按键同时读取key_val 的值来修正keypad_mapindex[]。

sunxi_scankeycodes[]: 该数组的意义为sunxi_scankeycodes[*] 标示的是具体的某一个key,用户可以修改其中的keycode。

例如,key_val 等于25, 则根据keypad_mapindex 得到scancode 为4, 再由sunxi_scankeycodes得到键值为KEY_MENU。

keypad_mapindex 这个数组可以通过sys_config 进行配置:

[key_para] key_used = 1 key_cnt = 5 key1_vol = 300 key2_vol = 600 key3_vol = 1000 key4_vol = 1500 key5_vol = 1800

这个配置下转换得到的keypad_mapindex 数组是:

static unsigned char keypad_mapindex[64] = { 0,0,0,0,0,0,0,0,0,0 /* key 1, 0-9 */ 1,1,1,1,1,1,1,1,1,1, /* key 2, 10-19 */ 2,2,2,2,2,2,2,2,2,2,2,2,2, /* key 3, 20-32 */ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, /* key 4, 33-48 */ 4,4,4,4,4,4,4,4,4,4, /* key 5, 49-58 */ 5,5,5,5,5, /* key 6, 59-63 */ };

设备树文件sun8iw18p1.dtsi

keyboard0:keyboard{ compatible = "allwinner,keyboard_1350mv"; reg = <0x0 0x05070800 0x0 0x400>; interrupts = ; status = "okay"; key_cnt = <5>; key0 = <164 115>; key1 = <415 114>; key2 = <646 139>; key3 = <900 28>; key4 = <1157 102>; wakeup-source; };

• compatible:匹配驱动。

• reg:LRADC 模块的基地址。

• interrupts:LRADC 中断源。

• status:是否加载驱动。

• key_cnt:按键数量。

• key0:第一个按键,前面数字的是电压范围,后者是input 系统的键值。

• wakeup-source:LRADC 作为唤醒源。

驱动初始化时,会读取设备树中相关属性,其中key_cnt 表示配置的按键个数,keyX 配置对应的ADC 值以及键值。根据这些属性,会重新设置keypad_mapindex

数组,以及sunxi_scankeycodes 数组。

keypad_mapindex[] 数组的值跟ADC 值是对应的, 6bitADC, 范围0~63,表示的具体意义是:key_val 在0~190 范围内时,表示的是操作key0, 以此类推,key_val

为191~390 范围内时,表示的是操作key1。

sunxi_scankeycodes[]: 该数组的意义为sunxi_scankeycodes[*] 表示的是具体的某一个key,用户可以修改设备树来改变keycode。

例如,默认配置下,key_val 等于300, 则根据keypad_mapindex 得到scancode 为1, 再由sunxi_scankeycodes 得到键值114。

4.1.2 GPADC-Key

GPADC 有多个通道,例如在R328S3 中有4 个通道。

通道有三种工作模式:

一、是在指定的通道完成一次转换,转换数据更新在对应通道的数据寄存器中;

二、在所有指定的通道连续转换直到软件停止,转换数据更新在对应通道的数据寄存器中;

三、可以在指定的通道进行adc 的采样和转换,并将结果顺序地存入FIFO,FIFO 深度为64 并支持中断控制。

检测原理是当按键被按下或抬起时,指定的通道的控制器检测到电压变化,然后经过逻辑控制单元进行比较运算后,产生相应的中断给CPU。R328S3 的GPADC

的框图如下图所示。

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228145351260

图4-3: GPADC 按键硬件图

以R328S3 为例,驱动文件:

linux-4.9/drivers/input/sensor/sunxi_gpadc.c linux-4.9/drivers/input/sensor/sunxi_gpadc.h

如果使用gpadc-key,请先确保SENSORS_GPADC 有被选上。

Device Drivers └─>Device Drivers └─>Input device support └─>Sensors └─>SUNXI GPADC

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228145601077

图4-4: linux4.4/4.9 GPADC 按键配置图

在gpadc 中与lradc 一样涉及两个重要的结构体

static unsigned char keypad_mapindex[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, /* key 1, 0-8 */ 1, 1, 1, 1, 1, /* key 2, 9-13 */ 2, 2, 2, 2, 2, 2, /* key 3, 14-19 */ 3, 3, 3, 3, 3, 3, /* key 4, 20-25 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* key 5, 26-36 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* key 6, 37-39 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, /* key 7, 40-49 */ 7, 7, 7, 7, 7, 7, 7 /* key 8, 50-63 */ }; u32 scankeycodes[KEY_MAX_CNT];

keypad_mapindex[] 数组的定义与LRADC 的相似,但是要注意的是,GPADC 的数组大小为128,而LRADC 的是64,所以说GPADC 的精度更高。在linux4.9 内核

中已经不在数组里配置了,程序中该数组只是初始化的。后面会根据sys_config 或者dts 的配置来生成所要使用的keypad_mapindex[]。

设备树文件这里示例的是R328S3 的方案级设备树文件:

lichee/linux-4.9/arch/arm/boot/dts/sun8iw18p1.dtsi

详细GPADC 配置如下:

gpadc:gpadc{ compatible = "allwinner,sunxi-gpadc"; reg = <0x0 0x05070000 0x0 0x400>; interrupts = ; clocks = <&clk_gpadc>; status = "disable"; };

• compatible:匹配驱动。 • reg:GPADC 寄存器基地址。 • interrupts:GPADC 中断源。 • clocks:GPADC 依赖的时钟。 • status:是否加载设备。

4.sys_config.fex 文件

[gpadc] gpadc_used = 1 channel_num = 1 channel_select = 0x01 channel_data_select = 0 channel_compare_select = 0x01 channel_cld_select = 0x01 channel_chd_select = 0 channel0_compare_lowdata = 1700000 channel0_compare_higdata = 1200000 key_cnt = 4 key0_vol = 164 key0_val = 115 key1_vol = 415 key1_val = 114 key2_vol = 700 key2_val = 139 key3_vol = 1000 key3_val = 28

在sys_config 中,配置含义如下:

• channel_num:表示平台上支持的最大通道数; • channel_select:表示通道启用设置,通道0:0x01 通道1:0x02 通道2:0x04 通道3:0x08; • channel_data_select:表示通道数据启用,通道0:0x01 通道1:0x02 通道2:0x04 通道3:0x08; • channel_compare_select;表示比较功能启用,通道写法跟前面一致; • channel0_compare_lowdata:表示的低于该电压可以产生中断,这里是1.7V; • channel0_compare_higdata:则是高于该电压可以产生中断,这里是1.2V; • key_cnt:表示的是按键个数; • key_vol:表示第 个按键的电压值; • key_val:表示的是第 个按键的键值。

在软件上,当key_vol 在0~164 范围时,表示的是操作key0,以此类推;在硬件上,164 表示的是164mV,通过计算keyn_vol = keyn_vol + ( key(n+1)_vol -

keyn_vol) / 2来得到范围。比如说第一个范围为key0_vol = 164 + (415 - 164) / 2 = 289.5,即电压在0~289.5 在,adc 检测到为操作的key0,以此类推。然后通过

scankeycodes 得到键值115。

5.board.dts 文件

方案级设备树文件只写这个模块的配置,而详细的按键配置一般需要写在板级的board.dts 中。

/* resistance gpadc configuration channel_num: Maxinum number of channels supported on the platform. channel_select: channel enable setection. channel0:0x01 channel1:0x02 channel2:0x04 channel3:0x08 channel_data_select: channel data enable. channel0:0x01 channel1:0x02 channel2:0x04 channel3:0x08. channel_compare_select: compare function enable channel0:0x01 channel1:0x02 channel2:0 x04 channel3:0x08. channel_cld_select: compare function low data enable setection: channel0:0x01 channel1:0 x02 channel2:0x04 channel3:0x08. channel_chd_select: compare function hig data enable setection: channel0:0x01 channel1:0 x02 channel2:0x04 channel3:0x08. */ gpadc:gpadc{ channel_num = <1>; channel_select = <0x01>; channel_data_select = <0>; channel_compare_select = <0x01>; channel_cld_select = <0x01>; channel_chd_select = <0>; channel0_compare_lowdata = <1700000>; channel0_compare_higdata = <1200000>; channel1_compare_lowdata = <460000>; channel1_compare_higdata = <1200000>; key_cnt = <5>; key0_vol = <210>; key0_val = <115>; key1_vol = <410>; key1_val = <114>; key2_vol = <590>; key2_val = <139>; key3_vol = <750>; key3_val = <28>; key4_vol = <880>; key4_val = <102>; status = "okay"; };

dts 文件参数的含义可以参考sys_config.fex 的。

4.2 5.4 内核

4.2.1 LRADC-Key

5.4 内核的LRADC 驱动功能与4.4/4.9 内核的无明显变化,因此下面只介绍设备树文件与配置教程

修改设备树文件

这里以D1 为例,设备树文件路径为:

lichee/linux-5.4/arch/riscv/boot/dts/sunxi/sun20iw1p1.dtsi

dtsi 一般默认已经写好LRADC 的配置:

keyboard0: keyboard@2009800 { compatible = "allwinner,keyboard_1350mv"; reg = <0x0 0x02009800 0x0 0x400>; interrupts-extended = <&plic0 77 IRQ_TYPE_EDGE_RISING>; clocks = <&ccu CLK_BUS_LRADC>; resets = <&ccu RST_BUS_LRADC>; key_cnt = <5>; key0 = <210 115>; key1 = <410 114>; key2 = <590 139>; key3 = <750 28>; key4 = <880 172>; wakeup-source; status = "okay"; };

• compatible:匹配驱动。

• reg:LRADC 模块的基地址。

• interrupts:LRADC 中断源。

• status:是否加载驱动。

• key_cnt:按键数量。

• key0:第一个按键,前面数字的是电压范围,后者是input 系统的键值。

• wakeup-source:LRADC 作为唤醒源。

但是D1 方案电路板上实际LRADC 只连接了一个按键,此时可以通过修改board.dts 来进行配置。若实际的电路板上LRADC 按键是符合以上配置的,则不需要修

改。

说明 board.dts 的配置最终会覆盖了方案的dtsi 文件配置

board.dts 配置:

&keyboard0 { key_cnt = <1>; key0 = <210 115>; status = "okay"; };

确认驱动是否被选中在tina 目录下执行make kernel_menuconfig,确认以下配置:

Device Drivers └─>Input device support └─>Keyboards └─>softwinnner KEY BOARD support

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228150327080

图4-5: Linux-5.4 LRADC 按键配置图

4.2.2 GPADC-Key

5.4 内核的GPADC 设备树配置主要是时钟和中断方面有所改动,board.dts 配置可参考4.9 内核。

修改设备树文件

这里以D1 来作为示例,设备树文件为:

lichee/linux-5.4/arch/riscv/boot/dts/sunxi/sun20iw1p1.dtsi

详细配置为:

gpadc: gpadc@2009000 { compatible = "allwinner,sunxi-gpadc"; reg = <0x0 0x02009000 0x0 0x400>; interrupts-extended = <&plic0 73 IRQ_TYPE_LEVEL_HIGH>; clocks = <&ccu CLK_BUS_GPADC>; clock-names = "bus"; resets = <&ccu RST_BUS_GPADC>; status = "okay"; };

• compatible:匹配驱动。 • reg:GPADC 寄存器基地址。 • interrupts:GPADC 中断源。 • clocks:GPADC 依赖的时钟。 • status:是否加载设备。

确认驱动是否被选中 在tina 目录下执行make kernel_menuconfig,确认以下配置:

Device Drivers └─>Input device support └─>Sensors └─>sunxi gpadc driver support

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228150504719

图4-6: Linux-5.4 GPADC 配置图

5 AXP-Key

使用AXP-Key 的话需要电路板上带上我司提供power-key 功能的PMU,这是由PMU 识别该按键,并在驱动中上报相关事件,power-key 驱动源码在电源驱动源码

同目录下。用户不需要做任何更改,这部分是可以直接使用的。

这里使用R329 来作为例子,其对应的设备节点为:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228150541561

图5-1: AXP 按键节点图

上报的键值为KEY_POWER 116

5.1 4.9 内核

修改设备树文件这里以R329-evb1 为例,设备树文件为board.dts,路径:

device/config/chips/r329/configs/evb1/board.dts

详细配置为:

&twi2{ no_suspend = <1>; status = "okay"; pmu0: pmu@34 { compatible = "x-powers,axp2585"; ............省略其他无关配置 powerkey0: powerkey@0 { status = "okay"; compatible = "x-powers,axp2585-pek"; pmu_powkey_off_time = <6000>; pmu_powkey_off_func = <0>; pmu_powkey_off_en = <1>; pmu_powkey_long_time = <1500>; pmu_powkey_on_time = <1000>; wakeup_rising; /* wakeup_falling; */ }; }; };

确认驱动是否被选中

tina 目录下执行make kernel_menuconfig,确认以下配置:

Device Drivers └─>Input device support └─>Miscellaneous devices └─>X-Powers AXP2101 power button driver

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228151211736

图5-2: AXPKEY 配置图

警告 不同方案使用的PMU 可能会不一样,因此AXP-KEY 的配置也会不一致,详细查看各个方案使用的PMU 型号。

这里另外,PMU 还提供了AXP GPIO, 根据不同型号的PMU, GPIO 数量可能不一样,但gpio number 均以1024 开始,例如AXP GPIO0 的gpio number 为1024,

AXP GPIO1 的gpio number 为1025。它们均能当做普通gpio 使用,因此按照GPIO-Key 章节的描述去操作它们即可需要注意的是,sys_config 中axp gpio 的命名

与普通gpio 有些区别,例如AXP gpio0:

port:power0<1><0><0>

5.2 5.4 内核

说明 本章节暂不介绍Linux-5.4 内核。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39846
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50570
  • Tina
    +关注

    关注

    2

    文章

    44

    浏览量

    16829
  • key
    key
    +关注

    关注

    0

    文章

    44

    浏览量

    12744
收藏 人收藏

    评论

    相关推荐

    OpenRemoved_Tina_Linux系统调试使用指南

    本文主要服务于使用Tina软件平台的广大客户,帮助开发人员方便快速了解Tina平台系统调试工具。
    的头像 发表于 03-06 09:51 953次阅读

    Tina_Linux系统裁剪开发指南

    Tina_Linux系统裁剪开发指南1 概述2 Tina系统裁剪简介2.1 boot0裁剪2.2 uboot裁剪2.3 内核裁剪2.3.1 删除不使用的功能2.3.2 删除不使用的驱动2.3.3
    的头像 发表于 03-06 09:52 1116次阅读

    PWM使用指南

    日期作者版本说明2020.09.26TaoV0.0撰写中目录简要介绍常用配置设置更新中断输出PWM脉冲捕获输出带死区控制的互补PWM使用指南简要介绍常用配置设置更新中断输出PWM脉冲捕获输出带死区控制的互补PWM
    发表于 08-09 08:54

    Tina Linux 系统介绍

    menuconfig配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。系统框图Tina系统软件架构如图所示。从下至上分别为Kernel && Driver
    发表于 03-11 15:05

    分享一份Board配置系统使用指南

    1、Board 配置系统使用指南为了践行 一切皆文件 的思想,我们针对嵌入式应用不同的硬件配置需求,提出了一套 Board 配置系统。 Board
    发表于 06-27 17:43

    ESP BLE MESH快速配置问题求解

    选择了快速配置,并输入期望快速配置计数为35.我的EspBleMesh应用程序已连接,在快速配置应用程序中,我仅找到一个已连接的节点,并且能够控制该节点我通过查看蓝色LED确认已连接的节点未
    发表于 03-09 07:56

    AT32 VSCode PlatFormIO使用指南

    AT32 VSCode PlatFormIO使用指南旨在帮助使用VSCode+PlatFormIO开发AT32的用户,快速建立开发环境并进行开发。
    发表于 10-26 07:14

    Tina快速入门用户指南

    这本用户快速入门指南概要性的介绍了TINA-TI.一个强大的电路设计及仿真工具。TINA-TI是理想的用于对各种基本的和 高级的电路(具有复杂的结构、没有任何节点或器件数量的限制)进行
    发表于 03-16 15:58 0次下载

    如何开始一个项目垫集成流:如何快速配置新笔记与优化设计库

    学习如何快速配置新笔记与优化设计库,所以你可以简单地拖拽到方案设计部分。
    的头像 发表于 10-10 07:10 2596次阅读

    电子票使用指南免费下载

    电子票使用指南电子票使用指南电子票使用指南电子票使用指南电子票使用指南电子票使用指南
    发表于 11-24 14:02 3次下载

    TINA-TI电路设计仿真工具快速入门指南

    TI仿真软件TINA-TI的指南,帮助你们快速入门仿真。
    发表于 04-13 09:25 12次下载

    windows7系统快速配置

    windows7系统快速配置
    发表于 09-05 09:49 1次下载

    Tina_Linux_系统软件开发指南

    Tina_Linux_系统软件开发指南
    的头像 发表于 03-02 15:25 1013次阅读
    <b class='flag-5'>Tina_Linux</b>_系统软件开发<b class='flag-5'>指南</b>

    Tina Linux配置开发指南

    Tina Linux配置开发指南
    的头像 发表于 03-02 15:28 1.4w次阅读
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b><b class='flag-5'>配置</b>开发<b class='flag-5'>指南</b>

    行车记录仪专用的配置工具:termconfigv1.52快速配置工具

    一款行车记录仪专用的配置工具,可以快速产生指令termconfigv1.52快速配置工具
    发表于 11-15 09:30 0次下载