FreeRTOS平臺上使用的按鍵為ADC-KEY,采用的ADC模塊為GPADC。
按鍵功能驅(qū)動的實(shí)現(xiàn)是通過ADC分壓,使每個按鍵檢測的電壓值不同,從而實(shí)現(xiàn)區(qū)分不同的按鍵。按下或者彈起中斷之后,通過中斷觸發(fā),主動檢測當(dāng)前電壓識別出對應(yīng)的按鍵。最后再通過input子系統(tǒng)將獲取按鍵的鍵值并上報給應(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]; // 按鍵的電壓值
};
不同平臺的配置可能不同,以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ū)動的配置都是以hardcode的方式寫入驅(qū)動代碼中,也就是說按鍵的數(shù)量,不同按鍵對應(yīng)的電壓值,不同按鍵對應(yīng)的KeyCode等等配置如果要修改的話,需要對源碼進(jìn)行修改。
如上述按鍵結(jié)構(gòu)體的定義,以下兩配置按照默認(rèn)配置即可。
- measure:GPADC最大能夠識別的電壓值,需要根據(jù)UserMaual來設(shè)置。默認(rèn)為2.5V。
- name:注冊的按鍵驅(qū)動名稱,會注冊到input子系統(tǒng)中。
可以自定義的配置為:key_num,key_vol,scankeycodes。
- key_num: 按照實(shí)際硬件設(shè)計來設(shè)置。
- key_vol: 按照硬件,實(shí)際每個按鍵分壓的情況來設(shè)置。
- scankeycodes:每個按鍵對應(yīng)的KeyCode,方便應(yīng)用通過input獲得按下的按鍵時,能夠識別是哪個按鍵按下了。
key_vol的配置方法,可以參考下圖的GPADC-KEY的硬件設(shè)置。
在圖中,VCC輸入的電壓為3.3V,通過分壓關(guān)系,第一個按鍵的電壓為0.21V,因此key_vol可以設(shè)置為210,以此類推。
驅(qū)動初始化方法
默認(rèn)系統(tǒng)啟動時,不會加載GPADC驅(qū)動以及按鍵驅(qū)動。
如果需要加載GPADC-Key驅(qū)動,需要調(diào)用以下函數(shù):
int sunxi_gpadc_key_init(void);
調(diào)用 sunxi_gpadc_key_init()
該函數(shù)即可完成GPADC驅(qū)動以及按鍵驅(qū)動的加載了,即可開始使用按鍵驅(qū)動。
應(yīng)用調(diào)用方法
接下來繼續(xù)介紹一下,應(yīng)用中該如何獲取按鍵按下的事件。
在FreeRTOS系統(tǒng)中,也移植了 Linux 的 input 子系統(tǒng)。GPADC-Key 中也是調(diào)用了 input 的接口,進(jìn)行注冊 input 設(shè)置,上報事件等動作。
在調(diào)用 sunxi_gpadc_key_init()
時,通過 input_set_capability()
去設(shè)置了事件的屬性;通過 sunxi_input_register_device()
注冊了 input 設(shè)備;在按鍵按下觸發(fā)中斷時,也是通過 input_report_key()
和 input_sync()
上報 input
事件。
因此,在應(yīng)用層想要獲取input事件,可以直接通過input接口去獲取,使用示例可如下例程:
int input_func(void)
{
int fd = -1;
struct sunxi_input_event event;
sunxi_gpadc_key_init(); // 驅(qū)動初始化
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)注
98文章
6391瀏覽量
543768 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61915 -
ADC按鍵設(shè)計
+關(guān)注
關(guān)注
0文章
3瀏覽量
1661 -
R128
+關(guān)注
關(guān)注
0文章
41瀏覽量
93
發(fā)布評論請先 登錄
相關(guān)推薦
評論