1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们知道:rk3288 android7.1主板按键的使用主要有GPIO接口的和ADC接口的,而我的项目这里,需要添加两个GPIO类型的按键,现在记录一下,其实主要是dts的配置而已,驱动不需要改动:
1、首先看下原理图,对应找到具体使用的gpio:从原理图上可知,power按键的GPIO使用的是GPIO0_A1, recovery按键的GPIO使用的是GPIO8_A1 2、dts的配置方面 164 gpio_keys { //参考同目录下的 rk3036-echo.dts 165 compatible = "gpio-keys"; 166 #address-cells = <1>; 167 #size-cells = <0>; 168 169 pinctrl-names = "default"; 170 pinctrl-0 = <&pwr_key &rcvr_key>; 171 172 power_key: power-key { //power按键 173 label = "GPIO Key Power"; 174 gpios = <&gpio0 1 GPIO_ACTIVE_LOW>; // [gpio2 25] to GPIO0_A1 175 linux,code = 176 debounce-interval = <100>; 177 wakeup-source; 178 }; 179 recovery_key: recovery_key { //recovery按键 180 label = "recovery"; 181 gpios = <&gpio8 1 GPIO_ACTIVE_LOW>; //GPIO8_A1 182 linux,code = 183 debounce-interval = <100>; 184 wakeup-source; 185 }; 186 }; 771 &pinctrl { 833 keys { 834 pwr_key: pwr-key { 835 rockchip,pins = <0 1 RK_FUNC_GPIO &pcfg_pull_none>; // pcfg_pull_default 836 }; 837 rcvr_key: rcvr-key { 838 rockchip,pins = <8 1 RK_FUNC_GPIO &pcfg_pull_none>; 839 }; 840 }; 871 }; 对应的gpio按键驱动在以下文件: ./drivers/input/keyboard/gpio_keys.c 上报键值的接口函数 339 static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) 340 { 341 const struct gpio_keys_button *button = bdata->button; 342 struct input_dev *input = bdata->input; 343 unsigned int type = button->type ?: EV_KEY; 344 int state = gpio_get_value_cansleep(button->gpio); //get gpio state 345 346 printk("czd0710: enter [%s(), %d], gpio_no ==> %dn", __func__, __LINE__, button->gpio); 347 printk("czd0710: enter [%s(), %d], get gpio state ==> %dn", __func__, __LINE__, state); 348 if (state < 0) { 349 dev_err(input->dev.parent, "failed to get gpio staten"); 350 return; 351 } 352 353 state = (state ? 1 : 0) ^ button->active_low; //这里得出判断按键的状态,最终得到的state为1就是按下,为0就是抬起 354 printk("czd0710: enter [%s(), %d], state ==> %dn", __func__, __LINE__, state); 355 if (type == EV_ABS) { //事件类型为EV_ABS ==> 0x03 356 if (state) { 357 input_event(input, type, button->code, button->value); 358 printk("czd0710: enter [%s(), %d], state ==> %dn", __func__, __LINE__, state); 359 } 360 } else { 361 input_event(input, type, button->code, !!state); //上报键值和状态 362 printk("czd0710: enter [%s(), %d], state ==> %dn", __func__, __LINE__, state); 363 printk("czd0710: enter [%s(), %d], !!state ==> %dn", __func__, __LINE__, !!state); 364 } 365 input_sync(input); //sync一下,表示此次上报完成 366 } 更新kernel之后验证: 在串口输入getevent,然后去按recovery按键就可以得到input上报给上层的键值0x163: rk3288:/ # getevent add device 1: /dev/input/event4 name: "rk29-keypad" add device 2: /dev/input/event2 name: "gpio_keys" add device 3: /dev/input/event3 name: "gsensor" add device 4: /dev/input/event0 name: "ff680020.pwm" add device 5: /dev/input/event1 name: "gtinput" /dev/input/event2: 0001 0163 00000001 //0x163对应上面dts配置的recovery_key linux,code;后面的1表示按下按键 /dev/input/event2: 0000 0000 00000000 /dev/input/event2: 0001 0163 00000000 //0x163对应上面dts配置的recovery_key linux,code;后面的0表示释放按键 /dev/input/event2: 0000 0000 00000000 /dev/input/event2: 0001 0163 00000001 /dev/input/event2: 0000 0000 00000000 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
1162 浏览 0 评论
1330 浏览 1 评论
1015 浏览 1 评论
2345 浏览 1 评论
3671 浏览 1 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 00:02 , Processed in 0.545044 second(s), Total 41, Slave 35 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号