开发者社区> 沧海一笑dj> 正文

【物联网】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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.3 定位光与定向光
上一节中介绍的光照效果都是基于定位光光源的,定位光光源类似于现实生活中的白炽灯灯泡,其在某个固定的位置,发出的光向四周发散。定位光照射的一个明显特点就是,在给定光源位置的情况下,对不同位置的物体产生的光照效果不同。
1316 0
C语言及程序设计进阶例程-10 预处理之条件编译
贺老师教学链接  C语言及程序设计进阶 本课讲解 条件编译在调试程序阶段,这样处理便于观察 #include &lt;stdio.h&gt; #define DEBUG //在运行程序时使之成为注释行 int main( ) { int x=1,y=2; #ifdef DEBUG printf("x=%d, y=%d\n", x, y); #endif printf(
850 0
[20161228]linux修改网络配置问题.txt
[20161228]linux修改网络配置问题.txt --今天要修改一块网卡的网络配置,一般在修改前我习惯做一个备份,但是在我启动网络时,还是让我惊讶一下. --以下是我在测试环境做的测试: 1.
663 0
利用预编译指令防止代码重复编译
 看下面一段代码     #include "test.h"   //看到这句我们重复了 三次 按照我们以往的编写 我们可能认为 他会出现变量函数 等重复定义的错误   在一个文件中这样写显然是不好  我这里是做演示 因为我们在大型项目开发中很有可能的重复包含 同一个头文件 为了防止...
615 0
openstack之网络基础
L1:物理层L2:数据链路层,基于mac地址的通信,通过交换机连接;对等传输,即交换机上的一个主机发一个包,连接在该交换机上的所有机器都能收到;L3:网络层,基于ip地址,路由器设备,连接不同网段,进行路由选择; 交换机/路由器的区别:1、工作层级不同,交换机在L2,路由器在L3;2、数据转发依据...
710 0
C/C++程序编译流程(预处理-&gt;编译-&gt;汇编-&gt;链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
834 0
NDK OpenGL ES 3.0 开发(十七):相机基础滤镜
上文中我们通过 ImageReader 获取到 Camera2 预览的 YUV 数据,然后利用 OpenGLES 渲染实现相机预览,这一节将利用 GLSL (OpenGL 着色器语言)基于不同的着色器实现多种基础滤镜。
113 0
《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.5 光照的每顶点计算与每片元计算
细心的读者会发现,本章前面的案例都是在顶点着色器中进行光照计算的。这是由于在顶点着色器中对每个顶点进行光照计算后得到顶点的最终光照强度,再由管线插值后传入片元着色器以计算片元的颜色,这样一方面效率比较高;另一方面产生的光照效果也不错。
1959 0
155
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载