OpenWRT中的按键和灯的GPIO控制实现

基于BarrierBreaker版本,基于AR9331 AP121 Demo单板 来进行描述

1.灯

A.在mach-ap121.c中,定义了灯所对应的GPIO定义:

#define AP121_GPIO_LED_WLAN 0

#define AP121_GPIO_LED_USB 1

并定义了灯的GPIO结构对象:

static struct gpio_led ap121_leds_gpio[] __initdata = {

{

.name = "ap121:green:usb",

.gpio = AP121_GPIO_LED_USB,

.active_low = 0,

},

{

.name = "ap121:green:wlan",

.gpio = AP121_GPIO_LED_WLAN,

.active_low = 0,

},

}

在初始化函数:ap121_setup 中,利用ath79_register_leds_gpio(-1, ARRAY_SIZE(ap121_leds_gpio), ap121_leds_gpio);实现了LED device的注册。此函数调用后,会创建platform类型的设备,并和leds-gpio驱动(leds-gpio.c)实现了绑定。这样,就会在/sys/devices/platform/leds-gpio/目录中,产生对应的led灯的控制目录:

drwxr-xr-x    2 root     root             0 Jan  1  1970 ap121:green:usb

drwxr-xr-x    2 root     root             0 Jan  1  1970 ap121:green:wlan

B.进入上述任意一个目录,如:ap121:green:wlan,会有如下文件:

-rw-r--r--    1 root     root          4096 Jan 15 06:19 brightness

lrwxrwxrwx    1 root     root             0 Jan 15 06:04 device -> ../../../leds-gpio

-r--r--r--    1 root     root          4096 Jan 15 06:04 max_brightness

lrwxrwxrwx    1 root     root             0 Jan 15 06:04 subsystem -> ../../../../../class/leds

-rw-r--r--    1 root     root          4096 Jan 15 06:04 trigger

-rw-r--r--    1 root     root          4096 Jan 15 06:04 uevent

则通过 echo 1 > brightness,就可以控制灯亮; echo 0 > brightness,就可以控制灯灭

2.按键

A.在mach-ap121.c中,定义了按键对应的GPIO以及数据结构对象:

#define AP121_GPIO_BTN_JUMPSTART 11

#define AP121_GPIO_BTN_RESET 12

以及

static struct gpio_keys_button ap121_gpio_keys[] __initdata = {

{

.desc = "jumpstart button",

.type = EV_KEY,

.code = KEY_WPS_BUTTON, //定义在gpio-button-hotplug.c

.debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,

.gpio = AP121_GPIO_BTN_JUMPSTART,

.active_low = 1,

},

{

.desc = "reset button",

.type = EV_KEY,

.code = KEY_RESTART,    //定义在gpio-button-hotplug.c

.debounce_interval = AP121_KEYS_DEBOUNCE_INTERVAL,

.gpio = AP121_GPIO_BTN_RESET,

.active_low = 1,

},

}

在初始化函数:ap121_setup 中,利用

ath79_register_gpio_keys_polled(-1, AP121_KEYS_POLL_INTERVAL,ARRAY_SIZE(ap121_gpio_keys),ap121_gpio_keys);

实现了KEY device的注册。此函数调用后,会创建platform类型的设备,并和gpio-keys-polled驱动(gpio-button-hotplug.c
)实现了绑定。

B.

当按键时,则触发button_hotplug_event函数(gpio-button-hotplug.c):调用button_hotplug_create_event产生uevent事件,调用button_hotplug_fill_even填充事件(JSON格式),并最终调用button_hotplug_work发出uevent广播

上述广播,被procd进程中的hotplug_handler (procd/plug/hotplug.c) 收到,并根据etc/hotplug.json中预先定义的JSON内容匹配条件,定位到对应的执行函数,具体为:

[ "if",

[ "and",

[ "has", "BUTTON" ],

[ "eq", "SUBSYSTEM", "button" ],

],

[ "exec", "/etc/rc.button/%BUTTON%" ]

],

[ "if",

[ "eq", "SUBSYSTEM",

[ "net", "input", "usb", "ieee1394", "block", "atm", "zaptel", "tty", "button" ]

],

[ "exec", "/sbin/hotplug-call", "%SUBSYSTEM%" ]

],

时间: 2024-08-06 09:42:23

OpenWRT中的按键和灯的GPIO控制实现的相关文章

OpenWRT中添加新设备支持

这里还是向OpenWRT中添加对小度路由的支持向 target/linux/ramips/image/makefile中写入新设备 image/build/profile/mt7620a_CLZ=$(call buildFirmware/Default8M/$(1),$(1),mt7620a_clz,MT7620a_CLZ) $(call image/Build/Profile/MT7620a_CLZ,$(1)) base-files中的一些可用配置: base-files/etc/diag.s

OpenWrt中开启usb存储和samba服务

在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wiki.openwrt.org/doc/howto/usb.essentials # 每次重启后, 软件包都要重新update opkg update 安装 kmod-usb-uhci 或者 kmod-usb-ohci, 如果前者不能安装, 系统会有提示 opkg install kmod-usb-uh

Android系统中自定义按键的短按、双击、长按事件

在项目中碰到这样的问题: 由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成: 1.单击事件:就是普通key的单击: 2.双击事件:500ms内同一按键单击两次: 3.长按事件:同一按键长按超过1000ms(系统中长按事件为500ms): 4.组合按键:两个以上按键同时按住: 其中的keyevent可以来自Activity.View子类的dispatchKeyEvent方法,也可以是我

gpio控制知识补充

RPi.GPIO模块函数说明: RPi.GPIO.setmode(naming_system) 设置将GPIO针的命名方式.naming_system可用的取值有 RPi.GPIO.BCM 和 RPi.GPIO.BOARD,分别代表boardcom命名系统和树莓派板子上的命名系统.而因为使用BCM 的时候(据说)不同的版本BVM针脚定义不一样,所以同一套程序在多个树莓派系统上使用的时候建议用BOARD. RPi.GPIO.setup(channel, state) 将标号为channel的针设置

python环境下实现OrangePi Zero寄存器访问及GPIO控制

最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armbian系统,使用python写了一个读写寄存器的简单模块,通过这个模块,即可实现对GPIO的控制. 作者以前使用过STM32的MCU,这类MCU,如果要实现对GPIO的控制,只需要根据datasheet查找相应GPIO寄存器并进行配置,即可实现IO控制,例如,要将内存地址为0x12345678的寄存

树莓派GPIO控制

陈拓[email protected] 2018.06.09/2018.06.10 0.  概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边基数,右边偶数:1-40 BCM 编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号. wiringPi 编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程.如图 WiringPi一栏. 操作GPIO时一定先要清楚使用那一套编号. 1.  准

(12)树莓派B+ GPIO控制四驱车

吐槽一下:本人还是个小白,CSDN文章分类不知道选哪个 如果你手上的材料是五线四相步进电机驱动板ULN2003+五线四相步进电机28BYJ-48-5V,那么应该算是非常幸运,因为这两样是配套的,一个驱动板可以接一个步进电机,实现正转.反转.加速.减速的功能(个人猜测).很多人因为在购置树莓派外围设备时,没有考虑清楚,随随便便就买了电机和驱动板,导致无法正常驱动电机,譬如我买的是带4个直流电机的四驱车,其中的电机只有两条线接正极和负极,以及ULN2003五线四相步进电机驱动板,这两样是不配套的,不

树莓派 GPIO 控制

Raspberr Pi 官方提供了GPIO的usage,具体位置 https://www.raspberrypi.org/documentation/usage/gpio/ 这里整理了一下使用c语言做开发的实际例子. 常用开源工程简介 树莓派内核中已经编译自带了 gpio 的驱动,我们常通过一些第三方写好的库函数来完成具体的操作,比较常见的操作库函数有: python GPIO 开发语言--python 简单介绍--树莓派官方资料中推荐且容易上手.python GPIO 是一个小型的 pytho

使用Devexpress中的CharControl控件,需要控制AxisY轴的显示范围,需要使用该控件的BoundDataChanged事件

一.控制ChartControl的Y轴范围 使用Devexpress中的CharControl控件,需要控制AxisY轴的显示范围,需要使用该控件的BoundDataChanged事件,具体代码如下: 该代码实现的效果如下: 参考文献: [1]AxisY Range Auto https://www.devexpress.com/Support/Center/Question/Details/Q266328 二.设置GridControl表格中的超级链接: 1.首先在表格的设计器中添加一个Hyp