瑞芯微Rockchip开发者社区
登录
直播中
tulin
12年用户
1228经验值
私信
关注
[问答]
怎样去使用rk3288 android7.1的主板按键呢
开启该帖子的消息推送
RK3288
按键
GPIO
怎样去使用rk3288 android7.1的主板按键呢?
GPIO按键驱动的接口函数是怎样的?
回帖
(1)
h1654155275.5697
2022-3-4 10:56:46
我们知道: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 =
; // 207
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 =
; // 0x163 ==> 355
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
我们知道: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 =
; // 207
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 =
; // 0x163 ==> 355
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
举报
更多回帖
rotate(-90deg);
回复
相关问答
RK3288
按键
GPIO
怎样
去
解决
RK3288
Android7.1
系统虚拟
按键
方向不对的问题
呢
2022-03-03
1185
怎样
去
修改
Android7.1
RK3288
的屏幕物理分辨率
呢
2022-03-03
2539
怎样
在
RK3288
Android7.1
5.1上增加AP6256 WI-FI Bluetooth
呢
2022-03-03
2655
RK3288
Android7.1
uboot部分的MIPI显示流程是
怎样
的?
2022-03-03
935
RK3288
android7.1
异形屏修改补丁的设计该
怎样
去
实现
呢
2022-03-03
661
怎样
去
修改
RK3288
[
android
7.1
]强制横屏的模式
呢
2022-03-03
1416
如何对
Android7.1
RK3288
Thermal进行控制
呢
2022-03-04
1256
怎样
去
修改
RK3288
Android7.1
华为移动远域格
呢
2022-03-03
962
如何将
RK3288
Android7.1
默认系统语言设置为英文?
2022-03-04
854
RK3288
Android7.1
软件开发指南分享,绝对实用
2022-03-04
2485
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分