1 嵌入式系統(tǒng)啟動流程
對于一個完整的嵌入式系統(tǒng),它由U-boot、內(nèi)核(Linux)、文件系統(tǒng)、應(yīng)用程序四部分組成。那么這四部分之間的關(guān)系是怎么樣的呢?OpenWrt是屬于哪部分呢?
當我們拿到嵌入式設(shè)備,比如我們的MT7620開發(fā)板,然后給它一上電,首先運行的就是我們的U-boot程序,然后就是U-boot來啟動我們的內(nèi)核(Linux),當內(nèi)核(Linux)啟動完成以后,內(nèi)核(Linux)就會去掛載我們的文件系統(tǒng),當文件系統(tǒng)掛載成功以后,就會在文件系統(tǒng)上面運行我們的應(yīng)用程序,比如我們學習C語言時寫的HelloWorld應(yīng)用程序。
OpenWrt系統(tǒng)是一個嵌入式的Linux發(fā)行版。它本生是包含了內(nèi)核(Linux)和文件系統(tǒng)兩部分的。因此,上一章中,我們編譯出來的固件
openwrt-ramips-mt7620-youku-yk1-squashfs-sysupgrade.bin
就是將內(nèi)核(Linux)和文件系統(tǒng)打包成了一個bin文件。在這里,大家肯定會有疑問了,那么U-boot是誰提供的呢?對于其它的嵌入式設(shè)備,U-boot是需要我們單獨來編譯和燒寫的,而對于我們的MT7620等開發(fā)板,我們在出廠的時候,已經(jīng)在開發(fā)板上的Flash中燒入了U-boot了。
那么大家馬上肯定會問,我們可以自己燒寫U-boot嗎?答案是肯定的。我們可以自己燒寫U-boot。如何燒寫,我們會在后面進行講解。
注意:雖然我們可以自己燒寫U-boot,但是,如果不是動手能力特別強的同學,不建議自己燒寫U-boot,因為隨時都有可能變磚。變磚以后,就只能通過SPIFlash編程器來拯救了。雖然在后面的章節(jié),會講如何使用SPIFlash編程器來燒U-boot、固件。但是整個過程比較麻煩,所以請大家自己慎重。
2 U-boot菜單選項簡介
將開發(fā)板的Mini-USB口通過USB線和電腦的USB口進行連接,然后安裝串口驅(qū)動(只有第一次需要安裝),USB轉(zhuǎn)串口驅(qū)動文件如下,安裝步驟不再贅述。
圖1串口驅(qū)動
圖2電腦識別到串口
打開putty串口下載軟件,編者也給出了另一款下載軟件securecrt,看讀者喜好了。自己選擇吧。
緊接著,如圖3所示,在終端上設(shè)置好相應(yīng)的串口(8N1,57600)。
圖3設(shè)置終端
最后上電啟動,便可以在串口上看到開發(fā)板的啟動信息,首先打印出的是U-boot的版本等信息,如圖4所示。
圖4 U-boot啟動信息
緊接著便進入了U-boot的菜單選項,如圖5所示。這里一共有5秒的時間供大家選擇。如果不做任何選擇,5秒后,便自動啟動內(nèi)核。
圖5U-boot的菜單選項
1).選擇1,表示將固件通過網(wǎng)絡(luò)下載到內(nèi)存中,如果是刷SDK固件,可以選擇這個選項,但是,如果是刷OpenWrt,該選項沒有用,我們會發(fā)現(xiàn),刷固件成功以后,系統(tǒng)并不能正常啟動;
2).選擇2,表示將固件通過網(wǎng)絡(luò)下載到Flash中,在以后的開發(fā)中,我們都是使用該選項;
3).選擇3,表示啟動內(nèi)核(Linux),上面說的5秒結(jié)束,不做任何選擇,系統(tǒng)就會默認來選擇該選項,然后啟動系統(tǒng);
4).選擇4,便會進入到U-boot的命令行,注意區(qū)分Linux系統(tǒng)的命令行。在U-boot的命令行我們可以使用printenv、set、loadb等命令。
5).選擇7,表示將U-boot通過串口下載到Flash中;
6).選擇9,表示將U-boot通過網(wǎng)絡(luò)下載到Flash中。
3 燒寫OpenWrt固件
以下燒寫方法,都是通過網(wǎng)絡(luò)的方式進行燒寫。因此,需要用到網(wǎng)線。接線方式有兩種,一是通過網(wǎng)線將開發(fā)板的網(wǎng)口和電腦的網(wǎng)口直接相連(電腦---開發(fā)板);另一種是電腦和路由器通過網(wǎng)線或者wifi連接,然后開發(fā)板和路由器通過網(wǎng)線連接(電腦---路由器---開發(fā)板)。
為了更加方便和穩(wěn)定,推薦使用第二種方法。
無論使用哪種方法,都必須遵循一個大前提,就是要讓電腦和開發(fā)板的IP處于同一個網(wǎng)段。另外,一定要關(guān)閉電腦的防火墻和一些頑固的殺毒軟件。
3.1 通過網(wǎng)線下載
3.1.1設(shè)置ubuntu虛擬網(wǎng)卡
1 選擇網(wǎng)卡
編輯->虛擬網(wǎng)絡(luò)編輯器->橋接模式選擇本機的物理網(wǎng)卡,見下圖.
圖6
2 網(wǎng)絡(luò)適配器設(shè)置
虛擬機->設(shè)置->網(wǎng)絡(luò)適配器
圖7
3.1.2 主服務(wù)器tftp服務(wù)器配置
TFTP(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個用來在客戶機與服務(wù)器之間進行簡單文件傳輸?shù)膮f(xié)議,提供不復雜、開銷不大的文件傳輸服務(wù)。TFTP承載在UDP上,提供不可靠的數(shù)據(jù)流傳輸服務(wù),不提供存取授權(quán)與認證機制,使用超時重傳方式來保證數(shù)據(jù)的到達。
0 IP配置
在談TFTP之前,先簡單講一下Linux網(wǎng)絡(luò)配置,網(wǎng)絡(luò)中最重要的當然是IP地址了,這里不講IP協(xié)議,在后面的網(wǎng)絡(luò)編程再講解,這里主要學習一下Linux下配置IP,配置IP地址的方法有兩種:
- 配置靜態(tài)IP:在主機進入網(wǎng)絡(luò)之前,事先未主機設(shè)置固定的IP地址;
- 配置動態(tài)IP:選擇DHCP網(wǎng)絡(luò)服務(wù),在主機進行網(wǎng)絡(luò)之后,動態(tài)的隨機獲取IP地址;
當然,大家都知道ifconfig這個命令:
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:172.16.58.130 Bcast:172.16.58.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6c:c2ec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:337 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:123712 (123.7 KB) TX bytes:42430 (42.4 KB)
Interrupt:19 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:149 errors:0 dropped:0 overruns:0 frame:0
TX packets:149 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:10307 (10.3 KB) TX bytes:10307 (10.3 KB)
如果ifconfig命令不帶任何參數(shù)時,用于顯示當前主機中狀態(tài)為“活動”的網(wǎng)絡(luò)接口信息;
當然,ifconfig命令可以修改IP地址:
sudo ifconfig eth0 192.168.3.51
但是這是動態(tài)的修改IP地址,重啟以后,IP地址又變回原來的靜態(tài)IP地址;修改IP地址除了可以在圖形界面中修改,也可以在配置文件中修改,這才是Linux的特性!無論是配置靜態(tài)IP還是動態(tài)IP,計算機系統(tǒng)將IP信息保存在什么地方呢?答案是配置文件 "/etc/network/interfaces".在UBuntu Linux 啟動時就能獲得IP地址的配置信息。若是配置靜態(tài)IP。就從配置文件中讀取IP地址參數(shù),直接配置網(wǎng)絡(luò)接口設(shè)備;若是配置動態(tài)IP,就通知主機通過DHCP協(xié)議獲取網(wǎng)絡(luò)配置。以下分別為配置靜態(tài)IP和動態(tài)IP時,配置文件"/etc/network/interfaces"的實例:
動態(tài)IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
靜態(tài)IP
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.3.51
netmask 255.255.0.0
gateway 192.168.1.1
重啟下系統(tǒng),用ifconfig命令查看IP地址
ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:6c:c2:ec
inet addr:192.168.3.51 Bcast:192.168.255.255 Mask:255.255.0.0
明顯看到IP地址依然是我們靜態(tài)修改過的IP地址。
注意:
1、若不能訪問外網(wǎng): ping 不通114.114.114.114
解決方法: sudo route add default gw 192.168.1.1
2、若不能訪問域名: ping 不通baidu.com
解決方法:
1)-- sudo vi /etc/resolv.conf
2) -- 添加nameserver 114.114.114.114
1 檢查是否安裝tftp server
命令:dpkg –s tftpd-hpa
2 如果未安裝則需要安裝tftp-server
命令:sudo apt-get install tftp-hpa tftpd-hpa
Client:PC 安裝tftp-hpa
Server:ARM 安裝tftpd-hpa
后面的 tftp 此處的IP地址應(yīng)該是ARM的IP地址。
__3 修改文件 tftpd-hpa __
命令:sudo vim /etc/default/tftpd-hpa
tftpd-hpa文件修改后如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
說明:修改項,其中TFTP_DIRECTORY處可以改為你的tftp-server的根目錄,這里是/tftpboot,當然可以改成其他地址,參數(shù) -c 指定了可以創(chuàng)建文件,參數(shù) -s是指定tftpd-hpa服務(wù)目錄,上面已經(jīng)指定。
4 創(chuàng)建目錄tftpboot,改變權(quán)限及啟動
命令:
sudo mkdir /tftpboot
sudo chmod a+w /tftpboot
操作命令:
sudo service tftpd-hpa stop//停止
sudo service tftpd-hpa start//啟動
sudo service tftpd-hpa status//查看tftp信息
sudo service tftpd-hpa restart//重啟
5 測試
a、登陸服務(wù)器
tftp localhost或 tftp<主機IP>
b、從tftp服務(wù)器下載文件
tftp> get
c、上傳文件到tftp服務(wù)器
tftp> put
d、查看幫助
tftp>?
tftp-hpa5.2
Commands may be abbreviated. Commands are:
connect connect to remote tftp
mode set file transfer mode
put send file
get receive file
quit exit tftp
verbose toggle verbose mode
trace toggle packet tracing
literal toggle literal mode, ignore':'in file name
status show current status
binary set mode to octet
ascii set mode to netascii
rexmt set per-packet transmission timeout
timeout set total retransmission timeout
?print help information
help print help information
e、退出登陸
tftp> q
注意:必須是超級用戶權(quán)限
6問題及原因(解決方法):
1、Transfer time out.
tftpd服務(wù)沒有啟動
2、Error code 0:Permission denied
可能是由SELinux造成的,在FC3和FC3以后的FC版本中SELinux默認的都是開啟的,現(xiàn)在要關(guān)掉它。
修改文件/etc/sysconfig/selinux,設(shè)定SELINUX=disabled,然后重啟電腦即可
或者執(zhí)行命令system-config-securitylevel打開“安全級別配置”對話框,將SELinux(S)選項中“強制”改為“允許”
3、Error code 1:File not found
指定的文件夾不存在;或tftpd啟動參數(shù)中沒有指定-c選項,允許上傳文件
4、Error code 2:Only absolute filenames allowed
TFTP_OPTIONS="-l -c -s",中的選項注意一下,是否沒 -c
5、Error code 2:Access violation
上傳的文件要有相應(yīng)的可讀寫(覆蓋)的權(quán)限才能上傳,要對文件的權(quán)限進行修改
chmod 777 (文件名)
3.1.3 主機端NFS配置
NFS是Network File System的簡寫,即網(wǎng)絡(luò)文件系統(tǒng)。
網(wǎng)絡(luò)文件系統(tǒng)是許多操作系統(tǒng)都支持的文件系統(tǒng)中的一種,也被成為NFS。NFS允許一個系統(tǒng)在網(wǎng)絡(luò)上與他人共享目錄和文件。通過使用NFS,用戶可以像訪問本地文件一樣訪問遠端系統(tǒng)上的文件。
NFS所提供的共享文件服務(wù)是建議在高度信任的基礎(chǔ)上的,所以,向其他用戶釋放共享資源之前,一定要確保對方的可靠性。
NFS的應(yīng)用:在我們嵌入式開發(fā)過程中,NFS是一個重要環(huán)節(jié),我們常常·把“根文件”系統(tǒng)放在主機上,然后在開發(fā)板啟動的時候通過NFS來掛載主機上的根文件系統(tǒng)。這樣省去了每次都要把文件系統(tǒng)燒寫到存儲設(shè)備上的步驟,可以說比tftp更方便。
下面我們將以Ubuntu為例,講解一下NFS的配置過程:
Server: PC
CLient : ARM(這里是用同一臺機器模擬的,主要是安裝過程)
1 檢查是否安裝nfs
命令:sudo dpkg -s install nfs-kernel-server
2 如果未安裝則需要安裝nfs-server
命令:sudo apt-get install nfs-kernel-server
3 修改配置文件及權(quán)限
命令:
sudo vim /etc/exports
sudo chmod 777 /tftpboot/rootfs
修改后的文件:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#/tftpboot/rootfs *(rw,sync,no_root_squash,no_subtree_check)
格式說明:
共享目錄:主機名稱
主機名稱或共享IP:允許按照指定權(quán)限訪問這個目錄的遠程主機(如:開發(fā)板)
參數(shù):
ro:只讀權(quán)限
rw:讀寫權(quán)限
no_root_squash:如果是客戶端root,那么他對這個目錄具有root權(quán)限
root_squash:如果是客戶端root,那么他的權(quán)限被限制為匿名使用者
all_squash:如果是客戶端是什么身份,那么他的權(quán)限被限制為匿名使用者
4手動啟停NFS服務(wù)
命令:
sudo/etc/init.d/nfs-kernel-server start
sudo /etc/init.d/nfs-kernel-server restart
sudo/etc/init.d/nfs-kernel-server stop
sudo/etc/init.d/nfs-kernel-server restart//重新啟動
5 共享操作
sudo/etc/init.d/nfs-kernel-server status//查看NFS服務(wù)當前狀態(tài)
showmount –e 192.168.3.51 //查看NFS服務(wù)器的共享資源
sudo mount –t nfs 192.168.3.51: /tftpboot/rootfs/mnt/nfs//掛載共享資源
-t 指類型,這里是NFS;
192.168.3.51是服務(wù)端的IP地址;
/tftpboot/rootfs 是服務(wù)端的共享目錄;
/mnt/nfs是掛載點,是客戶端的目錄;
當客戶端使用mount命令講NFS服務(wù)器上的到處文件系統(tǒng)掛載到本地后,接下來對掛載的文件系統(tǒng)的操作與使用本地文件系統(tǒng)沒有任何區(qū)別。
sudo umount/mnt/nfs//卸載共享資源
需要說明的是,當有用戶正在使用某個已加載的共享目錄上的文件時,則不能卸載該文件系統(tǒng),如果用戶確認無誤,可以使用“umount -f”命令強行卸載共享的目錄。
6測試
第一種方法)showmount -e
第二種方法)自己掛載
$ mount -t nfs 127.0.0.1:/nfsboot /mnt/xxx
注意:必須是超級用戶權(quán)限
連接串口和板子,運行串口通信程序(putty在工具),設(shè)置相關(guān)參數(shù)。
圖8
圖9
然后開發(fā)板上電,在如圖10所示的界面中,選擇2。
圖10
在圖10所示界面中,我們輸入y以確定我們是要燒寫固件到Flash中。接著便會進入到如圖11所示界面。
圖11
1).如圖11所示的1中,輸入設(shè)備IP,這個IP可以是任意的,但是必須要和2中輸入的服務(wù)器IP是同一個網(wǎng)段;
2).如圖11所示的2中,輸入服務(wù)器IP;
3).如圖11所示的3中,輸入我們要下載的固件的名字。以上3點設(shè)置好以后,最后回車,便開始下載程序了。如圖12所示。
圖12下載過程
注意:
1).出現(xiàn)#####,表示下載正在下載,一切正常;出現(xiàn)TTTTT,則說明我們哪里設(shè)置不對,需要從頭重新設(shè)置一下。
2).如圖12所示,當串口打印出raspi_erase信息的時候,表示正在擦除Flash中的數(shù)據(jù),此時一定不要強行斷電和退出,否則開發(fā)板就變磚了。
3.2 通過tftpd32軟件
Tftpd32軟件適用于32位系統(tǒng)和部分64位系統(tǒng)。首先啟動軟件,Tftpd32的界面如下。
圖13 Tftpd32界面
①對應(yīng)的CurrentDirectory用于選擇固件所在的目錄,通過Browse按鈕來進行選擇設(shè)置。比如,我將固件放在了G:盤的tftpboot目錄,則需要進行如圖2所示的設(shè)置。
②對應(yīng)的Serverinterface用于選擇服務(wù)器的IP地址。此時,如果你是通過網(wǎng)線和開發(fā)板或者路由器進行連接,那么這里就應(yīng)該選擇為本地有線網(wǎng)卡的IP地址;如果是通過WiFi和路由器進行連接,那么這里應(yīng)該選擇為無線網(wǎng)卡的IP地址。
注意:電腦的IP地址通過在運行(win+R就可打開,方法很多)中CMD中輸入ipconfig命令得到,如圖14所示。
圖14查看電腦IP
當Tftpd32軟件設(shè)置完成以后,接下來就是將開發(fā)板的Mini-USB口通過USB線和電腦的USB口進行連接,然后安裝串口驅(qū)動和設(shè)置好相應(yīng)的串口(8N1,57600),然后開發(fā)板上電,在如圖15所示的界面中,選擇2。
圖15
在圖15所示界面中,我們輸入y以確定我們是要燒寫固件到Flash中。接著便會進入到如圖16所示界面。
圖16
1).如圖16所示的1中,輸入設(shè)備IP,這個IP可以是任意的,但是必須要和2中輸入的服務(wù)器IP是同一個網(wǎng)段;
2).如圖16所示的2中,輸入服務(wù)器IP;
3).如圖16所示的3中,輸入我們要下載的固件的名字。以上3點設(shè)置好以后,最后回車,便開始下載程序了。如圖17所示。
圖17下載過程
注意:
1).出現(xiàn)#####,表示下載正在下載,一切正常;出現(xiàn)TTTTT,則說明我們哪里設(shè)置不對,需要從頭重新設(shè)置一下。
2).如圖17所示,當串口打印出raspi_erase信息的時候,表示正在擦除Flash中的數(shù)據(jù),此時一定不要強行斷電和退出,否則開發(fā)板就變磚了。
3.3 通過3CDaemon軟件
3CDaemon適用于64位系統(tǒng)。首先啟動軟件,3CDaemon的界面如下。
圖18 CDaemon軟件界面
當我們啟動好3CDaemon軟件以后,我們發(fā)現(xiàn)它監(jiān)聽了電腦上所有網(wǎng)卡的IP地址,這也是較Tftpd32軟件好的地方,不用我們自己選擇指定IP。但是,任然需要我們來設(shè)置固件所在目錄。點如圖18所示的,點擊“設(shè)置TFTP服務(wù)器”按鈕,會彈出如圖19所示的對話框。在該對話框中選中固件的存放目錄即可。
圖19設(shè)置固件的目錄
當3CDaemon軟件設(shè)置好以后,接下來的操作又和使用Tftpd32軟件的過程一樣了。開發(fā)板上電,選2,輸入y,設(shè)置設(shè)備IP、服務(wù)器IP、固件的名字。
注意:對于不會從Ubuntu下載固件的朋友,編者也將固件放在附件里,直接使用就行了。但是想更好地掌握openwrt的朋友,還是要多學習啊。
審核編輯:湯梓紅
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3587瀏覽量
129433 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40275 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
燒寫
+關(guān)注
關(guān)注
0文章
57瀏覽量
14277 -
OpenWrt
+關(guān)注
關(guān)注
10文章
130瀏覽量
39296
發(fā)布評論請先 登錄
相關(guān)推薦
評論