http://blog.csdn.net/jiaozi07/article/details/41774357
該文章講解一下在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來實現一些擴展功能,我們可以在這里添加一些命令,或者調用一個外部腳本來實現一些擴展功能。