【物联网】OpenWrt编译和修改基础--预科
该文章讲解一下在AR9331上使用Openwrt的编译修改方法,前面先介绍一下硬件平台特点,为后面的代码修改做铺垫,然后描述一下Openwrt的编译烧写流程,最后再重点讲述编译配置、代码修改细节。
1. 硬件平台
手头上ar9331模块64MB DDR2,8MB spi flash,配合底板的硬件特点如下:
Port4 |
WAN |
Port0 |
LAN1 |
Port1 |
LAN2 |
Port2 |
LAN3 |
Port3 |
LAN4 |
LED0_GPIO0 |
WLAN_LED(Active High) |
LED1_GPIO1 |
USB_LED(Active High) |
LED2_GPIO13 |
LAN1_LED(Active High) |
LED3_GPIO14 |
LAN2_LED(Active High) |
LED4_GPIO15 |
LAN3_LED(Active High) |
LED5_GPIO16 |
LAN4_LED(Active High) |
LED6_GPIO17 |
WAN_LED(Active Low) |
LED7_GPIO27 |
SYSTEM_LED(Active Low) |
LED8_GPIO26 |
NC |
JS_GPIO11 |
WPS |
ResetSwitch_GPIO12 |
Reset |
GPIO23 |
User Key |
GPIO18/I2S_CK |
控制引脚 |
GPIO22/I2S_MICIN |
控制引脚 |
2. 编译烧写流程
2.1. 依赖库
使用Ubuntu进行编译开发,需要安装的依赖库如下:
apt-get install build-essential asciidoc binutils bzip2 gawk gettext \git libncurses5-dev libz-dev patch unzip zlib1g-dev等等。
还需要安装svn,apt-get install subversion。
2.2. 下载源码
svn co svn://svn.openwrt.org/openwrt/trunk/
2.3. 编译
以下为编译步骤,在make menuconfig中做的配置将在后面具体介绍,在make V=s前需要做一些移植修改也将在后面具体介绍。
cd trunk/
svn up
cp feeds.conf.default feeds.conf
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
Make V=s
最终在trunk/bin/ar71xx/目录下得到最终的烧写目标代码(在此以mr3220-v2路由为基础),openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin。
2.4. 烧写
官方的Linux SDK开发包的烧录代码与Openwrt的烧录代码的分区规划不同,如果原来开发板上烧录的是官方的linux SDK代码,则需要先将刷新适用于Openwrt的Uboot,然后再烧写上一步中生成的openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin。
对开发板烧写程序可以通过多种方式实现:在Uboot中烧写Uboot与固件、编程器烧写、Web配置界面中程序升级。
2.4.1. 烧写Uboot
使用网线连接开发板与PC,然后连接上串口监控(115200-8-n-1,这里使用SecureCRT),开发板上电,在SecureCRT中看到Uboot打印信息,按任意键打断启动进入Uboot命令行,使用printenv命令查看启动参数,记录下serverip,例如为192.168.1.2,并将PC更改为该IP。PC端开启Tftp Sever软件,在uboot命令行中输入命令如下:
#tftpboot 0x80060000 u-boot-ar9331.bin
#erase 0x9f000000 +0x200000
#cp.b 0x80060000 0x9f000000 0x20000
重启开发板,看到uboot正常打印。
2.4.2. 烧写固件
同上面烧写uboot一样,进入uboot命令行模式,输入如下命令:
#tftpboot 0x80060000 openwrt-ar71xx-generic-tl-mr3220-v2-squashfs-factory.bin
#erase 0x9f020000 +0x7c0000
#cp.b 0x80060000 0x9f02000 0x7c0000
2.4.3. 编程器拯救板砖
上面两种方式前提是目标板不是板砖,万一变砖或者开发板上未烧写过程序,则需要使用编程器来烧写目标代码,这就是对普通的SPI flash烧录程序方法,只要知道芯片型号,有固件就行了。
2.4.4. Web升级程序
对于能正常启动的AR9331开发板可以通过web升级程序,登录到web配置界面后选择System->Backup/Flash Firmware,然后选择要升级的固件。
注意这种方式只能升级统一型号的路由固件,如现在正在运行的是wr720的固件,你编译了一个wr740的固件,是无法通过web升级的,只能通过上面在Uboot中烧写固件的方式进行升级。
3. menuconfig配置
这里将介绍上面编译步骤中的make menuconfig中的具体配置。在这里配置时候使用MR3220-V2路由器为蓝本。
开始配置,首先选择CPU与路由型号:
Target System—–Atheros AR71xx/AR7240/AR913x/AR934x
Target Profile—-TP-LINK MR3220
Kernel Modules配置:
Kernel modules —> Native Language Support —> <*> kmod-nls-utf8
Luci配置如下:
LuCI—>Collections—– <*> luci
LuCI—>Applications —> <*>luci-app-qos
LuCI—>Themes —> <*>luci-theme-openwrt
LuCI—>Translations—- <*> luci-i18n-Chinese
LuCI—>Translations—- <*> luci-i18n-English
Network配置:
Network—>Routing and Redirection—- <*> ip
在这里我们只做了必须的配置,更加丰富的功能可以再额外配置添加,如常见的USB storage、3G、Network Share(Samba)等等。
4. 代码修改
在这里我们做的移植中有些可以通过直接修改开发板中的配置文件来实现,而不需要重新编译固件,但是我们要的是一个编出来就是默认配置的固件,所以以下移植都将是在编译前实现的。
4.1. 编译权限
个人不喜欢在非root权限下编译,为此做一下简单修改使得能够在root权限下进行编译,修改/trunk/include/prereq-build.mk将原来的require non-root修改为root
define Require/non-root
#[ "$$(shell whoami)" != "root" ]
[ "$$(shell whoami)" != "noroot" ]
endef
4.2. flash配置
手头上的AR9331核心板上使用的是8MB的dataflash,而标配的MR3220-V2路由是4MB,为此我们需要修改:
trunk/tools/firmware-utils/src/mktplinkfw中MR3220-V2配置为8MB
.id = "TL-MR3220v2",
.hw_id = HWID_TL_MR3220_V2,
.hw_rev = 1,
.layout_id = "4Mlzma", //改为 8Mlzma
trunk/target/linux/ar71xx/image/Makefile中对应MR3220-V2处flash大小为8MB:
MR3220-V2,MR3220-V2,MR3220-V2,ttyATH0,115200,0x32200002,1,8Mlzma
4.3. Wifi配置
Openwrt编译出来的固件,wifi默认是不开启的,需要做一些修改让其上电自动开启AP模式。修改trunk/package/kernel/mac80211/files/lib/wifi/mac80211.sh,其中的detect_mac80211函数中就对wifi-device和wifi-iface即无线物理设配与无线接口做了具体的配置。
在wifi-device配置中屏蔽掉“option disable 1”这句就能使wifi上电自启动了,也可以对channel、hwmode、txpower做进一步的配置,如channel设置为auto,txpower设置为30dBm。
在wifi-iface配置中可以改变wifi的模式(mode)、名字(ssid)、加密方式(encryption)、密码(key)。
如下是一个最终配置示例,这其实也就是生成的/etc/config/wireless配置文件。
4.4. 设置默认登陆密码
Openwrt默认不设置密码,而我们需要一个默认的登陆密码,这可以通过修改package/base-files/files/etc/shadow来实现,修改root项如下:
root:$1$PjtjPtvn$F7wPtGnsC8lhpfJsB39.E/:16357:0:99999:7::: (对应密码123456)
或者
root:$1$0CVWiweD$4Xsq83ZIZtPJe8PVLfqJH0:16357:0:99999:7::: (对应密码admin)
注意Openwrt的登陆用户名为root,且当设置了密码后将不能在使用Telnet来登陆目标板,需使用SSH。
4.5. 设置LAN默认IP
Openwrt固件LAN口默认ip为192.168.1.1,我们可以通过如下方法在编译中修改默认ip:
在trunk目录下新建files/etc/config/目录,然后将已经个性化定制好的network配置文件放在这个目录下,这样再编译出来的固件将执行这个network配置。在此我们只要修改lan口的ipaddr即可,如下所示:
config interface 'lan'
option ifname 'eth1'
option force_link '1'
option type 'bridge'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.12.10'
最根本的方式是通过修改文件package/base-files/files/lib/functions/uci-defaults.sh实现,修改函数ucidef_set_interface_lan中lan口ip即可。
4.6. 串口释放
AR9331只有一个调试串口,如果想要释放调试串口用作他用比如通信等,为此需要释放系统console打印,具体方法如下:
在target/linux/ar71xx/base-files/etc/inittab中注释掉::askconsole:/bin/ash --login,也就是注释掉这个console登陆。
在package/base-files/files/etc/config/system文件中config system下添加以下两句
option 'conloglevel' '1'
option 'kconloglevel' '1'
简单测试:开发板串口连接pc,打开SecureCRT,配115200-8-n-1,使用ssh登陆到开发板,命令行下输入”echo test serial > /dev/ttyATH0”,看到PC端接收正常。
4.7. GPIO控制
如果想使用AR9331的一些GPIO引脚来做一些简单逻辑控制,则需要通过注册gpio设备来实现,修改target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr741nd-v4.c文件
在tl_mr3220_v2_setup函数中添加我们需要的GPIO管脚注册即可,如:
gpio_request_one(18,GPIOF_OUT_INIT_LOW | GPIOF_EXPORT_DIR_FIXED, "Control GPIO18");
这里的18即是GPIO18,GPIOF_OUT_INIT_LOW限定初始化输出低电平,后面的名字可以自定。
系统启动后可以看到GPIO注册成功:
#ls /sys/class/gpio/
#export gpio18/ gpio22/ gpiochip0/ uexport/
可以使用cat命令获取管脚当前输出值,使用echo命令设置管脚输出。如下:
#cat gpio18/value
1
#echo 0 > gpio18/value
#cat gpio18/value
0
这里说明一下,在写C代码程序控制时候可以直接调用system()函数运行linux命令,比如在你的代码中你想控制GPIO18引脚的输出,那么你可以如下使用。
system(“echo 0 > /sys/class/gpio/gpio22/value”);
4.8. 按键与指示灯
target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr741nd-v4.c文件中对各按键及指示灯定义,具体如下:
- l GPIO12做复位按键,短按则实现路由复位,长按大于5s则复位路由并恢复默认设置
- l GPIO11做WPS输入按键
- l GPIO17 做WAN口指示灯,对应Port4,低有效
- l GPIO13 LAN1指示灯,对应Port1,高有效
- l GPIO14 LAN2指示灯,对应Port1,高有效
- l GPIO15 LAN3指示灯,对应Port1,高有效
- l GPIO16 LAN4指示灯,对应Port1,高有效
- l GPIO0 WIFI指示灯,高有效
- l GPIO27 SYSTEM指示灯,低有效
此外将Port4与Port0的对换撤销掉,即恢复为使用Port4做wan口,将tl_ap121_setup函数中的
ath79_setup_ar933x_phy4_switch(true,true);
改为
ath79_setup_ar933x_phy4_switch(false, false);
修改target/linux/ar71xx/base-files/etc/uci-defaults/01_leds中mr3220-v2灯定义如下:
tl-mr3220-v2)
ucidef_set_led_netdev "wan" "WAN" "tp-link:green:wan" "eth1"
ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x02"
ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x04"
ucidef_set_led_switch "lan3" "LAN3" "tp-link:green:lan3" "switch0" "0x08"
ucidef_set_led_switch "lan4" "LAN4" "tp-link:green:lan4" "switch0" "0x10"
ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
#ucidef_set_led_usbdev "usb" "USB" "tp-link:green:3g" "1-1"
4.9. 时间同步
修改package/base-files/files/etc/config/system文件如下,这样默认同步时间正确。
config system
option hostname 'You can Define'
option zonename 'Asia/Shanghai'
option timezone 'CST-8'
注:这里hostname可以改成你想要的主机名字,将来在web页面中显示的也将是这个主机名。
4.10. 语言及主题设置
编译中的默认设置为auto,即自动识别,这将根据浏览器设置而定,例如我们使用ie、360浏览器,登陆后得到的是英文界面,而使用火狐则是中文界面。如果向默认设置问中文,则修改build_dir/feeds/luci/modules/base/root/etc/config/luci配置文件,将默认auto修改问zh_cn,并将主题锁定为bootstrap
config core 'main'
option lang 'zh_cn'
option mediaurlbase '/luci-static/bootstrap'
option resourcebase '/luci-static/resources'
4.11. 自定义脚本的使用
Openwrt为用户预留的自定义启动脚本/package/base-files/files/etc/rc.local来实现一些扩展功能,我们可以在这里添加一些命令,或者调用一个外部脚本来实现一些扩展功能。
参考网址:http://m.blog.csdn.net/blog/jiaozi07/41774357
【物联网】OpenWrt编译和修改基础--预科相关推荐
- Openwrt编译进阶-修改ROOT密码,修改默认WiFi名称,修改主机名,修改主机型号
修改密码 默认情况下root是没有密码的,需设定密码才能开启ssh. 修改shadow文件,位于package/base-files/files/etc/shadow 1)修改登陆密码 root:$1 ...
- openwrt ntp服务器修改,Openwrt编译进阶-修改ROOT密码,修改默认WiFi名称,修改主机名,修改主机型号...
修改密码 默认状况下root是没有密码的,需设定密码才能开启ssh. 修改shadow文件,位于package/base-files/files/etc/shadowphp 1)修改登录密码 root ...
- 【速记】openwrt - 编译、刷固件(资料整理)
固件 官方 https://downloads.openwrt.org/releases/19.07.4/targets/x86/64/ 整合 https://op.dllkids.xyz/op/fi ...
- openwrt编译流程分析
最近开始整5G CPE项目,系统基于OpenWrt系统移植裁剪,打算详细研究了一下整个工程的构建过程,记录一下: Openwrt编译过程概述 编译的总体过程如下: 1.编译host工具 2.编译交叉工 ...
- Android 编译之make基础(转)
Android 编译之make基础 原文链接 qiuxintai 0.498 2020.10.14 18:52:40 字数 13,246 阅读 2,631 引言 做android系统相关的开发已经有几 ...
- Openwrt编译:root.squashfs-64k is too big (Max=6488064 , Current=xxxx)
搞了一段时间openwrt编译,由于之前没有路由器的经验,很蛋疼,各种问题. Question 折腾好几天,终于把环境配好了,包括软件源.依赖库.版本,以及make menuconfig选择打到固件里 ...
- openwrt编译环境搭建
openwrt编译环境搭建 1.虚拟机安装 请参考网络上的资料进行安装. 2.ubuntu安装 请参考网络上的资料进行安装. 3.ubuntu下安装相关的编译环境(若是编译环境没有准备好,在后来的操作 ...
- OpenWrt编译自定义固件
OpenWrt编译自定义固件 1.编译环境搭建 OpenWrt官网 https://openwrt.org/ OpenWrt源码地址 https://github.com/openwrt/openwr ...
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...
原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html 之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...
最新文章
- 深度学习在计算机视觉中的应用长篇综述
- freemarker入门实例与源码研究准备工作
- java 直播服务器_MyLive--使用JAVA实现的直播RTMP服务器
- php 5.2.6升级,Centos5.5 简单方法升级php到php5.2.6
- java项目管理工具
- Linux:进程间的相互作用(模拟两个进程,一个存钱,另一个取钱),进程共享内存,进程的互斥,进程加锁,c++和c实现
- IC之无毛刺时钟切换
- 函数的应用及其解析大全!
- 如何用QT做串口调试助手Qseriaport类的使用
- PyTorch搭建卷积神经网络(CNN)进行视频行为识别(附源码和数据集)
- 计算机网络与无线通信系统学习14:电磁波的传播
- 实施工程师面常见问题
- CentOS7(Linux)在VMware Workstation上的 安装使用教程
- Android基于Poi生成Word
- 计算机书在书架A上的英语,书架用英语怎么说
- JAVA资深架构师成长路线-架构师筑基必备技能-深入Tomcat底层
- 计算机中常见的信息存储格式,信息保存在计算机中的基本形式是什么?
- ThreadPoolExecutor最佳实践--如何选择线程数
- html怎么搞一个微信图标,微信图标怎么点亮 两步搞定!
- Android实现联动下拉框
热门文章
- 3 CSS 高级语法
- html发送十六进制字符数组,十六进制数组怎么转换成字符串数组?
- 6-1 数组元素的区间删除
- C语言函数题- 删除字符串中下标为i的字符
- python调用zabbixapi接口_python3 + zabbix api 的使用
- Java黑皮书课后题第3章:*3.13(金融应用:计算税款)程序清单3-5给出了计算单身登记人税款的源代码。将程序清单3-5补充完整,从而计算所有登记的婚姻状态的税款
- Java黑皮书课后题第2章:2.1(将摄氏温度转换为华氏温度)编写程序,从控制台读入double型的摄氏温度值,将其转为华氏温度,显示结果
- 浙商银行2011.11.26校园招聘会笔试题
- Luogu 1941 飞扬的小鸟
- jmeter压测过程中内存溢出