FreeRTOS平臺(tái)上使用的按鍵為ADC-KEY,采用的ADC模塊為GPADC。
按鍵功能驅(qū)動(dòng)的實(shí)現(xiàn)是通過(guò)ADC分壓,使每個(gè)按鍵檢測(cè)的電壓值不同,從而實(shí)現(xiàn)區(qū)分不同的按鍵。按下或者彈起中斷之后,通過(guò)中斷觸發(fā),主動(dòng)檢測(cè)當(dāng)前電壓識(shí)別出對(duì)應(yīng)的按鍵。最后再通過(guò)input子系統(tǒng)將獲取按鍵的鍵值并上報(bào)給應(yīng)用層。
GPADC-Key配置方法
按鍵結(jié)構(gòu)體定義key_config的成員:
struct sunxikbd_config{
unsigned int measure; // 電壓閾值
char *name; // 功能名
unsigned int key_num; // 按鍵數(shù)量
unsigned int scankeycodes[KEY_MAX_CNT]; // 按鍵的鍵值
unsigned int key_vol[KEY_MAX_CNT]; // 按鍵的電壓值
};
不同平臺(tái)的配置可能不同,以r128為例,下面是r128的成員config:
static struct sunxikbd_config key_config = {
.measure = 2500,
.name = "gpadc-key",
.key_num = 5,
.key_vol = {164,415,646,900,1157},
.scankeycodes = {115,114,139,164,116}
};
當(dāng)前按鍵驅(qū)動(dòng)的配置都是以hardcode的方式寫入驅(qū)動(dòng)代碼中,也就是說(shuō)按鍵的數(shù)量,不同按鍵對(duì)應(yīng)的電壓值,不同按鍵對(duì)應(yīng)的KeyCode等等配置如果要修改的話,需要對(duì)源碼進(jìn)行修改。
如上述按鍵結(jié)構(gòu)體的定義,以下兩配置按照默認(rèn)配置即可。
- measure:GPADC最大能夠識(shí)別的電壓值,需要根據(jù)UserMaual來(lái)設(shè)置。默認(rèn)為2.5V。
- name:注冊(cè)的按鍵驅(qū)動(dòng)名稱,會(huì)注冊(cè)到input子系統(tǒng)中。
可以自定義的配置為:key_num,key_vol,scankeycodes。
- key_num: 按照實(shí)際硬件設(shè)計(jì)來(lái)設(shè)置。
- key_vol: 按照硬件,實(shí)際每個(gè)按鍵分壓的情況來(lái)設(shè)置。
- scankeycodes:每個(gè)按鍵對(duì)應(yīng)的KeyCode,方便應(yīng)用通過(guò)input獲得按下的按鍵時(shí),能夠識(shí)別是哪個(gè)按鍵按下了。
key_vol的配置方法,可以參考下圖的GPADC-KEY的硬件設(shè)置。

在圖中,VCC輸入的電壓為3.3V,通過(guò)分壓關(guān)系,第一個(gè)按鍵的電壓為0.21V,因此key_vol可以設(shè)置為210,以此類推。
驅(qū)動(dòng)初始化方法
默認(rèn)系統(tǒng)啟動(dòng)時(shí),不會(huì)加載GPADC驅(qū)動(dòng)以及按鍵驅(qū)動(dòng)。
如果需要加載GPADC-Key驅(qū)動(dòng),需要調(diào)用以下函數(shù):
int sunxi_gpadc_key_init(void);
調(diào)用 sunxi_gpadc_key_init() 該函數(shù)即可完成GPADC驅(qū)動(dòng)以及按鍵驅(qū)動(dòng)的加載了,即可開始使用按鍵驅(qū)動(dòng)。
應(yīng)用調(diào)用方法
接下來(lái)繼續(xù)介紹一下,應(yīng)用中該如何獲取按鍵按下的事件。
在FreeRTOS系統(tǒng)中,也移植了 Linux 的 input 子系統(tǒng)。GPADC-Key 中也是調(diào)用了 input 的接口,進(jìn)行注冊(cè) input 設(shè)置,上報(bào)事件等動(dòng)作。
在調(diào)用 sunxi_gpadc_key_init() 時(shí),通過(guò) input_set_capability() 去設(shè)置了事件的屬性;通過(guò) sunxi_input_register_device() 注冊(cè)了 input 設(shè)備;在按鍵按下觸發(fā)中斷時(shí),也是通過(guò) input_report_key() 和 input_sync() 上報(bào) input 事件。
因此,在應(yīng)用層想要獲取input事件,可以直接通過(guò)input接口去獲取,使用示例可如下例程:
int input_func(void)
{
int fd = -1;
struct sunxi_input_event event;
sunxi_gpadc_key_init(); // 驅(qū)動(dòng)初始化
fd = sunxi_input_open(DEVICE_NAME);
if (fd < 0)
return -1;
while (1) {
sunxi_input_readb(fd, &event, sizeof(struct sunxi_input_event));
if (event.type != EV_KEY)
continue;
if (event.value == 0) {
printf("key upn");
continue;
}
printf("key press: KeyCode:%dn", event.code);
}
return 0;
}
-
adc
+關(guān)注
關(guān)注
100文章
7511瀏覽量
555927 -
FreeRTOS
+關(guān)注
關(guān)注
14文章
499瀏覽量
66933 -
ADC按鍵設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
3瀏覽量
1771 -
R128
+關(guān)注
關(guān)注
0文章
41瀏覽量
413
發(fā)布評(píng)論請(qǐng)先 登錄
【RA-Eco-RA2E1-V1.0開發(fā)板試用】ADC內(nèi)部電壓采集。
ADC128S102QML - SP:輻射加固8通道12位A/D轉(zhuǎn)換器的技術(shù)剖析
【RA-Eco-RA2E1-V1.0開發(fā)板試用】+ OLED顯示ADC采樣數(shù)據(jù)
ADC128S102:8通道、500 - 1Msps、12位A/D轉(zhuǎn)換器的深度解析
ADC128S052:高性能12位A/D轉(zhuǎn)換器的深度解析
深入解析ADC128S022:8通道12位A/D轉(zhuǎn)換器的卓越之選
?ADC128S102QML-SP 數(shù)據(jù)手冊(cè)全文總結(jié)
ADC128D818 12 位 8 通道系統(tǒng)監(jiān)控 ADC 產(chǎn)品手冊(cè)總結(jié)
ADC128S052/ADC128S052-Q1 8 通道高速低功耗 ADC 產(chǎn)品總結(jié)
ADC122S051/ADC122S051Q 12 位雙通道低功耗 ADC 總結(jié)
ADC128S102-SEP 技術(shù)文檔總結(jié)
FD60-36S24B3R2 FD60-36S24B3R2
PFD50-36S24B3R2 PFD50-36S24B3R2
FD50-36S24B3(R)2 FD50-36S24B3(R)2
MDC91128S數(shù)據(jù)手冊(cè)#128 通道、20 位電流輸入 ADC
DshanMCU-R128s2 ADC按鍵配置方法
評(píng)論