openwrt通过shell控制LED灯
1、概述2、GPIO 目录说明3、进入到GPIO文件夹目录4、使用5、补充,通过文件读写的方式打包成ipk控制LED灯光5.1、在package目录下创建ledctl文件夹并在ledctl下创建Makefile和src文件夹5.2、编写Makefile5.3、在src目录下创建ledctl.c和Makefile5.4、编写ledctl.c与makefile5.5、回到openwrt的根目录下编译生成ipk包5.6、找到对应的ipk包丢到开发板上安装5.7、运行1、概述
通过shell对openwrt的LED灯光的控制。
进入到自己rootfs的目录的 /sys/class/gpio目录下
2、GPIO 目录说明
3、进入到GPIO文件夹目录
查看自己板子对应的接口,查看gpio接口对应的LED灯。
我这里以GPIO30为例,这是4G的LED_RED灯
cd gpio30/
4、使用
在gpio文件夹下如果有LED对应的GPIO*文件夹,就直接进入文件夹,然后对value进行操作,来控制灯光。例如:
echo > value 1echo > value 0
如果没有对应的LED灯的gpio文件夹:
第一步 在 Linux 中 使 GPIO 有效:
echo 30> /sys/class/gpio/export
然后你需要决定让 GPIO 作为输入(input)或者输出(output), 本例我们将其作为一个开关使用,所以我们需要输出(ouput)
echo out > /sys/class/gpio/gpio45/direction
最后一行,使用 1 或 0 来表示 GPIO 打开(on)或关闭(off):
echo 1 > /sys/class/gpio/gpio45/value
5、补充,通过文件读写的方式打包成ipk控制LED灯光
回到openwrt的源码的根目录下
5.1、在package目录下创建ledctl文件夹并在ledctl下创建Makefile和src文件夹
touch Makefilemkdir src
5.2、编写Makefile
nclude $(TOPDIR)/rules.mkPKG_NAME:=ledctlPKG_VERSION=1PKG_RELEASE:=1.0PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)include $(INCLUDE_DIR)/package.mkdefine Package/ledctlSECTION:=utilsCATEGORY:= ledctlDEPENDS=+libpthreadTITLE:= ledctlendefdefine Build/Preparemkdir -p $(PKG_BUILD_DIR)cp -rf ./src/* $(PKG_BUILD_DIR)/endefdefine Build/Compile$(MAKE) -C $(PKG_BUILD_DIR) \$(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS)"endefdefine Package/$(PKG_NAME)/install$(INSTALL_DIR) $(1)/usr/bin$(CP) $(PKG_BUILD_DIR)/ledctl $(1)/usr/binendef$(eval $(call BuildPackage,ledctl))
makefile注释在/md/?articleId=109803571这篇文章里,我详细注释了。
5.3、在src目录下创建ledctl.c和Makefile
touch Makefiletouch ledctl.c
5.4、编写ledctl.c与makefile
ledctl.c 我以我的LED的gpio口为例,大家的可能不一样,需要注意一下
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>int main(void){FILE *p=NULL; /*4G LED_GREEN*/FILE *q=NULL; /*4G LED_RED */int i=0;for(;i<100;i++){/*open GPIO29 LED_GREEN*/p=fopen("/sys/class/gpio/gpio29/value","w");fprintf(p,"%s","0");sleep(1);fclose(p);/*open GPIO29 LED_GREEN*/p=fopen("/sys/class/gpio/gpio29/value","w");fprintf(p,"%s","1");sleep(0.5);fclose(p);/*open GPIO30 LED_RED*/q=fopen("/sys/class/gpio/gpio30/value","w");fprintf(q,"%s","0");sleep(1);fclose(q);/*close GPIO30 LED_RED*/q=fopen("/sys/class/gpio/gpio30/value","w");fprintf(q,"%s","1");sleep(0.5);fclose(q);printf("%d ",i);}return 0;}
Makefile
ledctl:ledctl.o$(CC) $(LDFLAGS) ledctl.o -o ledctlledctl.o:ledctl.c$(CC) $(CFLAGS) -c lean:rm *.o ledctl
5.5、回到openwrt的根目录下编译生成ipk包
make ./package/ledctl/compile V=s
5.6、找到对应的ipk包丢到开发板上安装
find ./bin/ -name ledctl*.ipk
丢到开发板上
scp ./bin/ipq/packages/base/ledctl_1-1.0_ipq.ipk root@192.168.1.1:/root
在开发板上安装
opkg install ledctl_1-1.0_ipq.ipk
5.7、运行
ledctl
此时开发板上的灯光开始闪烁。