0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tina Linux Key快速配置使用指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 11:03 ? 次閱讀

Tina Linux Key 快速配置使用指南

1 前言

1.1 文檔簡介

本文介紹Tina 平臺key 相關(guān)的快速配置和使用方法。

1.2 目標(biāo)讀者

Allwinner key 驅(qū)動(dòng)驅(qū)動(dòng)層/應(yīng)用層的使用/開發(fā)/維護(hù)人員。

1.3 適用范圍

?

表1-1: 適用產(chǎn)品列表

?

產(chǎn)品名稱 內(nèi)核版本 平臺架構(gòu)
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 按鍵和矩陣鍵盤。

按鍵相關(guān)配置根據(jù)平臺不同內(nèi)核會有部分差異,下面作詳細(xì)介紹。

說明

若板子上沒有使用我司的帶有按鍵功能的PMU,則就沒有對應(yīng)的AXP 按鍵。

2.2 相關(guān)術(shù)語介紹

2.2.1 軟件術(shù)語

?

表2-1: Key 軟件術(shù)語列表

?

術(shù)語 解釋說明
Key 按鍵
GPIO-Key 使用GPIO 檢測按鍵的設(shè)備
ADC 模數(shù)轉(zhuǎn)換器
ADC-Key 通過ADC 讀取電壓檢測按鍵的設(shè)備
LRADC 精度為6 位的單通道ADC
GPADC 精度為12 位的多通道ADC
PMU 電源管理單元
AXP-Key 連接在電源芯片的按鍵

3 GPIO-Key

3.1 4.4 以及4.9 內(nèi)核

4.4 以及4.9 內(nèi)核的按鍵相關(guān)配置是一樣的。涉及到的驅(qū)動(dòng)文件位于如下位置:

其中,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/目錄下的相關(guān)文件為驅(qū)動(dòng)文件,而平臺名稱.dtsi 為設(shè)備樹文件,例如R328 的dts 文件sun8iw18p1.dtsi,下面以R328 為例進(jìn)行說明。

支持interrupt-key,poll-key 驅(qū)動(dòng)文件如下:

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 時(shí),請先查詢,當(dāng)前的gpio 是否可以用作中斷功能,如果該引腳可以用作中斷功能,則采用interrupt 觸發(fā)方式獲取按鍵信息,若不能用

作中斷功能,則只能采用輪詢的方式查詢按鍵的狀態(tài)信息。

GOIO-Key 的硬件配置圖參考下圖所示:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228142536350

?

圖3-1: GPIO-Key 配置圖

?

3.1.1 普通GPIO 采用poll 方式

修改設(shè)備樹文件

根據(jù)原理圖arch/arm/boot/dts/sun8iw18p1.dtsi 文件中添加對應(yīng)的gpio。例如音量加減鍵分別用到PH5,PH6 這兩個(gè)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:用于匹配驅(qū)動(dòng)。 ? status:是否加載設(shè)備。 ? vol-down-key:每一個(gè)按鍵都是單獨(dú)的一份配置,需要分別區(qū)分開來。 ? gpios:GPIO 口配置。 ? linux,code:這個(gè)按鍵對應(yīng)的input 鍵值。 ? label:單個(gè)按鍵對應(yīng)的標(biāo)簽。 ? debounce-interval:消抖時(shí)間,單位為us。 ? wakeup-source:是否作為喚醒源,配置了這個(gè)項(xiàng)的按鍵可以作為喚醒源喚醒系統(tǒng)。

確認(rèn)驅(qū)動(dòng)是否被選中

確認(rèn)gpio_keys_polled.c 是否編譯進(jìn)系統(tǒng),在tina 目錄下執(zhí)行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 方式一樣,也需要完成如下步驟:

修改設(shè)備樹文件 可見普通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:用于匹配驅(qū)動(dòng)。

? status:是否加載設(shè)備。

? vol-down-key:每一個(gè)按鍵都是單獨(dú)的一份配置,需要分別區(qū)分開來。

? gpios:GPIO 口配置。

? linux,code:這個(gè)按鍵對應(yīng)的input 鍵值。

? label:單個(gè)按鍵對應(yīng)的標(biāo)簽。

? debounce-interval:消抖時(shí)間,單位為us。

? wakeup-source:是否作為喚醒源,配置了這個(gè)項(xiàng)的按鍵可以作為喚醒源喚醒系統(tǒng)。

確認(rèn)驅(qū)動(dòng)是否被選中 在tina 目錄下執(zhí)行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 內(nèi)核

Linux-5.4 內(nèi)核相對4.4/4.9 來說,GPIO 子系統(tǒng)有所變化,因此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架構(gòu)平臺的dts文件位置

其中drivers/input/keyboard/目錄下的相關(guān)文件為驅(qū)動(dòng)文件。

支持interrupt-key,poll-key 驅(qū)動(dòng)文件如下:

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 方式

修改設(shè)備樹文件

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:用于匹配驅(qū)動(dòng)。 ? status:是否加載設(shè)備。 ? vol-down-key:每一個(gè)按鍵都是單獨(dú)的一份配置,需要分別區(qū)分開來。 ? gpios:GPIO 口配置。 ? linux,code:這個(gè)按鍵對應(yīng)的input 鍵值。 ? label:單個(gè)按鍵對應(yīng)的標(biāo)簽。 ? debounce-interval:消抖時(shí)間,單位為us。 ? wakeup-source:是否作為喚醒源,配置了這個(gè)項(xiàng)的按鍵可以作為喚醒源喚醒系統(tǒng)。

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

選上驅(qū)動(dòng) GPIO-Key 輪詢驅(qū)動(dòng)kernel_menuconfig 路徑:

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

3.2.2 普通GPIO 采用中斷方式

修改設(shè)備樹文件

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:用于匹配驅(qū)動(dòng)。 ? status:是否加載設(shè)備。 ? vol-down-key:每一個(gè)按鍵都是單獨(dú)的一份配置,需要分別區(qū)分開來。 ? gpios:GPIO 口配置。 ? linux,code:這個(gè)按鍵對應(yīng)的input 鍵值。 ? label:單個(gè)按鍵對應(yīng)的標(biāo)簽。 ? debounce-interval:消抖時(shí)間,單位為us。 ? wakeup-source:是否作為喚醒源,配置了這個(gè)項(xiàng)的按鍵可以作為喚醒源喚醒系統(tǒng)。

選上驅(qū)動(dòng) GPIO-Key 中斷驅(qū)動(dòng)kernel_menuconfig 路徑:

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

3.2.3 矩陣鍵盤 當(dāng)需要使用大量按鍵的時(shí)候,如果單獨(dú)給每一個(gè)按鍵配一個(gè)GPIO 的話,那GPIO 是遠(yuǎn)遠(yuǎn)不夠的。這時(shí),可以使用矩陣鍵盤的方式,使用N 個(gè)GPIO,就可以最大支持N*N 個(gè)按鍵。矩陣按鍵的硬件原理圖如下所示:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144144489

?

圖3-4: 矩陣按鍵硬件原理圖

?

警告 矩陣鍵盤的GPIO 建議使用SOC 自帶的IO 口,不使用擴(kuò)展IO 芯片的IO 口。因?yàn)榫仃囨I盤掃描按鍵的時(shí)間比較短,而擴(kuò)展IO 芯片的IO 是通過I2C/UART 等等的總線去修改IO 狀態(tài)的,修改一次狀態(tài)時(shí)間比較長,可能會導(dǎo)致矩陣按鍵掃描按鍵檢測失敗的。

這里以R528 為示例,dts 為:

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

驅(qū)動(dòng)文件為:

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

修改設(shè)備樹文件 根據(jù)R528 原理圖來添加對應(yīng)行和列的gpio,分別寫在row-gpios 和col-gpios,詳細(xì)設(shè)備樹文件為:

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"; };

設(shè)備樹文件參數(shù)描述如下: ? keypad,num-rows:行數(shù) ? keypad,num-columns:列數(shù) ? row-gpios:行對應(yīng)的gpio 口,從第一行開始 ? col-gpios:列對應(yīng)的gpio 口,從第一列開始 ? linux,keymap:每一個(gè)按鍵對應(yīng)的鍵值 ? gpio-activelow:按鍵按下時(shí),行線是否為低電平。用于觸發(fā)中斷,必須配置。 ? debounce-delay-ms:消抖時(shí)間。 ? col-scan-delay-us:掃描延時(shí),如果IO 狀態(tài)轉(zhuǎn)換時(shí)間過長可能會導(dǎo)致按鍵掃描錯(cuò)誤。 ? linux,no-autorepeat:按鍵按下時(shí)是否重復(fù)提交按鍵, 設(shè)1 就是不重復(fù), 設(shè)0 重復(fù)。

確認(rèn)驅(qū)動(dòng)是否被選中在tina 目錄下執(zhí)行運(yùn)行make kernel_menuconfig,確認(rèn)以下配置:

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 內(nèi)核

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中默認(rèn)配置為250Hz。

3.當(dāng)前l(fā)radc key 最大可以支持到13 個(gè)按鍵(0.15V 為一個(gè)檔),通常情況下,建議lradc key最大不要超過8 個(gè)(0.2V 為一檔),否則由于采樣誤差、精度等因素存在,

會很容易出現(xiàn)誤判的情況。

如下圖所示,lradc-key 檢測原理是當(dāng)有按鍵被按下或者抬起時(shí),LRADC 控制器(6bit) 檢測到電壓變化后,經(jīng)過LRADC 內(nèi)部的邏輯控制單元進(jìn)行比較運(yùn)算后,產(chǎn)生相

應(yīng)的中斷給CPU, 同時(shí)電壓的變化值會通過LRADC 內(nèi)部的data register 的值(0~0x3f) 來體現(xiàn)。

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228144650067

?

圖4-1: LRADC 按鍵原理圖

?

下面以R328 為例進(jìn)行說明,驅(qū)動(dòng)文件:

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 驅(qū)動(dòng)中涉及兩個(gè)重要的結(jié)構(gòu)體

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[] 數(shù)組的值跟LRADC_DATA0(0x0C) 的值是對應(yīng)的,表示的具體意義是:key_val(lradc_data0 寄存器的值) 在0~7 范圍內(nèi)時(shí),表示的是操作

key1,依此類推,key_val為8~14 的范圍之內(nèi)時(shí),表示的操作key2。正常來說,按照R16 推薦的硬件設(shè)計(jì),該數(shù)組內(nèi)無需任何更改,當(dāng)個(gè)別情況下,如遇到adc-

key input 上報(bào)的keycode 有異常時(shí),需要依次按下每個(gè)按鍵同時(shí)讀取key_val 的值來修正keypad_mapindex[]。

sunxi_scankeycodes[]: 該數(shù)組的意義為sunxi_scankeycodes[*] 標(biāo)示的是具體的某一個(gè)key,用戶可以修改其中的keycode。

例如,key_val 等于25, 則根據(jù)keypad_mapindex 得到scancode 為4, 再由sunxi_scankeycodes得到鍵值為KEY_MENU。

keypad_mapindex 這個(gè)數(shù)組可以通過sys_config 進(jìn)行配置:

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

這個(gè)配置下轉(zhuǎn)換得到的keypad_mapindex 數(shù)組是:

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 */ };

設(shè)備樹文件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:匹配驅(qū)動(dòng)。

? reg:LRADC 模塊的基地址。

? interrupts:LRADC 中斷源。

? status:是否加載驅(qū)動(dòng)。

? key_cnt:按鍵數(shù)量。

? key0:第一個(gè)按鍵,前面數(shù)字的是電壓范圍,后者是input 系統(tǒng)的鍵值。

? wakeup-source:LRADC 作為喚醒源。

驅(qū)動(dòng)初始化時(shí),會讀取設(shè)備樹中相關(guān)屬性,其中key_cnt 表示配置的按鍵個(gè)數(shù),keyX 配置對應(yīng)的ADC 值以及鍵值。根據(jù)這些屬性,會重新設(shè)置keypad_mapindex

數(shù)組,以及sunxi_scankeycodes 數(shù)組。

keypad_mapindex[] 數(shù)組的值跟ADC 值是對應(yīng)的, 6bitADC, 范圍0~63,表示的具體意義是:key_val 在0~190 范圍內(nèi)時(shí),表示的是操作key0, 以此類推,key_val

為191~390 范圍內(nèi)時(shí),表示的是操作key1。

sunxi_scankeycodes[]: 該數(shù)組的意義為sunxi_scankeycodes[*] 表示的是具體的某一個(gè)key,用戶可以修改設(shè)備樹來改變keycode。

例如,默認(rèn)配置下,key_val 等于300, 則根據(jù)keypad_mapindex 得到scancode 為1, 再由sunxi_scankeycodes 得到鍵值114。

4.1.2 GPADC-Key

GPADC 有多個(gè)通道,例如在R328S3 中有4 個(gè)通道。

通道有三種工作模式:

一、是在指定的通道完成一次轉(zhuǎn)換,轉(zhuǎn)換數(shù)據(jù)更新在對應(yīng)通道的數(shù)據(jù)寄存器中;

二、在所有指定的通道連續(xù)轉(zhuǎn)換直到軟件停止,轉(zhuǎn)換數(shù)據(jù)更新在對應(yīng)通道的數(shù)據(jù)寄存器中;

三、可以在指定的通道進(jìn)行adc 的采樣和轉(zhuǎn)換,并將結(jié)果順序地存入FIFO,F(xiàn)IFO 深度為64 并支持中斷控制。

檢測原理是當(dāng)按鍵被按下或抬起時(shí),指定的通道的控制器檢測到電壓變化,然后經(jīng)過邏輯控制單元進(jìn)行比較運(yùn)算后,產(chǎn)生相應(yīng)的中斷給CPU。R328S3 的GPADC

的框圖如下圖所示。

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228145351260

?

圖4-3: GPADC 按鍵硬件圖

?

以R328S3 為例,驅(qū)動(dòng)文件:

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 一樣涉及兩個(gè)重要的結(jié)構(gòu)體

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[] 數(shù)組的定義與LRADC 的相似,但是要注意的是,GPADC 的數(shù)組大小為128,而LRADC 的是64,所以說GPADC 的精度更高。在linux4.9 內(nèi)核

中已經(jīng)不在數(shù)組里配置了,程序中該數(shù)組只是初始化的。后面會根據(jù)sys_config 或者dts 的配置來生成所要使用的keypad_mapindex[]。

設(shè)備樹文件這里示例的是R328S3 的方案級設(shè)備樹文件:

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

詳細(xì)GPADC 配置如下:

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

? compatible:匹配驅(qū)動(dòng)。 ? reg:GPADC 寄存器基地址。 ? interrupts:GPADC 中斷源。 ? clocks:GPADC 依賴的時(shí)鐘。 ? status:是否加載設(shè)備。

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:表示平臺上支持的最大通道數(shù); ? channel_select:表示通道啟用設(shè)置,通道0:0x01 通道1:0x02 通道2:0x04 通道3:0x08; ? channel_data_select:表示通道數(shù)據(jù)啟用,通道0:0x01 通道1:0x02 通道2:0x04 通道3:0x08; ? channel_compare_select;表示比較功能啟用,通道寫法跟前面一致; ? channel0_compare_lowdata:表示的低于該電壓可以產(chǎn)生中斷,這里是1.7V; ? channel0_compare_higdata:則是高于該電壓可以產(chǎn)生中斷,這里是1.2V; ? key_cnt:表示的是按鍵個(gè)數(shù); ? key_vol:表示第 個(gè)按鍵的電壓值; ? key_val:表示的是第 個(gè)按鍵的鍵值。

在軟件上,當(dāng)key_vol 在0~164 范圍時(shí),表示的是操作key0,以此類推;在硬件上,164 表示的是164mV,通過計(jì)算keyn_vol = keyn_vol + ( key(n+1)_vol -

keyn_vol) / 2來得到范圍。比如說第一個(gè)范圍為key0_vol = 164 + (415 - 164) / 2 = 289.5,即電壓在0~289.5 在,adc 檢測到為操作的key0,以此類推。然后通過

scankeycodes 得到鍵值115。

5.board.dts 文件

方案級設(shè)備樹文件只寫這個(gè)模塊的配置,而詳細(xì)的按鍵配置一般需要寫在板級的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 文件參數(shù)的含義可以參考sys_config.fex 的。

4.2 5.4 內(nèi)核

4.2.1 LRADC-Key

5.4 內(nèi)核的LRADC 驅(qū)動(dòng)功能與4.4/4.9 內(nèi)核的無明顯變化,因此下面只介紹設(shè)備樹文件與配置教程

修改設(shè)備樹文件

這里以D1 為例,設(shè)備樹文件路徑為:

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

dtsi 一般默認(rèn)已經(jīng)寫好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:匹配驅(qū)動(dòng)。

? reg:LRADC 模塊的基地址。

? interrupts:LRADC 中斷源。

? status:是否加載驅(qū)動(dòng)。

? key_cnt:按鍵數(shù)量。

? key0:第一個(gè)按鍵,前面數(shù)字的是電壓范圍,后者是input 系統(tǒng)的鍵值。

? wakeup-source:LRADC 作為喚醒源。

但是D1 方案電路板上實(shí)際LRADC 只連接了一個(gè)按鍵,此時(shí)可以通過修改board.dts 來進(jìn)行配置。若實(shí)際的電路板上LRADC 按鍵是符合以上配置的,則不需要修

改。

說明 board.dts 的配置最終會覆蓋了方案的dtsi 文件配置

board.dts 配置:

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

確認(rèn)驅(qū)動(dòng)是否被選中在tina 目錄下執(zhí)行make kernel_menuconfig,確認(rèn)以下配置:

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 內(nèi)核的GPADC 設(shè)備樹配置主要是時(shí)鐘和中斷方面有所改動(dòng),board.dts 配置可參考4.9 內(nèi)核。

修改設(shè)備樹文件

這里以D1 來作為示例,設(shè)備樹文件為:

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

詳細(xì)配置為:

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:匹配驅(qū)動(dòng)。 ? reg:GPADC 寄存器基地址。 ? interrupts:GPADC 中斷源。 ? clocks:GPADC 依賴的時(shí)鐘。 ? status:是否加載設(shè)備。

確認(rèn)驅(qū)動(dòng)是否被選中 在tina 目錄下執(zhí)行make kernel_menuconfig,確認(rèn)以下配置:

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 識別該按鍵,并在驅(qū)動(dòng)中上報(bào)相關(guān)事件,power-key 驅(qū)動(dòng)源碼在電源驅(qū)動(dòng)源碼

同目錄下。用戶不需要做任何更改,這部分是可以直接使用的。

這里使用R329 來作為例子,其對應(yīng)的設(shè)備節(jié)點(diǎn)為:

Tina_Linux_Key_Quick_Configuration_User_Guide-image-20221228150541561

?

圖5-1: AXP 按鍵節(jié)點(diǎn)圖

?

上報(bào)的鍵值為KEY_POWER 116

5.1 4.9 內(nèi)核

修改設(shè)備樹文件這里以R329-evb1 為例,設(shè)備樹文件為board.dts,路徑:

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

詳細(xì)配置為:

&twi2{ no_suspend = <1>; status = "okay"; pmu0: pmu@34 { compatible = "x-powers,axp2585"; ............省略其他無關(guān)配置 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; */ }; }; };

確認(rèn)驅(qū)動(dòng)是否被選中

tina 目錄下執(zhí)行make kernel_menuconfig,確認(rèn)以下配置:

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 的配置也會不一致,詳細(xì)查看各個(gè)方案使用的PMU 型號。

這里另外,PMU 還提供了AXP GPIO, 根據(jù)不同型號的PMU, GPIO 數(shù)量可能不一樣,但gpio number 均以1024 開始,例如AXP GPIO0 的gpio number 為1024,

AXP GPIO1 的gpio number 為1025。它們均能當(dāng)做普通gpio 使用,因此按照GPIO-Key 章節(jié)的描述去操作它們即可需要注意的是,sys_config 中axp gpio 的命名

與普通gpio 有些區(qū)別,例如AXP gpio0:

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

5.2 5.4 內(nèi)核

說明 本章節(jié)暫不介紹Linux-5.4 內(nèi)核。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1382

    瀏覽量

    40383
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210216
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1216

    瀏覽量

    52305
  • Tina
    +關(guān)注

    關(guān)注

    2

    文章

    45

    瀏覽量

    17010
  • key
    key
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    12850
收藏 人收藏

    評論

    相關(guān)推薦

    OpenRemoved_Tina_Linux系統(tǒng)調(diào)試使用指南

    本文主要服務(wù)于使用Tina軟件平臺的廣大客戶,幫助開發(fā)人員方便快速了解Tina平臺系統(tǒng)調(diào)試工具。
    的頭像 發(fā)表于 03-06 09:51 ?1317次閱讀

    Tina_Linux系統(tǒng)裁剪開發(fā)指南

    Tina_Linux系統(tǒng)裁剪開發(fā)指南1 概述2 Tina系統(tǒng)裁剪簡介2.1 boot0裁剪2.2 uboot裁剪2.3 內(nèi)核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅(qū)動(dòng)2.3.3
    的頭像 發(fā)表于 03-06 09:52 ?1613次閱讀

    PWM使用指南

    日期作者版本說明2020.09.26TaoV0.0撰寫中目錄簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM使用指南簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM
    發(fā)表于 08-09 08:54

    ESP BLE MESH快速配置問題求解

    選擇了快速配置,并輸入期望快速配置計(jì)數(shù)為35.我的EspBleMesh應(yīng)用程序已連接,在快速配置應(yīng)用程序中,我僅找到一個(gè)已連接的節(jié)點(diǎn),并且能夠控制該節(jié)點(diǎn)我通過查看藍(lán)色LED確認(rèn)已連接的節(jié)點(diǎn)未
    發(fā)表于 03-09 07:56

    Tina快速入門用戶指南

    這本用戶快速入門指南概要性的介紹了TINA-TI.一個(gè)強(qiáng)大的電路設(shè)計(jì)及仿真工具。TINA-TI是理想的用于對各種基本的和 高級的電路(具有復(fù)雜的結(jié)構(gòu)、沒有任何節(jié)點(diǎn)或器件數(shù)量的限制)進(jìn)行
    發(fā)表于 03-16 15:58 ?0次下載

    STARWAVE11NMIMO系列網(wǎng)橋快速配置說明-系列

    STARWAVE11NMIMO系列網(wǎng)橋快速配置說明-系列
    發(fā)表于 12-27 16:55 ?0次下載

    基于單片機(jī)的復(fù)雜可編程邏輯器件快速配置方法

    基于單片機(jī)的復(fù)雜可編程邏輯器件快速配置方法
    發(fā)表于 01-18 20:35 ?8次下載

    如何開始一個(gè)項(xiàng)目墊集成流:如何快速配置新筆記與優(yōu)化設(shè)計(jì)庫

    學(xué)習(xí)如何快速配置新筆記與優(yōu)化設(shè)計(jì)庫,所以你可以簡單地拖拽到方案設(shè)計(jì)部分。
    的頭像 發(fā)表于 10-10 07:10 ?2875次閱讀

    TINA-TI電路設(shè)計(jì)仿真工具快速入門指南

    TI仿真軟件TINA-TI的指南,幫助你們快速入門仿真。
    發(fā)表于 04-13 09:25 ?17次下載

    windows7系統(tǒng)快速配置

    windows7系統(tǒng)快速配置
    發(fā)表于 09-05 09:49 ?1次下載

    VG710 1-Wire快速使用指南

    電子發(fā)燒友網(wǎng)站提供《VG710 1-Wire快速使用指南.pdf》資料免費(fèi)下載
    發(fā)表于 10-14 16:03 ?1次下載
    VG710 1-Wire<b class='flag-5'>快速</b><b class='flag-5'>使用指南</b>

    TINA-TI用戶指南

    這本用戶快速入門指南概要性的介紹了TINA-TI1M—一個(gè)強(qiáng)大的電路設(shè)計(jì)及仿真工具。TINA-TI是理想的用于對各種基本的和高級的電路(具有復(fù)雜的結(jié)構(gòu)、沒有任何節(jié)點(diǎn)或器件數(shù)量的限制)進(jìn)
    發(fā)表于 02-14 10:53 ?28次下載

    Tina_Linux_系統(tǒng)軟件開發(fā)指南

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?1933次閱讀
    <b class='flag-5'>Tina_Linux</b>_系統(tǒng)軟件開發(fā)<b class='flag-5'>指南</b>

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.7w次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b><b class='flag-5'>配置</b>開發(fā)<b class='flag-5'>指南</b>

    行車記錄儀專用的配置工具:termconfigv1.52快速配置工具

    一款行車記錄儀專用的配置工具,可以快速產(chǎn)生指令termconfigv1.52快速配置工具
    發(fā)表于 11-15 09:30 ?3次下載