请教openwrt gpio控制系统gpio控制问题

查看: 281|回复: 4
想用路由器做一个JTAG调试器,不知道如何释放GPIO
想用路由器做一个JTAG调试器,不知道如何释放GPIO
看了H大的一个帖子:另类方法制作 JTAG 调试器,AR9341 JTAG 救砖方法 .cn/forum/thread--1.html
也想试一下。但是帖子里说需要用开发板。手里没有开发板,但是路由器却很多。
教程里有一句:“至少拥有5个可以软件控制的 GPIO (用来连接 TCK TDI TDO TMS TRST)”
想用路由器的LED灯改成GPIO用,但是看DATASHEET里面讲的,应该是需要将模式重新注册更改。
这个应该如何操作?
WRTnode固件可以直接用GPIO,但是只有MT7620的版本,手里的路由是AR9331的,用不了
如果用openwrt的话,应该如何修改?
以上总结一句话:如何把路由器的LED灯释放,重新注册成GPIO用,将路由器改做JTAG调试器。
纯新手,还请大大们指点。谢谢!
自己改程序编译固件解决!
麻烦能再详细点么?新手不太懂。&
自己改程序编译固件解决!
麻烦能再详细点么?新手不太懂。
mark........
就是搭建编译环境,将openwrt项目源码下载修改,再编译成自己需要的的固件,刷进路由器里面。
编译教程论坛很多,修改要自己找找资料了!估计一般可用的就是替换那几个指示灯口了!
Powered by利用RG100AA的GPIO接口控制led灯及单片机上电
前段时间,用RG100A-AA路由刷OPENWRT系统,加单片机做了个网络摄像头。
RG100A-AA引出TTL接口,输出命令到单片机(STC89C52RC),单片机控制舵机带动摄像头实现转动。
利用mjpeg_stream实现网页视频监控。
问题是路由启动的时候,TTL接口输出大量路由启动数据,干扰单片机初始化,导致单片机初始化失败,不能正常启动,控制不了舵机。
原来的解决方案是利用NE555做了个延时通电电路,这样断电重启后,单片机延迟一断时间上电,避开路由启动时大量输出TTL数据的时间。但是这样也不能完美解决问题,断电后正常,但路由重启的话,NE555延迟电路不启作用。
后来发现RG100A-AA可以利用GPIO接口控制LED灯的开关,于是决定利用GPIO接口控制单片机延时上电,从而解决路由启动时干扰单片机初始化的问题。
1、首先安装gpioctl_1.0-1_brcm63xx.ipk
GPIO端口 可对照以下
gpioctl_1.0-1_brcm63xx.ipk
gpioctl dirin  | dirout | get   | set & |
clear & gpio
&&&&&&&&&&&&
输入状态 |输出状态| 取得状态|置高电平| 置底电平
#PIN34 是 WIFI按键
#PIN36 是复位按键
#PIN37 是 WPS 按键
#34 36 37 设定为输入状态
gpioctl dirin 34
gpioctl dirin 36
gpioctl dirin 37
#取得按键状态
gpioctl get 34
gpioctl get 36
gpioctl get 37
#0 4 8 22 24 设定为输出状态
gpioctl dirout 0
gpioctl dirout 4
gpioctl dirout 8
gpioctl dirout 22
gpioctl dirout 24
gpioctl clear 0 USB 亮
gpioctl set 0 USB 灭
gpioctl clear 4 POWER 灭
gpioctl set 4 POWER 亮
gpioctl clear 8 NET 灭
gpioctl set 8 NET 亮
gpioctl clear 22 DSL 亮
gpioctl set 22 DSL 灭
gpioctl clear 24 WPS 亮
gpioctl set 24 WPS 灭
2、选择WPS指示灯的GPIO控制端口
gpioctl clear 24 WPS 亮
gpioctl set 24 WPS 灭
从路由 /etc/init.d/选择一个启动脚本(这里选择设置串口速率的videoset文件),在后面加入
gpioctl clear 24
3、将光耦控制模块的输入端(即光耦的1、2脚并到WPS灯上,注意串电阻限流,这里用的100欧的)
从USB取+5V到光耦4脚,取GND到8050发射极。
单片机输入正接USB+5V(同光耦4脚),输入负极接三极管集电极。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用户空间通过sysfs接口操作gpio
通过sysfs接口访问gpio,需要了解/sys/class/gpio目录下的三种文件:&
&&&&&&&&&&&&--export/unexport文件:用于通知系统需要导出/取消导出的GPIO编号
&&&&&&&&&&&&--gpioN文件:指代具体的gpio引脚,在该文件夹下还有direction和value文件,分别用于配置对应gpio的输入输出方向和输入输出电平
&&&&&&&&&&&&--gpio_chipN文件:指代gpio控制器
&实例说明:
向/sys/class/gpio/export写入gpio编号,比如12号引脚,在shell中可以通过以下命令实现,
echo&12&&&/sys/class/gpio/export
&命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出。
2.定义输入输入方向,可以通过下面命令定义为输出
echo&out&&&/sys/class/gpio/gpio12/direction
&direction接受的参数:in,&out,&high,&low。high/low同时设置方向为输出,
&&&&并将value设置为相应的1/0。
3.&value文件是端口的数值,为1或0.
echo&1&&/sys/class/gpio/gpio12/value
为了实现快速测试MT7620n板上gpio口与板上LED灯的接口对应关系,在openwrt上创建一个测试脚本gpiotest:
---------------------------------------------脚本----------------------------------------------------
echo&$1&&&/sys/class/gpio/export
echo&out&&&/sys/class/gpio/gpio$1/direction
echo&1&&&/sys/class/gpio/gpio$1/value
echo&0&&&/sys/class/gpio/gpio$1/value
----------------------------------------------脚本---------------------------------------------------
脚本中的用while循环控制输出占空比为50%的PWM波,修改程序中两处sleep后面的参数可以调整PWM波的频率和占空比。
保存好脚本后,用chmod&&744&&gpiotest指令修改脚本权限。
在脚本所在路径执行./gpiotest&&num,即可使编号为num的gpio口输出PWM波。脚本中的$1表示传递给程序的第一个参数,在这条指令中对应num。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。0x01.About
第一次尝试开发路由器,发现并不是想象中那么难,和普通嵌入式开发一样,也是一块ARM板刷上Linux系统。
OpenWrt有很多好用的软件,附带流量监测。
OpenWrt主要开发语言为Python、Lua、Shell,还可以做深入研究写ipk软件包。
写了几个脚本,主要实现了openwrt下面GPIO控制、系统信息获取、wifi扫描器、定时发送邮件系统报警等功能,下面会介绍。
代码已经在Github开源:
0x02.About OpenWrt
刷OpenWrt先要去下载你想要的版本,包含aa型和bb型。
然后用Linux烧入命令烧入系统。
早MAC下面,先现将U盘插入电脑格式化,然后运行命令查看U盘编号:
diskUtil list
注意查看U盘编号,选择你的U盘,解除挂载:
diskUtil unmountDisk /dev/disk2
然后烧入系统:
dd if=/path/to/openwrt.img of=/dev/disk2 bs=2m
等待几分钟后烧入成功。
关于痛点:
第一次是在树莓派上安装OpenWrt,装好后,用有线把连进上级路由器的Lan口
然后,上级路由的包开始乱了,上级路由把OpenWrt当成路由器,OpenWrt把路由器当成上级路由器,然后就GG了。
0x03.About WRTnode
WRTnode是OpenWrt系统一个硬件解决方案,预先安装了OpenWrt相关软件包,并且内置两块无线网卡。
关于WRTnode,官方wiki已经介绍的很详细了:
解析来的代码基本上是在WRTnode环境上开发的,主要包含了:
luci(WRTnode自带,非WRTnode用opkg安装即可)
python(WRTnode自带,非WRTnode用opkg安装即可)
luasocket(
目前只能想起这3个,如果报错,该装什么再装好了。
0x04.WRTnode控制GPIO
GPIO控制可以很好地实现软件硬件之间的交互。
GPIO的控制也不难,wiki讲得很清晰了,就是文件输入输出
这里我写了一个Lua版的GPIO控制模块,文件保存为gpio.lua:
#!/usr/bin/lua
Copyright 2015 http://homeway.me
@author homeway
@version 15.04.29
@link http://homeway.me
@function OpenWRT gpio module
local M = {}
M.path = "/sys/class/gpio/gpio"
M.router = "/sys/class/gpio"
M.check = function(where)
print("check path =& "..where)
local f=io.open(where, "r")
if f~=nil then io.close(f) return true else return false end
-- set mode && check type
M.mode = function(id, mtype)
where = M.path..M.id
-- if id not use
if false==M.check(M.path..id..'/direction') then
--M.writeFile(M.router.."/unexport",id)
M.writeFile(M.router.."/export", id)
-- if type different
if mtype ~= M.readFile(M.path..id..'/direction') then
print("type =&"..mtype.." direction=&"..M.readFile(M.path..id..'/direction').." different")
M.writeFile(M.path..id..'/direction', mtype)
-- file write
M.writeFile = function(where, what)
print("write path =& "..where.." data =&"..what)
local fp=io.open(where, 'w')
fp:write(what)
fp:close()
-- file read
M.readFile = function(where)
print("read path =& "..where)
local fp=io.open(where, 'r')
if fp~=nil then
data = fp:read("*all")
fp:close()
return data
return nil
M.set = function(id)
M.read = function()
res = M.readFile(M.path..M.id..'/value')
return res
M.write = function(value)
res = M.writeFile(M.path..M.id..'/value', value)
M.close = function()
print("sleep io =& "..M.id)
os.execute("sleep " .. tonumber(M.id))
API很简单,先设置设置模式,GPIO.mode(id, "out/in")两种模式之一
如果为'out'即可调用GPIO.write(value)函数,写入当然id端口,如果为'in'模式,只能调用GPIO.read()读取数值。
这里数值只能是0或1,非0即为1.
调用方式如下,这个存在一个可忽略的问题,一旦调用mode,数值将被置为默认数值,即0:
#!/usr/bin/lua
x=require("gpio")
print("Please input io id =&")
id = io.read("*num")
x.mode(id, "out")-- 设置io的模式为输入还是输出 [in/out]
function readGPIO(id)
value = x.read()
print("read data from =& `"..id.."` =&"..value)
function writeGPIO(id, data)
x.write(data)
print("write data to =& `"..id.."` =&"..data)
count=count+1
print("Please input value =&")
data = io.read("*num")
writeGPIO(id, data)
readGPIO(id)
until count&3
0x05.WRTnode获取系统信息
其实获取系统信息不属于WRTnode范围,因为这部分主要是调用Linux Shell获取系统信息,做个反馈。
这里我也写了个python脚本,主要检查系统信息,这个脚本在树莓派那里面也有:
这里我做了部分修改,添加系统ip、连接的ssid等信息:
#!/usr/bin/python
@author homeway
@version 15.04.29
@link http://homeway.me
@function python get OpenWRT system info
# Return CPU temperature as a character string
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
# Return RAM information (unit=kb) in a list
# Index 0: total RAM
# Index 1: used RAM
# Index 2: free RAM
def getRAMinfo():
p = os.popen('free')
line = p.readline()
return(line.split()[1:4])
# Return % of CPU used by user as a character string
def getCPUuse():
return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))
# Return information about disk space as a list (unit included)
# Index 0: total disk space
# Index 1: used disk space
# Index 2: remaining disk space
# Index 3: percentage of disk used
def getDiskSpace():
p = os.popen("df -h /")
line = p.readline()
return(line.split()[1:5])
def getSystem():
p = os.popen("uname -amnrspv")
line = p.readline()
return(line)
def getExtranetIp():
p = os.popen('wget "/ips1388.asp" -q -O - | sed -nr \'s/.*\[(([0-9]+\.){3}[0-9]+)\].*/\1/p\'')
line = p.readline()
print line
return(line)
def getIntranetIp():
p = os.popen('ifconfig apcli0 | grep inet\ addr')
line = p.readline()
return(line)
def getSsid():
p = os.popen('uci get wireless.@wifi-iface[0].ApCliSsid')
line = p.readline()
return(line)
# CPU informatiom
CPU_temp = getCPUtemperature()
CPU_usage = getCPUuse()
# RAM information
# Output is in kb, here I convert it in Mb for readability
RAM_stats = getRAMinfo()
RAM_total = round(int(RAM_stats[0]) / 1000,1)
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)
# Disk information
DISK_stats = getDiskSpace()
DISK_total = DISK_stats[0]
DISK_used = DISK_stats[1]
DISK_perc = DISK_stats[3]
# system info
SYSTEM_info = getSystem()
# NET infomation
NET_extranet_ip = getExtranetIp()
NET_internet_ip = getIntranetIp().lstrip('')
NET_connect_ssid = getSsid()
if __name__ == '__main__':
print('-------------------------------------------')
print("System info ="+str(SYSTEM_info))
print('-------------------------------------------')
print('RAM Total = '+str(RAM_total)+' MB')
print('RAM Used = '+str(RAM_used)+' MB')
print('RAM Free = '+str(RAM_free)+' MB')
print('-------------------------------------------')
print('DISK Total Space = '+str(DISK_total)+'B')
print('DISK Used Space = '+str(DISK_used)+'B')
print('DISK Used Percentage = '+str(DISK_perc))
print('-------------------------------------------')
print('NET Extranet Ip ='+str(NET_extranet_ip))
print('NET Connect Ssid ='+str(NET_connect_ssid))
print('NET Internet Wan Ip ='+str(NET_internet_ip))
直接调用python sysinfo.py:
0x06.WRTnode发送邮件
好了,系统信息有了,GPIO信息有了,接下来就试试发送邮件了。
发送邮件3中法案都可以,Lua,Python,Shell,找了找资料,Python写了,但是缺少了一个包,Lua缺少Luasocket模块,Shell要安装模块。
最后,懵了,全都要依赖,尼玛,看了看,好像Lua安装个Luasocket最简单,一个包轻松:
安装也不难,接下来就写写吧。
Lua发送邮件源码模块,设置文件名为email.lua:
#!/usr/bin/lua
Copyright 2015 http://homeway.me
@author homeway
@version 15.04.29
@link http://homeway.me
@function lua email module
local smtp = require("socket.smtp")
local M ={}
M.user = {["from"]="", ["to"]="", ["password"]=""}
M.mail = {["subject"]="", ["body"]=""}
M.sys = {["server"]=""}
M.set = function(data)
M.user = data.user
M.mail = data.mail
M.sys = data.sys
M.send = function()
M.user["to"]
headers = {
from = M.user["from"],
to = M.user["to"], --收件人
cc = "", --抄送
subject = M.mail["subject"] --主题
body = M.mail["body"]
r, e = smtp.send{
from = M.user["from"],
rcpt = rcpt,
source = smtp.message(mesgt),
server = M.sys["server"],
port = M.sys["port"],
user = M.user["from"],
password = M.user["password"],
if not r then
print("send ok!")
下面是调用方式:
#!/usr/bin/lua
local mail = require("email")
local data = {}
data.user = {["from"]="", ["to"]="", ["password"]="password"}
data.mail = {["subject"]="测试邮件模块", ["body"]="这是主体内容..."}
data.sys = {["server"]="", ["port"]=587}
mail.set(data)
mail.send()
测试下,是可以接收到邮件的,注意GFW,还是别用非法gmail好了,别等半天收不到。
0x07.重要的东西放后面
嗯!看到这里,估计菊花也有点疼了,再看最后一点看完就擦洗擦洗去吧。
最后就是,设置定时器,让路由器定时发送系统信息给指定邮箱。
嗯...定时器,Linux的一个模块crontab命令,看看功能吧 crontab --help
关于定时器语法,看看这里吧
这里,我只做简单地,每隔10分钟发送一次系统信息给我邮箱。
具体怎么做,去下载这个脚本吧:
我的目录是这样的,用户是root:
~|--script
|--schedule
|--sys.log
|--crontab.log
先开一个定时器,定时跑Lua,Lua调用python读取系统信息,生成日志文件,Lua读取日志文件,发送邮箱。
how to use:
step1: configure you email information in this script
step2: mkdir /root/log && mkdir /root/script
step3: mv /path/to/crontab.lua /root/script/send
step4: chmod +x /root/script/send
step5: echo 10,20,30,40,50
* * * * /root/script/send & /root/script/schedule
step6: crontab /root/script/schedule
东西有点多,都是散乱的部件,这篇主要介绍细节信息,接下来会做大得模块。
如果打通路由器,各种嵌入式开发的联网问题就都解决了,所以路由器系统还是很重要的。
本文出自 ,转载请注明出处:
你可能感兴趣的文章
4 收藏,6.2k
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知403 Forbidden
403 Forbidden

我要回帖

更多关于 openwrt gpio驱动 的文章

 

随机推荐