RK3288_Android7.1的gpio按键驱动浅析

rk3288 gpio按键驱动分析

dts配置GPIO

 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>;
 171
 172                 power_key: power-key {
 173                         label = "GPIO Key Power";
 174                         gpios = <&gpio0 1 GPIO_ACTIVE_LOW>; // [gpio2 25] to GPIO0_A1
 175                         linux,code = <KEY_POWER>; //207
 176                         debounce-interval = <100>;
 177                         wakeup-source;
 178                 };
 179         };
 
 
 832 &pinctrl {
 833         keys {
 834                 pwr_key: pwr-key {
 835                         rockchip,pins = <0 1 RK_FUNC_GPIO &pcfg_pull_none>; // pcfg_pull_default
 836                 };
 837         };
 838	};

驱动文件:./drivers/input/keyboard/gpio_keys.c
以下是GPIO按键驱动的简单代码调用流程跟踪:

gpio_keys_probe
	-->pdata = gpio_keys_get_devtree_pdata(dev); //获取dts的资源配置
		-->
	-->input = devm_input_allocate_device(dev); //分配输入子设备
	-->error = gpio_keys_setup_key(pdev, input, bdata, button); //设置GPIO按键属性,在这个接口判断GPIO是否合法有效能用,申请GPIO,申请gpio中断号
		-->gpio_is_valid(button->gpio)
		-->gpio_set_debounce
		-->irq = gpio_to_irq(button->gpio); //设置GPIO中断号
		-->INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); //初始化工作队列gpio_keys_gpio_work_func
		-->isr = gpio_keys_gpio_isr; //注册中断子函数,按键按下,触发中断,然后调用中断子函数
			-->mod_delayed_work//调用工作队列
				-->gpio_keys_gpio_work_func //调用gpio按键工作队列
					-->gpio_keys_gpio_report_event(bdata); //调用gpio按键上报处理函数
						-->state = gpio_get_value_cansleep(button->gpio); //获取gpio的状态
						-->state = (state ? 1 : 0) ^ button->active_low; //这里得出判断按键的状态,为1就是按下,为0就是抬起
						-->input_event(input, type, button->code, !!state); //上报GPIO按键键值和状态
						-->input_sync(input); //sync一下,表示此次上报完成
				
		-->irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; //设置上升沿或者下降沿触发中断
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Android 7.1 的源码中,您可以通过修改 fstab 文件或 init.rc 文件来添加一个可被电脑识别的分区。具体来说,您可以按照以下步骤进行操作: 1. 确定您要挂载的分区的设备节点名称,例如 `/dev/sdb1`。 2. 打开设备的 fstab 文件,例如 `/vendor/etc/fstab.rk3288`,在其中添加一行类似于以下内容的条目: `/dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro 0 0` 这个条目的意思是将 `/dev/block/sdb1` 这个设备节点挂载到 `/mnt/usb_storage` 这个挂载点,使用 vfat 文件系统,具有一系列选项,例如读写权限、字符集等。 3. 如果您想要在设备启动时自动挂载该分区,可以修改设备的 init.rc 文件。具体来说,您可以在文件中添加以下内容: ``` mount /dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro ``` 这个命令的意思是在设备启动时将 `/dev/block/sdb1` 挂载到 `/mnt/usb_storage`,使用 vfat 文件系统,具有一系列选项。 请注意,上述操作可能需要 root 权限才能执行,同时修改系统文件可能会导致系统不稳定或无法正常启动,请谨慎操作,并备份好您的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零意@

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值