0.前言
? 100ASK_V853-PRO開(kāi)發(fā)板上共有5個(gè)功能按鍵,本章節(jié)跟大家討論如何使能這五個(gè)按鍵。
1.V853功能按鍵原理
? 100ASK_V853-PRO開(kāi)發(fā)板上提供的5個(gè)按鍵是通過(guò)GPADC高精度數(shù)模轉(zhuǎn)換模塊模擬出5個(gè)功能按鍵。GPADC 是 12bit
分辨率,8 位采集精度的模數(shù)轉(zhuǎn)換模塊,具體通道數(shù)可以查看對(duì)應(yīng)的 spec 說(shuō)明?檔,模擬輸?范 圍 0?1.8V,最?采樣率
1MHz,并且?持?jǐn)?shù)據(jù)?較,?校驗(yàn)功能,同時(shí)?作于可配置?下?作模式:
- Single mode:在指定的通道完成?次轉(zhuǎn)換并將數(shù)據(jù)放在對(duì)應(yīng)數(shù)據(jù)寄存器中;
- Single-cycle mode:在指定的通道完成?個(gè)周期轉(zhuǎn)換并將數(shù)據(jù)放在響應(yīng)數(shù)據(jù)寄存器中;
- Continuous mode:在指定的通道持續(xù)轉(zhuǎn)換并將數(shù)據(jù)放在響應(yīng)數(shù)據(jù)寄存器中;
-
Burst mode:邊采樣邊轉(zhuǎn)換并將數(shù)據(jù)放? 32 字節(jié)的 FIFO,?持中斷控制。
? 部分 GPADC 接?也開(kāi)始慢慢?于 KEY 模塊按鍵的讀取,?般包括 VOL+、VOL-、HOME、MENU、ENTER 等等, GPADC0 ?于 KEY 的電路如上圖。 AVCC-AP 為 1.8V 的供電,不同的按鍵按下,GPADC0 ?的電壓不同,CPU 通過(guò)對(duì)這個(gè)電壓的采樣來(lái)確定具體是那 ?個(gè)按鍵按下。如上圖,VOL+、VOL-、MENU、ENTER、HOME/UBOOT 對(duì)應(yīng)的電壓分別為 0.21V、0.41V、 0.59V、0.75V、0.88V。具體可以查看《100ASK-V853_Pro系統(tǒng)開(kāi)發(fā)手冊(cè).pdf》中第五篇驅(qū)動(dòng)開(kāi)發(fā)的第?三章 Linux GPADC 開(kāi)發(fā)指南。
2.GPADC驅(qū)動(dòng)
GPADC驅(qū)動(dòng)存放的位置為
tina-v853-open/kernel/linux-4.9/drivers/input/sensor/sunxi_gpadc.c
tina-v853-open/kernel/linux-4.9/drivers/input/sensor/sunxi_gpadc.h
3.GPADC內(nèi)核配置
在Tina的根目錄下輸入make kernel_menuconfig
book@100ask:~/workspaces/tina-v853-open$ make kernel_menuconfig
進(jìn)入如下目錄中,輸入Y使能SUNXI GPADC驅(qū)動(dòng)。
→ Device Drivers
→ Input device support
→ Sensors
<*> SUNXI GPADC
配置完成后如下圖所示。
保存并退出內(nèi)核配置界面。
4.GPADC設(shè)備樹(shù)配置
內(nèi)核設(shè)備樹(shù)存放位置:
tina-v853-open/device/config/chips/v853/configs/100ask/board.dts
進(jìn)入該目錄后輸入vi board.dts
book@100ask:~/workspaces/tina-v853-open$ cd device/config/chips/v853/configs/100ask/
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ ls
BoardConfig.mk board.dts buildroot env.cfg linux-4.9 sys_config.fex uboot-board.dts
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ vi board.dts
找到&gpadc節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)保存有采樣相關(guān)的配置,鍵值,電壓數(shù)據(jù)等。
&gpadc {
channel_num = <1>; // 使用1通道
channel_select = <0x01>; // 選擇 0x01 通道
channel_data_select = <0>; // 啟用數(shù)據(jù)通道
channel_compare_select = <0x01>; // 啟用通道比較功能
channel_cld_select = <0x01>; // 啟用數(shù)據(jù)小于比較功能
channel_chd_select = <0>; // 啟用數(shù)據(jù)大于比較功能
channel0_compare_lowdata = <1700000>; // 小于這個(gè)值觸發(fā)中斷
channel0_compare_higdata = <1200000>; // 大于這個(gè)值觸發(fā)中斷
channel1_compare_lowdata = <460000>; // 小于這個(gè)值觸發(fā)中斷
channel1_compare_higdata = <1200000>; // 大于這個(gè)值觸發(fā)中斷
key_cnt = <5>; // 按鍵數(shù)量
key0_vol = <210>; // 按鍵電壓,單位mv
key0_val = <115>; // 按下按鍵的鍵值
key1_vol = <410>; // 按鍵電壓,單位mv
key1_val = <114>; // 按下按鍵的鍵值
key2_vol = <590>; // 按鍵電壓,單位mv
key2_val = <139>; // 按下按鍵的鍵值
key3_vol = <750>; // 按鍵電壓,單位mv
key3_val = <28>; // 按下按鍵的鍵值
key4_vol = <880>; // 按鍵電壓,單位mv
key4_val = <102>; // 按下按鍵的鍵值
status = "okay"; // 啟用GPADC
};
我們還能通過(guò)board.dts文件中知道還有一部分不經(jīng)常需要修改的配置保存在sun8iw21p1.dtsi文件中,進(jìn)入該目錄,并打開(kāi)該文件。
book@100ask:~/workspaces/tina-v853-open$ cd kernel/linux-4.9/arch/arm/boot/dts/
book@100ask:~/workspaces/tina-v853-open/kernel/linux-4.9/arch/arm/boot/dts$ vi sun8iw21p1.dtsi
查看gpadc節(jié)點(diǎn),可以發(fā)現(xiàn)這里的配置保存有中斷和時(shí)鐘等信息,但默認(rèn)不使能。注意:這里可以不修改,因?yàn)檫@里的所設(shè)置的status配置會(huì)被board.dts中的status覆蓋,只要在board.dts設(shè)置為使能,最終生成打包進(jìn)鏡像的設(shè)備樹(shù)都為使能狀態(tài)。
gpadc:gpadc@2009000 {
compatible = "allwinner,sunxi-gpadc"; // 用于驅(qū)動(dòng)和設(shè)備的綁定
reg = <0x0 0x02009000 0x0 0x400>; // 設(shè)備使用的寄存器地址
interrupts = ; // 設(shè)備使用的中斷
clocks = <&clk_gpadc>; // 設(shè)備使用的時(shí)鐘
status = "disabled"; // 配置默認(rèn)不啟用GPADC
};
5.增加getevent測(cè)試包
在Tina根目錄下執(zhí)行make menuconfig
book@100ask:~/workspaces/tina-v853-open$ make menuconfig
進(jìn)入U(xiǎn)tilities目錄下,輸入Y選中g(shù)etevent
> Utilities
<*> getevent.................................... getevent for Android Toolbox
選中完成后如下圖所示。
保存并退出Tina配置界面。
6.編譯、打包和燒寫(xiě)
在Tina的根目錄下,輸入make -j32
book@100ask:~/workspaces/tina-v853-open$ make -j32
...
book@100ask:~/workspaces/tina-v853-open$ pack
...
? 生成鏡像后,將tina-v853-open/out/v853/100ask/openwrt/目錄下的v853_linux_100ask_uart0.img鏡像拷貝到Windows電腦主機(jī)中,使用全志PhoenixSuit燒寫(xiě)工具燒寫(xiě)到開(kāi)發(fā)板上。
? 插上12V的電源線,和兩條Type-C,把開(kāi)關(guān)撥向電源接口方向上電,燒寫(xiě)新鏡像后等待啟動(dòng)系統(tǒng),在命令行中輸入getevent
可以進(jìn)入測(cè)試程序,通過(guò)輸出的打印信息我們知道,我們的gpadc驅(qū)動(dòng)上報(bào)的信息使用的
是/dev/input/event1
,此時(shí)按下按鍵,會(huì)讀取按鍵的鍵值。
root@TinaLinux:~# getevent
add device 1: /dev/input/event2
name: "ft6336"
add device 2: /dev/input/event1
name: "sunxi-gpadc0"
add device 3: /dev/input/event0
name: "axp2101-pek"
poll 4, returned 1
/dev/input/event1: 0001 0073 00000001
poll 4, returned 1
/dev/input/event1: 0000 0000 00000000
poll 4, returned 1
/dev/input/event1: 0001 0073 00000000
poll 4, returned 1
/dev/input/event1: 0000 0000 00000000
按下Crtl+C結(jié)束測(cè)試。
7.編寫(xiě)一個(gè)測(cè)試應(yīng)用程序
通過(guò)上一章節(jié)的測(cè)試,我們知道gpadc使用的/dev/input/event1
上報(bào)按鍵數(shù)據(jù),則我們編寫(xiě)的應(yīng)用程序中獲取數(shù)據(jù)的節(jié)點(diǎn)應(yīng)該為/dev/input/event1,應(yīng)用程序如下所示。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEV_PATH "/dev/input/event1" //Modified to gpadc drive reporting node
static int gpadc_fd = 0;
unsigned int test_gpadc(const char * event_file)
{
int code = 0, i;
struct input_event data;
gpadc_fd = open(DEV_PATH, O_RDONLY);
if(gpadc_fd <= 0)
{
printf("open %s error!n", DEV_PATH);
return -1;
}
for(i = 0; i < 10; i++) //read 10 times
{
read(gpadc_fd, &data, sizeof(data));
if(data.value == 1)
{
printf("key %d pressedn", data.code);
}
else if(data.value == 0)
{
printf("key %d releaseedn", data.code);
}
}
close(gpadc_fd);
return 0;
}
int main(int argc,const char *argv[])
{
int rang_low = 0, rang_high = 0;
return test_gpadc(DEV_PATH);
8.編譯應(yīng)用程序并進(jìn)行測(cè)試
新建一個(gè)gpadc目錄,存放應(yīng)用程序和可執(zhí)行程序。
book@100ask:~/workspaces$ mkdir gpadc_test
book@100ask:~/workspaces$ cd gpadc_test/
book@100ask:~/workspaces/gpadc_test$ vi gpadc_test.c
將上一小節(jié)編寫(xiě)的應(yīng)用程序復(fù)制到gpadc_test.c中保存。
編寫(xiě)完成后,我們需要提供編譯環(huán)境給gpadc_test應(yīng)用程序,輸入
book@100ask:~/workspaces/gpadc_test$ export STAGING_DIR=~/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchainsunxi-musl-gcc-830/toolchain/arm-openwrt-linux-muslgnueabi
使用交叉編譯工具鏈編譯二進(jìn)制文件,注意:需要Tina SDK包目錄需要更換為自己的目錄。
book@100ask:~/workspaces/gpadc_test$ ~/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-gcc -o gpadc_test gpadc_test.c
編譯完成后會(huì)再當(dāng)前目錄下生成一個(gè)gpadc_test可執(zhí)行程序,將其拷貝到開(kāi)發(fā)板上運(yùn)行即可。下面使用TF卡的方式將文件拷貝到開(kāi)發(fā)板上,此時(shí)假設(shè)你已經(jīng)將文件拷貝到TF卡中,插入開(kāi)發(fā)板后,在命令行中輸入以下命令掛在SD卡到/mnt/
目錄下,并將gpadc_test應(yīng)用程序拷貝到、root目錄下。
root@TinaLinux:/# mount /dev/mmcblk1p1 /mnt/
[ 26.744697] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
root@TinaLinux:/# cd /mnt/
root@TinaLinux:/mnt# ls
System Volume Information gpadc_test
root@TinaLinux:/mnt# cp gpadc_test /root/
進(jìn)入/root目錄下執(zhí)行測(cè)試程序,該程序讀取10次值會(huì)自動(dòng)結(jié)束才測(cè)試
root@TinaLinux:/mnt# cd /root/
root@TinaLinux:~# ./gpadc_test
key 115 pressed
key 0 releaseed
key 115 releaseed
key 0 releaseed
key 114 pressed
key 0 releaseed
key 114 releaseed
key 0 releaseed
key 139 pressed
key 0 releaseed
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19111瀏覽量
304845 -
Linux
+關(guān)注
關(guān)注
87文章
11296瀏覽量
209352 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5035瀏覽量
97382 -
按鍵輸入
+關(guān)注
關(guān)注
0文章
6瀏覽量
6156 -
type-c
+關(guān)注
關(guān)注
549文章
1812瀏覽量
268757
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論