嵌入式?! 從哪里開始討論?
開發(fā)板其實和一臺電腦是同樣的道理,他同樣有計算、存儲的功能。同樣,對Linux的開發(fā)板來說,也會像PC一樣裝有一套系統(tǒng),只是這套系統(tǒng)不是PC上最常用的Windows,而是Linux系統(tǒng)而已。
嵌入式的硬件結(jié)構(gòu)和PC其實沒有什么不同,都是由運算器、控制器、存儲器、輸入設(shè)備和輸出設(shè)備五大部分組成。
而嵌入式設(shè)備來說,總體看來,嵌入式系統(tǒng)具有便利靈活、性能價格比高、嵌入性強等特點,可以嵌入到現(xiàn)有 任何信息 家電和工業(yè)控制系統(tǒng)中。從軟件角度來看,嵌入式系統(tǒng)具有可修改性、系統(tǒng)所需配置要求較低、系統(tǒng)專業(yè)性和實時性較強等特點。
在這也不想說什么嵌入式的特點、分類等等的話題,這些內(nèi)容直接google即可,但是不得不簡單提出幾句,來過渡一下。
對于嵌入式硬件來說,是非常廣泛的,ARM、DSP、FPGA、STM32等等一大堆的嵌入式硬件平臺。從軟件角度來看,嵌入式的設(shè)備也是五花八門,uC/OS II、Arm-Linux、VxWorks、Windows CE等等,而我列舉的也才是其中對我來說出鏡率比較高的幾種,那么我在接下來的文章里面想要討論的主要還是 ARM架構(gòu)下的Linux系統(tǒng)的嵌入式開發(fā) 。
至于為什么?原因很簡單,就是ARM+Linux使用的范圍實在很廣。
那么其實還是從拿到的一塊開發(fā)板開始。
開發(fā)板的基本操作
我隨便google了一下,出現(xiàn)了一堆的開發(fā)板,對于這些開發(fā)板來說,長得都差不多,平時我們也都能看到類似的各類電路板。如果我們拆開過電腦,那么我們也會看到一堆的電路板,只是我們在使用電腦的時候,大部分這些板子都被包裝在了那些美麗的外殼底下而已。
當你拿到一臺PC的時候,無論他是筆記本還是臺式機,那么第一件事是干什么呢?
我想,第一件事,不要討論系統(tǒng)、配置什么的,那些都是次要的,我們肯定需要接線,如果不接線我們都沒辦法把他們打開,更別說使用了。(雖然筆記本有電池,我發(fā)現(xiàn)還是插電的比較多)
那么,我們給開發(fā)板接通了電源,上電后,如果開發(fā)板在出廠的時候就已經(jīng)燒好了“系統(tǒng)”(暫且這么說),那么我們可以開機使用了。以上對于PC來說,以上的步驟基本就是完成了的,除非這臺PC沒有系統(tǒng),沒辦法正常啟動。
但是,我不得不說但是,對于很多的開發(fā)板來說其實都不一定有顯示屏,比喻上面的圖片,有屏幕的都是少數(shù)。
那么我們即使上電,開機了,也就只能看到幾盞小燈,無助的亮著,不時還沖你眨眨眼睛。
同樣,對于我們來說,用開發(fā)板是為了寫出自己的程序,來讓別人使用,而不是我們自己直接來用開發(fā)板。那么我們就需要考慮開發(fā)板是如何和電腦連接在一起,才能讓我們進行開發(fā)的。
- Linux開發(fā)板的接線工具
上面這幅圖是一個ARM開發(fā)板的抽象圖,上面分布著各類元器件,但是,一般開發(fā)板都會提供兩個接口方便PC機使用,一個就是串口,另外一個就是JTag口。
JTag口就是類似下面的板子上面的黑色的插座,而串口就是底下那幅圖上的樣子,而上方的圖中也是具備一個串口的。其實還有網(wǎng)口,這個回頭再說。
上面提到了關(guān)于開發(fā)板的接口問題,那么我們再來看看PC上面如果有對應的接口不就可以直接連接了嗎?
想法很好,但是對于PC來說,現(xiàn)在很少有電腦上直接有JTag的接口來直接和開發(fā)板連接了。那么我們?nèi)绻紤]使用串口,但是也很可惜,在現(xiàn)在的電腦上,也很少有串口。但是如果有串口,也是可以直接使用串口線,把開發(fā)板和PC直接連在一起的。
那么,如果PC上沒有串口,就不能和PC連接了嗎?顯然不是。
由第一幅圖可以看出,開發(fā)板與PC機相連的方案還是很多種選擇的(圖上每一種顏色都是一種方案)。總結(jié)如下:
- 如果計算機有串口,那么直接通過串口線連接就完成了開發(fā)板與PC機的連接。
- 如果計算機有并口,那么可以使用并口JTag轉(zhuǎn)接板與PC機連接在一起。
但是由于現(xiàn)在的計算機很多都沒有串口和并口,所以一般現(xiàn)在都會采用USB來連接開發(fā)板,所以需要有開發(fā)板的轉(zhuǎn)接板。使用USB連接的方案,也有兩種選擇:
- 使用USB串口卡連接開發(fā)板的串口和PC的USB口連接
- 另外一種方案是通過USB轉(zhuǎn)JTag板連接JTag和PC的USB口連接,來完成開發(fā)板和PC的連接。
其中OpenJTag的接口如圖所示,OpenJTag的接口比較豐富,可以直接使用OpenJTag上面的JTag口通過排線連接,也可以使用引線通過串口來實現(xiàn)PC和開發(fā)板的連接。
同樣也有的開發(fā)板直接是吧USB串口卡集成在了開發(fā)板上的情況,那么相對來說就簡單多了,直接使用一條USB連接線就可以完成PC和開發(fā)板的連接了。
那么只需要任意選擇其中一種方式,把開發(fā)板和PC連在了一起了。
完成了開發(fā)板和PC的連接,但是是否上電以后就可以直接的開發(fā)了呢?
顯然還是不行,這些硬件連接在一起還需要為這些硬件安裝對應的驅(qū)動程序,才能保證,這些設(shè)備能夠正行的運行。
燒寫系統(tǒng),需要使用JTag口實現(xiàn),所以必須要在JTag的所提供的方案里面選擇,連接PC的并口或者PC的USB來連接。
如果使用并口來操作開發(fā)板,那么對于PC來說需要安裝并口的驅(qū)動程序,具體的并口驅(qū)動程序的安裝,需要參考對應的開發(fā)板的開發(fā)手冊,上面會有具體的介紹。
那么開發(fā)板上的程序運行的時候,會產(chǎn)生一些運算后的數(shù)據(jù),這些數(shù)據(jù)應該從哪里輸出呢?
一般用串口比較多,應為串口的操作相對比較簡單。
如果沒有串口,那么需要使用USB串口卡來連接,同樣也是需要在PC安裝對應的USB串口的驅(qū)動。
** 以下部分采用的是三星的2440開發(fā)板,對于不同的開發(fā)板的具體操作可能存在差異,但操作的概念大體相同。**
安裝對應的燒寫軟件
我的開發(fā)板對應的燒寫oflash,只需要把軟件的目錄寫到對應的環(huán)境變量里面即可,方便在cmd下能夠在任意目錄執(zhí)行到oflash即可。-
安裝串口工具
常用的串口工具比如SecureCRT,可以通過串口來管理開發(fā)板。我更喜歡使用的是XShell,里面也會帶有串口工具。并且XShell是一個免費軟件,我也不想去使用盜版或者破解版的軟件。-
具體設(shè)置如下:
添加新的會話
需要設(shè)置開發(fā)板的對應的串口號,波特率一般為115200,數(shù)據(jù)位一般為8位,停止位為1位,流控選為None。
-
使用串口操作開發(fā)板的前提是開發(fā)板燒好了程序。
那么如果沒燒寫程序的裸板我們就需要給他燒寫裸板程序了,那么燒寫一般有四種方法:
- 使用并口工具燒寫
- 接線
- 使用oflash燒寫
- 上電(并口里面沒有復位引腳,需要手動上電)
- OpenJTag
- 接線
- 使用oflash燒寫,燒寫完成后,有復位引腳,可以自動復位,不需要手動上電
- JLink:只能燒寫Nor flash,燒好u-boot.bin后,使用Nor啟動
- 通過nor上的uboot
- 使用菜單通過usb燒寫
- 連線
- 進入u-boot的選項Download u-boot to xxx
-
使用程序DNW把需要安裝的文件發(fā)送給開發(fā)板(需要連接usb host線,并安裝驅(qū)動)
- 自動完成安裝過程
- 使用tftp下載
- 啟動tftp程序,指定文件目錄和Server的ip地址
- 開發(fā)板nor啟動,進入U-boot
- 設(shè)置set ipaddr 到同一網(wǎng)段
- 設(shè)置set serverip 為pc的ip
- 接入網(wǎng)線
- 測試是否可以ping通pc(pc不能ping通開發(fā)板)
-
命令tftp 30000000 文件名,來將文件文件下載到開發(fā)板
uboot的分區(qū)情況
- 燒寫前,先擦除nand erase 分區(qū)名(從多少地址到多少地址)
- 使用 nand write 30000000 分區(qū)名,進行燒寫
- 斷電,切換nand啟動,上電
- 使用菜單通過usb燒寫
- 重燒系統(tǒng):uboot、內(nèi)核、文件系統(tǒng)
uboot的燒寫和燒寫裸板程序的方法一樣(uboot本身就是一個裸板程序)
-
燒寫內(nèi)核
-
uboot + usb Host + DNW(發(fā)送文件)來燒寫內(nèi)核
- 使用dnw發(fā)送文件即可
-
-
uboot + tftp(下載文件) 燒寫系統(tǒng)
- tftp 30000000 uImage
- nand erase kernel(使用分區(qū)名代替起止內(nèi)存地址)
- nand write.jffs2 3000000 kernel (使用jffs2進行校驗,把30000000的內(nèi)容燒寫到kernel分區(qū)中去)
-
燒寫文件系統(tǒng)
-
uboot + DNW(使用jffs文件)
-
uboot + DNW(使用jffs2文件)
- 使用dnw發(fā)送完畢后1,需要設(shè)置 bootargs
-
燒寫 JFFS2文件系統(tǒng),需要設(shè)置 bootargs的 rootfstype=jffs2,命令如下: setenv bootargs 'root=/dev/mtdblock3 noinitrd init=/linuxrc console=ttySAC0,115200 rootfstype=jffs2 ' save, 2,同樣的,在 Linux下使用 dnw和 u-boot燒寫系統(tǒng)同樣需要設(shè)置 rootfstype,不再贅述。 燒寫 JFFS2文件系統(tǒng)不需要設(shè)置 rootfstype,設(shè)置了反而會報錯,導致系統(tǒng)無法啟動。 3,系統(tǒng)啟動后 nand flash 有壞塊是它的天然缺點,無法避免。有的壞塊多,有的少,純屬 幾率,不影響使用
-
uboot + tftp
- 下載 tftp 3000000 fs_qtopia.faffs2
- 擦除 nand erase root
- 燒寫 nand write.yaffs 30000000 0x00260000 $(filesize) (這里不能直接使用root的分區(qū),需要指定從3000000里寫到0x00260000的內(nèi)存,并且指定文件的大小$(filesize))
-
uboot打補丁、內(nèi)核打補丁
- 先將uboot、內(nèi)核、補丁文件放入虛擬機中。
- 解壓uboot,tar xjf uboot.tar.bz2
-
用UE打開補丁文件(+++)是修改后的文件、(---)是被修改的文件,(-)刪除老文件的內(nèi)容,(+)添加的內(nèi)容
- 進入要被修改的文件目錄
- 執(zhí)行:
patch -p1 < ../u-boot-1.1.6_jz2440.patch
其中p代表忽略補丁文件中,位置信息第幾個/
符號之前的信息,比如-p1代表忽略u-boot-1.1.6/這部分信息,直接使用/board/和他之后的內(nèi)容來做定位文件。(根據(jù)執(zhí)行命令的的目錄和被打補丁的目錄的相對位置來確定-p的選項) - 將目錄創(chuàng)建壓縮文件 tar cjf uboot-1.1.6_jz2440.tar.bz u-boot-1.1.6,放到Windows下,方便查看(此步驟并非必須)
- 在Linux下make編譯得到uboot.bin
-
制作、燒寫根文件系統(tǒng),以及初探驅(qū)動
- 解壓縮文件系統(tǒng)的壓縮包到Linux服務(wù)器
- 使用mkyaff2Image工具,在解壓的路徑中執(zhí)行,mkyaffs2image dir image_file 就會生成yaffs2文件,例如
mkyaffs2image fs_mini_mdev fs_image.yaffs2
- 把yaffs2文件燒寫到開發(fā)板上
- 進入到uboot目錄,進入Download root_yaffs image選項
- 通過nfs網(wǎng)絡(luò)系統(tǒng)把Linux服務(wù)器上之前生成的yaffs2文件發(fā)送到開發(fā)板上,
nfs 下載的內(nèi)存地址 服務(wù)器地址:yaffs2路徑
,例如nfs 192.168.1.19:work/nfs_root/tmp/fs.yaffs2
(前提是虛擬機啟動了NFS服務(wù)) - 擦除
nand erase root
- 燒寫
nand write.yaffs 259999 $(filesize)
- 重啟
reset
-
設(shè)置NFS網(wǎng)絡(luò)文件系統(tǒng)服務(wù)
- 在開發(fā)板上進行掛載NFS:用flash上的根文件系統(tǒng)啟動后,手工mount nfs
mount -t nfs -o nolock,vers=2 192.168.1.19:work/nfs_root /mnt
- 使用NFS作為根文件系統(tǒng)來啟動
- 進入uboot
- 設(shè)置bootargs :
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/tmp ip=192.168.1.17:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
服務(wù)器配置信息:nfsroot=[<server-ip>:]<root-dir>[,<nfs-option>]
ip信息配置:ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
- 保存并重啟
save
、reset
- 在開發(fā)板上進行掛載NFS:用flash上的根文件系統(tǒng)啟動后,手工mount nfs
-
在win7下不能使用dnw的解決方案
DNW的作用只是使用USB Host下載文件到開發(fā)板。- 使用網(wǎng)絡(luò)下載,手動擦除燒寫
- 使用tftp進行下載
- 使用nfs進行下載
- 使用Linux服務(wù)器的DNW下載文件
- 使用網(wǎng)絡(luò)下載,手動擦除燒寫