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

2023-11-16

原文地址:点击打开链接

基于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  中,利用

th79_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 ) 实现了绑定。

当按键时,则触发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%" ]
	],








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 解决在 Win7 旗舰版虚拟机中安装 VMware Tools 失败问题

    报错提示如下 安装程序无法自动安装Virtual Machine Communication Interface VMCI 驱动程序 必须手动安装此驱动程序 解决方法 安装以下两个补丁 1 kb4474419 2 kb4490628 按顺序
  • android 调用短信,Android实现接收短信和发送短信功能

    在学接收短信和发送短信之前 先简单介绍一下 SMS 短消息服务 SMS Short Message Service 短信息服务 是一种存储和转发服务 也就是说 短信息并不是直接从发信人发送到接收人 而是始终通过 SMS 中心进行转发 如果接
  • linux运行rs程序,【linux-基础】安装scp,rz,rs命令

    在测试中需要在两台虚拟机之间传递文件 首先想到的是scp命令 结果提示 bash scp command not found 想当然用yum install scp命令安装 结果提示 No package scp available 后来发
  • WebDriver概述

    什么是WebDriver Webdriver Selenium2 0 是一种用于Web应用程序的自动测试工具 它提供了一套友好的API Webdriver完全就是一套类库 不依赖于任何测试框架 除了必要的浏览器驱动 WebDriver AP
  • 用Python画奥运五环

    最近接触到了Python的一个有趣的库turtle 写了一个画奥运五环的程序 代码如下 用turtle模块绘画奥运五环 import turtle 设置公共属性 turtle width 10 第一个环 turtle color black
  • 华为OD机试 - 最大社交距离(Java)

    题目描述 疫情期间需要大家保证一定的社交距离 公司组织开交流会议 座位一排共 N 个座位 编号分别为 0 N 1 要求员工一个接着一个进入会议室 并且可以在任何时候离开会议室 满足 每当一个员工进入时 需要坐到最大社交距离 最大化自己和其他
  • IOS开发笔记之常用的第三方库(太多了。)

    图像 1 图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用 可显示来自手机的图片或者是网络图片 可自动从网络下载图片并进行缓存 可对图片进行缩放等操作 下载 https github com mwa
  • js-- 1-100循环

  • Linux系统中运行.sh文件的几种方法

    在Linux系统中执行 sh文件的几种方法 1 cd到 sh文件所在的目录 然后执行 xxx sh 前提 该 sh文件要有可执行的权限 chmod u x xxx sh 2 在任何路径下 输入 sh文件的绝对路径进行执行 前提 该 sh文件
  • 统计代码耗时

    二 常规方法 2 1 时间差统计 这种方式是最简单的方法 记录下开始时间 再记录下结束时间 计算时间差即可 public class TimeDiffTest public static void main String args thro
  • 安鸾之中间件系列

    声明 文中所涉及的技术 思路和工具仅供以安全为目的的学习交流使用 任何人不得将其用于非法用途以及盈利等目的 否则后果自行承担 本文转发于涂寐 s Blogs https 0xtlu github io 0x00 tomcat8弱口令 0o0
  • upx3.94手动脱壳

    工具 吾爱破解论坛Ollydbg ImportREConstructor upx3 94下载地址 https github com upx upx releases download v3 94 upx394w zip 环境 XP 还是XP
  • 换盘符cd的用法

    如果是在本盘内切换文件夹 直接使用cd 后面跟地址即可 如果是跨区切换地址 cd 后面就需要跟 d 斜杠d d就代表着跨分区切换地址 cd d d C ProgramData Anaconda3 Scripts gt cd d d d gt
  • linux之查看端口占用

    第一章 linux之帮助命令 第二章 linux命令行快捷键 第三章 linux之防火墙 第四章 linux之服务开机自启 第五章 linux之关机与重启 第六章 linux之环境变量 第七章 linux之目录操作命令 第八章 linux之
  • esp8266与stm32、手机通讯(原子云)——hal库(有代码)

    本文所讲 正点原子的wifi模块esp8266与正点原子开发板战舰V3 stm32f103zet6 及手机app通讯 esp8266分为三种工作模式 STA 8266连接到网络比如wifi 手机热点等 AP 8266作为热点 由手机连接到8
  • 规则引擎Drools使用 第二篇Drools规则引擎介绍

    Drools规则引擎介绍 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎 可以将复杂且多变的业务规则从硬编码中解放出来 以规则脚本的形式存放在文件或特定的存储介质中 例如存放在数据库中 使得业务规则的变更不需要修
  • Idea自带的http client工具使用攻略

    平时都是用postman来调接口 有时候也会用到swagger 用swagger还可以 直接在浏览器上开个页面即可 但是postman就不行了 需要单独的运行 个人感觉postman还是比较占内存的 最近和一个其他组同事联调 发现他们使用的
  • python跳出for循环

    一 问题描述 在二维数组的遍历中 我们经常使用双层for循环 在某些时候 我们并不需要遍历整个二维数组 当条件满足时就应该终止for循环 但是 直接在内层循环中break并不会让外层循环也终止 二 解决方案 使用for else 语法解决
  • STM32的烧录和Hex/bin烧录文件解析、烧录文件是被如何存储到MCU中的?

    什么是hex文件 以 hex为后缀的文件我们称之为HEX文件 hex是intel规定的标准 hex的全称是Intel HEX 此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据 是由一行行符合Intel HEX文件格式的文本所构
  • OpenWRT中的按键和灯的GPIO控制实现

    原文地址 点击打开链接 基于BarrierBreaker版本 基于AR9331 AP121 Demo单板 来进行描述 1 灯 A 在mach ap121 c中 定义了灯所对应的GPIO定义 define AP121 GPIO LED WLA