2011年3月30日 星期三

免費軟體

重灌狂人
用15個「免費正版軟體」

免費!作業系統

不花錢買:Windows XP、Vista $9290元
免費改用:
Ubuntu Linux作業系統 *免費
軟體版本:8.04
官方網站:http://www.ubuntu.org.tw/
軟體下載:按這裡(x86)64位元版本
軟體簡介:Ubuntu Linux是最近爆紅的一套相當好用的Linux作業系統,不但好安裝、好操作,相容性與穩定性都相當不錯,幾乎是裝了就可以用,裡面還包含了一堆上網、聊天、文書處理、繪圖等工具,是目前最受矚目的最新作業系統。

免費!文書處理軟體

不花錢買:Office 2003/2007 $17490元
免費改用:OpenOffice 文書處理軟體 *免費
軟體版本:3.0 beta 繁體中文版
官方網站:http://zh.openoffice.org/
軟體下載:按這裡
軟體簡介:OpenOffice 是個免費的文書處理軟體,跟微軟的Office一樣,包含了Writer文書編輯、Calc試算表、Impress簡報製作、Math數學公式/方程式編 輯、Draw繪圖功能與Base資料庫管理…等功能。除此之外,還可支援微軟Office XP/2003/2007所產生的文件格式,包含Word、Excel、PowerPoint...等等,是個免費又實用的好用工具。對了,如果你要製作PDF文件,只要按另存新檔就可以了,不需購買其他軟體(如Acrobat)再轉存。

不花錢買:自然輸入法 $499元
免費改用:新酷音輸入法、Yahoo!奇摩輸入法 *免費
軟體版本:0.3.4.5
官方網站:http://chewing.csie.net/
軟體下載:按這裡
軟體簡介:新 酷音輸入法支援自動選詞並可自行編輯使用者詞庫,或者匯入已整理好的詞庫,增加選字的命中率與中文輸入效率。此外更可支援快速鍵輸入特殊符號與標點符號的 功能。新酷音輸入法中還內建了教育部網路國語辭典、國語小辭典、成語辭典…等網站的連結,要查找各種中文字詞的解釋相當方便。另外Yahoo!奇摩也推出 免費版的中文輸入法,詳情參考:「Yahoo奇摩輸入法 1.0 beta (注音文校正、支援簡體字)」。

相關介紹: 用「快速鍵」輸入常用字詞或符號

免費!看圖軟體、繪圖、相片處理

不花錢買:ACDSee 看圖軟體 $1680元
免費改用:IrfanView 看圖軟體 *免費
軟體版本:4.10
官方網站:http://www.irfanview.com/
軟體下載:按這裡
軟體簡介:如果你買了ACDSee只為了開圖快速、瀏覽圖片方便的話,改用IrfanView你會覺得開圖更快、更不佔資源,瀏覽圖片更加方便。重點是,IrfanView免費,還支援中文介面。一樣是裝完之後就不用管他的好用工具。相關介紹與教學:按這裡

不花錢買:Photoshop $29700元
免費改用:GIMP 免費繪圖軟體(GNU GPL) *免費
軟體版本:2.6.11 (內建繁體中文語系)
官方網站:http://www.gimp.org/
軟體下載:按這裡
軟體簡介:GIMP是一套免費而且功能相當專業的製圖軟體,號稱是可以媲美商用的Photoshop繪圖軟體。支援各種筆刷、濾鏡、圖樣、增效模組與外掛,重點是GIMP是套跨平台的開放原始碼軟體,永久免費、可在商業環境使用。
使用手冊:按這裡瀏覽

不花錢買:PhotoImpact $3690元
免費改用:
Paint.NET 繪圖、相片處理軟體 *免費
軟體版本:3.35 beta
官方網站:http://www.getpaint.net/
軟體下載:按這裡
軟體簡介:Paint.NET是個功能相當強大的免費圖形處理軟體,比起PhotoImpact來說,Paint.NET佔用的資源不多,開啟速度相對較快,而在圖形處理、圖層、色彩處理與各種圖片特效、去紅眼、銳化...等效果,都相當好用。目前內建英文語系與簡體中文語系,簡體中文字在Windows Vista系統中不會有亂碼,可以安裝使用。需Windows XP SP2以上版本,並安裝.NET Framework 2.0。

免費!光碟燒錄軟體

不花錢買:Nero 燒錄軟體 $3200元
免費改用:ImgBurn 燒錄軟體 *免費
軟體版本:
2.4.1.0
官方網站:http://www.imgburn.com/
軟體下載:按這裡
軟體簡介:ImgBurn是個功能完整的免費燒錄軟體,不但可以燒錄一般檔案、VCD、DVD...等,還可支援ISO光碟映像檔燒錄,軟體只有1.8MB,運作時佔系統資源少、運作效率高,還內建了繁體中文介面,是個相當不錯的免費燒錄軟體。
介紹與教學:

免費!壓縮軟體

不花錢買:WinRAR、WinZIP $1050元
免費改用:7-ZIP 壓縮/解壓縮軟體 *免費
軟體版本:4.57 繁體中文版(內建多國語系)
官方網站:http://www.7-zip.org/zh-tw/
軟體下載:按這裡
軟體簡介:7-ZIP是個相當好用的免費壓縮/解壓縮軟體,不但支援ZIP壓縮,還可支援常見的ZIP、RAR、ISO、CAB、GZIP、BZIP、TAR、...等格式的解壓縮功能,另外壓縮比與壓縮、解壓縮速度也是相當為人稱道,更支援unicode檔案名稱,比較不會有檔名亂碼無法解壓縮的問題。
相關介紹:

免費!防毒軟體

不花錢買:PC-cillin、諾頓 Symantec $1490元
免費改用:avast! antivirus防毒軟體 *免費
軟體版本:avast! 4.8中文版
軟體下載:11套免費防毒軟體
軟體簡介:內 建中文版的avast!防毒軟體都是目前頗受好評的免費防毒軟體,除了內建病毒即時偵測功能可防禦病毒、木馬程式之外,還可每日自動更新病毒碼,對於不想 花錢買防毒軟體的人來說,都是不錯的選擇。部分免費版的防毒軟體有限制不可商業使用,對於一般使用者或家裡電腦使用的話則沒有限制,完整介紹請參考「http://briian.com/?p=243」。

免費!影音播放軟體

不花錢買:PowerDVD 播放軟體 $1480元
免費改用:KMPlayer 影音播放器 *免費
軟體版本:2.9.3 繁體中文(內建多國語系)
官方網站:http://www.kmplayer.com/
軟體下載:按這裡
軟體簡介:KMPlayer是個相當小巧的免費播放軟體,支援常見的影音格式,更可支援YouTube、無名影音網站等下載回來的flv格式影片檔與Flash檔案。此外,還可支援影片抓圖、視訊/音訊擷取功能...等,是個功能相當完整且好用的免費播放軟體。
相關介紹:

免費!英漢、漢英、日文翻譯機、字典

不花錢買:Dr. Eye 譯點通 $1650元
免費改用:StarDict 星際譯王 *免費
軟體版本:3.02 (繁體中文版、多國語系)
官方網站:http://stardict.sourceforge.net/
軟體下載:按這裡
軟體簡介:StarDict是個全中文的免費翻譯軟體,支援英漢、漢英雙向翻譯,安裝好之後,還可支援「滑鼠隨選翻譯」,滑鼠指到哪個字就可翻譯到哪。另外還可使用「*」或「?」萬用字元來搜尋拼不出來的單字,也支援單字發音,是個相當不錯的免費翻譯軟體。
教學文章:StarDict 星際譯王 v3.02 免費翻譯軟體! (滑鼠指到哪、翻譯到哪的英漢、英日、中日字典…)

免費!架站、網頁製作、網路傳輸軟體

不花錢買:CuteFTP $2470元
免費改用:FileZilla FTP檔案傳輸軟體 *免費
軟體版本:3.0.10 繁體中文版(內建多國語系)
官方網站:http://filezilla-project.org/
軟體下載:按這裡
軟體簡介:FileZilla支援斷線續傳、多線程同時下載/上傳與FTP Proxy、SFTP與自動維持連線功能(Keep-alive不斷線),並可支援傳輸超過4GB以上的大檔案,可限制連線數量或頻寬使用量,此外還可支援滑鼠直接拖曳檔案上傳、下載,對於一般使用者來說,相當方便。

不花錢買:NetTerm $1350元
免費改用:
PCMan 正體中文版 (TELNET連線軟體) *免費
軟體版本:PCMan 2007 8.2.0.314
官方網站:http://pcman.openfoundry.org/
軟體下載:按這裡
軟體簡介:其實很難相信還有人在買NetTerm,不過我看中信局的報價單裡面的確還有NetTerm這東西,如果你真得要拿來上BBS或做其他網管功能的話,PCMan或其他免費Telnet軟體真的相當多...。

不花錢買:Serv-U $6750元
免費改用:FileZilla Server FTP架站伺服器 *免費
軟體版本:0.9.25
官方網站:http://filezilla-project.org/
軟體下載:按這裡
軟體簡介:FileZilla Server是套免費的FTP架站軟體,軟體運作效率不錯且相當穩定。支援IP過濾、IP綁定、限制連線數、上/下傳頻寬、可自訂壓縮比、支援SSL/TLS加密設定…等,更可針對單一使用者或整個群組做資料夾、檔案的權限限制與IP、流量限制。

不花錢買:FrontPage、Dreaweaver網頁編輯 $19490元
免費改用:
Kompozer 網頁編輯器 *免費
軟體版本:0.7.10
官方網站:http://www.kompozer.net/
軟體下載:按這裡下載中文語系檔
軟體簡介:Kompozer 是個免費的視覺化網頁編輯器,如果你想快速編輯簡單的HTML或動態HTML網頁,可以不用再花錢買FrontPage或Dreaweaver,用免費的 Kompozer即可快快樂樂的做網頁。另外,Kompozer除了支援Windows作業系統之外,還可支援Mac OS X、Linux等作業系統,也支援繁體中文介面,安裝繁體中文語系的方法與Firefox安裝擴充套件的方式一樣。

2011年3月17日 星期四

Multipath Delay Spread

時散參數(Time Dispersion Parameters)
同調頻寬(Coherence Bandwidth)

時散參數(Time Dispersion Parameters)

一般用來描述有多個可解析路徑通道的延遲特性,主要依據以下三個參數:平均過量延遲(Mean Excess Delay)、方均根(Root Mean Square, RMS)延遲擴展(RMS Delay Spread)和過量延遲擴展(Excess Delay Spread)(X dB),這些參數可以從功率延遲概觀求得,其代表意義將分別描述如下。

在有多個可解析路徑的通道中(如(1a)及(1b)所示),通常藉由平均過量延遲τ 和方均根延遲擴展στ 來量化此種通道時散的特性。平均過量延遲的定義如下:


在(4)中,每個路徑的延遲τk皆被視為隨機變數,τk在經過不同權重之後所得到的平均便是τ 。而方均根延遲擴展則是定義如下:


其中


(4)以及(5)中的τk 是之前所定義的過量延遲,都是以第一個可偵測的接收訊號為基準來量測的,也就是說,以第一個到達接收端的訊號為準,將其延遲τ0 設定為0。值得注意的是,平均過量延遲和方均根延遲擴展是從單一個功率延遲概觀得來的,通常為了決定以上所提及參數的範圍,行動通訊業者會在許多地區做量 測,以便提供給行動通訊系統使用。在戶外,方均根延遲擴展的大小通常在微秒(μ s )這個數量級;而在室內,其大小通常在奈秒( ns )這個數量級之間。表1列出了一些經由量測得來的方均根延遲擴展。

此外,功率延遲概觀的最大過量延遲(Maximum Excess Delay)( X dB)指的是,與路徑的最大能量相距X dB以內的所有路徑,找出一個延遲最大的路徑,此路徑與最大能量路徑在時間上所產生的延遲差距,就稱為最大過量延遲。換句話說,最大過量延遲就是τX−τ0,其中τ0為第一個到達接收端訊號的延遲,τX就是與路徑的最大能量相距XdB以內的所有路徑之中,產生最大延遲之路徑的時間延遲量。這裡要注意的是,第一個到達的訊號,其能量不一定為最大,在此只是為了方便,故假設第一個到達的訊號擁有最大能量。而τX有 時亦稱為功率延遲概觀的過量延遲擴展(Excess Delay Spread)。功率延遲概觀的大小通常與系統所設定的雜訊門檻有關,而雜訊門檻是用來區別多重路徑訊號及熱雜訊的,如果雜訊門檻設定過低,雜訊便很容易 超過此門檻而看起來像多重路徑訊號。事實上,τ 、τ2、στ也都和雜訊門檻有關,雜訊門檻設定過低的話,由雜訊引起的誤判將會使得這些參數值變高。


同調頻寬(Coherence Bandwidth)

在上一小節中,介紹了一些與訊號延遲相關的參數,這些參數的值基本上是由環境所決定的,一旦用戶所處的環境是靜止不動的,這些參數的值也就不會隨著時間而 改變。與延遲相關的參數,基本上是環境對訊號在時域上所產生的影響,在此將介紹一個與頻域相關的參數:同調頻寬,這個參數是由方均根延遲擴展所定義而來 的。先由同調頻寬的物理意義來說明這個名詞:所有在同調頻寬Bc 範圍裡面的訊號,其所受到通道的影響是很類似的(相關性很高),也就是說,在同調頻寬內的所有訊號,有大約相等的振幅增益和線性的相位關係。若是任意兩個弦波訊號,其頻譜間隔超過同調頻寬Bc ,它們所受到通道影響的關連性就很低。

接下來要給同調頻寬正式的定義:一般定義同調頻寬的大小有兩種方式,都是以不同頻率之訊號的相關性來決定的。若是要求不同頻率之訊號的相關函式(Correlation Function)必須要大於0.9,則同調頻寬大約是:


如果將同調頻寬的定義,放寬到只要求不同頻率之訊號的相關函式大於0.5,則同調頻寬大約是:


此外,也有人更進一步,把同調頻寬的定義放寬到只要求相關函式大於1/ e ≈ 0.36788。得注意的是,(7)與(8)只是一個粗略的估計,同調頻寬和方均根延遲擴展的確切關係式並不存在,而且同調頻寬的大小,也與系統的調變與 解調機制有關。實際上在設計無線通訊系統時,還是必須針對特定的系統選擇正確的通道模型。

有一點特別值得注意的:方均根延遲擴展是從時域上來觀察通道的特性,同調頻寬則是從頻域上來觀察,兩者之間是成反比的關係,方均根延遲擴展越小(大)時, 同調頻寬越大(小),而這兩個參數基本上都是由環境決定的,如果用戶所處的環境不變,這兩個參數基本上也不會隨著時間而改變;當然,當用戶移動或是環境隨 著時間而變動時,這兩個參數也會隨著時間而改變。

2010年7月31日 星期六

dirve PL2303 in Linux

source: http://ubuntuforums.org/showthread.php?t=190124
Under 6.06 the USB device number corresponds to the USB device number -1. (i.e USB0 = 1st USB port) Therefore if you use dev/ttyUSB0 as a comms port, then you haev to be plugged into the first USB port on your machine.

e.g. I have 4 USB port (as per device manager listing). I plugged my USB serial cable into port 1 (the lowest and first port) and minicom worked. I then plugged it into the 4th port. Minicom failed.

I then added a tty device called USB3. I plugged in th serial cable into port 4 and bingo it work. It is quite reminiscent of the old way windows used to work with comm ports.

Anyway problem resolved for me. Hope this tip helps somebofy else.

I have read your post "upgd breezy -> dapper. now I cannot open ttyUSB0 via MINICOM"

and I have the same problem than you.

If I open "minicom" using ttyS0 then it works
If I open "minicom" using ttyUSB0 then I get "cannot open /dev/ttyUSB0: No such device" even if "ttyUSB0" appears in my /dev list.

Reading your post, you say that plugging your USB serial cable into one of the USB then you are able to make it works. I do not have yet any USB serial cable to connect into the USB and to test what you did, but I am wondering that if "minicom using ttyS0" works without any cable connected into the RS232 interfaz, why "minicom using ttyUSB0 does not work if there is not any cable connected".

I ask this, because I am doing an application where I need to connect two devices into the 2 serial ports, but my laptop has only one, so the second one has to be used through the USB (so I need to buy the cable to convert RS232 into USB).
Before having the cable I have tested this:
open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY|O_NONBLOCK); //works
open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY|O_NONBLOCK); //receiving "open error 2 no such file or directory"

So after that I tried minicom resulting the above of the post.

So my question is: "ttyUSB0" can be only opened when there is something connected on it?
(because with ttyS0 you can open even if there is nothing connected on it)

2010年7月29日 星期四

U-boot 啟動內容及基礎指令使用介紹

來源: welkin的小窩 U-boot 啟動內容及基礎指令使用介紹

1.1 u-boot 啟動內容解譯
U-Boot 1.1.4 (Sep 23 2008 - 10:58:00) //u-boot 本版資訊及編譯時間
U-Boot code: 30700000 -> 3071B11C BSS: -> 3071F5C4 //存放u-boot 資料和程式碼的位址

IRQ Stack: 306daf74
FIQ Stack: 306dbf74 //中斷Stack 位址,u-boot 可不需要使用中斷
RAM Configuration:
Bank #0: 30000000 32 MB //32MB 的SDRAM 位址起始位址為 30000000
Flash: 2 MB //2MB 的Norflash 位址,其實位址為20000000
NAND: 64 MB //64MB 的Nandflash
*** Warning - bad CRC, using default environment //由于是第一次燒寫,flash 中還沒有儲存環境變數,因此使用預設換機變數
In: serial
Out: serial
Err: serial //匯入匯出串列方式
Set the MAC successful! //成功配置網路
Hit any key to stop autoboot: 0 //延時幾秒後自動執行
# //主控台,用戶可匯入指令


1.2 print 指令——檢視u-boot環境變數

由於是第一次燒錄,此時的環境變數為預設值。


1.3 u-boot 環境參數解譯

#print

bootargs= //這個參數將會傳遞給 Linux 作業系統,現在空白,以後詳解
bootcmd=bootm 20000 f0000 //啟動指令,將在啟動延時之後執行位址的指令
bootdelay=5 //啟動延時,建議修改為1
baudrate=115200 //鮑率 115200
ethaddr=00:50:c2:1e:af:fb //網卡的 mac 位址
ipaddr=172.17.22.189 //開發板的 ip 位址
serverip=172.17.22.183 //伺服器(PC 機)的ip 位址
gatewayip=172.17.22.1 //閘道位址(直連可以不填)
netmask=255.255.255.0 //網路遮罩
bootfile="B2-rootfs/usr/B2-zImage.u-boot" //無用,可移除
stdin=serial
stdout=serial
stderr=serial
Environment size: 261/16380 bytes //環境變數容量


1.4 set 指令——設定環境變數

使用方法如下:
如果一個參數帶有多條指令,需要如下設定:
用 print 檢視察看效果:


1.5 save 指令——儲存環境變數

設定完環境變數後需要使用 save 指令來儲存環境變數,這樣開機後就不會環境變數錯誤的查看警告了。


1.6 修改適合 S3C4510 開發板的環境變數

為了方便交流和測試,開發時希望能夠統一 ip 位址,設定如下:

主機:192.168.0.1
開發板:192.168.0.2
虛擬機:192.168.0.3

#save
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors



(兩條指令用"\;"隔開)

set [參數][內容]\;[參數][內容]
--------------------
例如:
#set bootcmd tftp vmlinux.img 30007fc0\; bootm 30007fc0

set [參數] [內容]
--------------------
例如:
#set bootdelay 1

其中 bootargs 和 bootcmd 參數需要額外說明:

(1) bootargs 參數
bootargs 參數是啟動時傳遞給 Linux 作業系統的資訊,其配置敘述為:

set bootargs root=/dev/mtdblock2 console=ttyS0,115200 rootfstype=cramfs mem=32mb

root:/dev/mtdblock2 表示從nand 的第三個割區啟動檔案系統,Linux 啟動后會自動搜索 nand 分割區資訊。
console:表示 Linux 作業系統使用的主控台,我們使用第一個序列埠,因此是ttyS0,後面跟的 115200 表示序列埠使用的鮑率。
rootfstype:表示檔案系統的格式,我們燒錄在 nand 中的檔案系統使用cramfs,所以在這裡要填寫cramfs,否則 linux 會嘗試自動掛載,可能會出錯。
mem:表示 Linux 作業系統的記憶體容量,目前開發板掛載32MB記憶體,因此填32MB。

(2) bootcmd 參數
bootcmd 參數表示開發板開機之後,bootdelay 結束後執行的指令。

上面範例的含義是用 tftp 這條指令,將主機上的vmlinux.img(即Linux 核心)掛載到記憶體的 30007fc0 這個位址,

然後從 30007fc0 啟動核心。(如果將 Linux 核心燒錄到 Nandflash 上,則指令又有不同)


1.7 ping 指令——測試網路指令

功能很簡單,比 pc 上的弱很多,如下:

#ping 192.168.0.1
host 192.168.0.1 is alive

U-boot 初探

來源: welkin的小窩 U-boot的一些指令

來源:大體上跟著 http://www.denx.de/wiki/publish/DULG/DULG-tqm8xxl.html 作一次就 OK 了!!

1. 在安裝 U-boot 之前要先安裝它的 ELDK 套件(全名為 Embedded Linux Development Kits),主要包含了 cross compiler 工具。
除了 cross compiler 之外,ELDK 還包含許多套件。


2. U-boot 的 compile
-----------------------------------------------------------------
2-1. 下載 u-boot-1.20,tar.bz2, 解壓縮
2-2. cd u-boot
2-3. make distclean
2-4. grep -Rl arm9 * (找出 arm9 的 board)
2-5. make netstar_config
2-6. make all
2-7. make ap946es_config
----------------------------------------------------------------
make netstar_config
是針對你要 compile 的目標。(這個 target 可以在 u-boot/Makefile 找到)
你可以把它當成 Linux kernel 的 configuration。

以 board/integratorap/ 裏的 ap946es_config 為例:

1. 決定 include/config.h 以下三個 macro:
#define CONFIG_INTEGRATOR
#define CONFIG_ARCH_INTEGRATOR 1
#define CONFIG_CM946E_S 1
2. 選擇並修改
board/integratorap/u-boot.lds
因為 integrator 支援好幾種 CPU,所以它會呼叫 boards/integratorap/split_by_variant.sh 來針對 arm946es 修改。
u-boot.lds, 就是要它去找 start.o 時,要去找 cpu/arm946es/start.o 等會我們會再探討,start.o 就是 U-boot 的 entry point。
3. 呼叫 u-boot/mkconfig 來設定一些等會 make all 時會用到的參數,
其中以 ARCH, CPU, BOARD, VENDOR, SOC 最重要!
因為它會影響到 cross compiler 的選用 (如果你不只一個 cross compiler),
compile 和 link flag 的設定,以及到哪個目錄去找你要的東西。

在 u-boot 下面,有不少和以上參數有關的目錄和檔案:
u-boot/
ppc_config.mk
i386_config.mk
....
include/
lib_arm/
lib_avr32/
....
cpu/
74xx_7xx/
arm1136/
....
....
這些參數指引 make 到哪些目去抓

make all
會真正 build 出 u-boot.bin,它的 object 最主要由下面幾個 component 組成:
start.o
start16.o resetvec.o
reset.o
routine get from libraries
最後會產生 u-boot.hex 和 u-boot.srec 及 u-boot.bin。

由上可以看出,中間左邊是 i386,右邊是 power pc,還有其它,那是和 CPU 有關的一些 routine。
最主要就是 start.o 和一些其它所用的函式。
其它所有東西都 build 成 library,在 configure 之後,在 link 時從 library 抓進就可以了。

----------------------------------------------------------------
開機流程,以 cpu/arm946es/start.S 為例:

U-boot 的 start_armboot 到 _bss_start,從 Flash 複製到 RAM,然後 setup 好 stack,
然後就到 start_armboot。(start_armboot 在 lib_arm/board.c 中)

因為 stack 已經設好了,所以這段是用 C 寫了。

進入 start_armboot(),一堆 #ifdef / #ifndef CFG_xxxx,表示要用哪些 ap,driver,都是一些 initialization 的 code,

然後最後就進入一個 main_loop() 中!!
----------------------------------------------------------------

1.jpg


開機流程簡圖


其中左上方是 assembly,而從 start_armboot 之後就是 C code。

值得注意的有以下幾點:
1.
因為這個 bootcode 是由 ARM 的 integrator 提供。

這個 bootcode 有一個假設:
它認為在板子或 CPU 架構中,有一塊 RAM 的位址是 hardware boot 時就可以動了。
因此它有一個 copy 到 RAM 的動作。

在 CPU 或 ASIC 內部先包一塊 RAM 在某些 architecture 有,但是有的 ASIC 並沒有。

對於沒有一開機就有可用的 RAM,勢必要修改這段 code。

此外如果在開機階段有做 memory remapping 的 board 而言,有兩種方法
(1) 一開始就 remapping,再 copy U-boot 到 RAM。
(2) copy 到一個不受 remapping 影響的位址。

U-boot 可以改寫成 XIP 嗎?

但是我目前所知,它是要在 RAM 中執行。


2.
在進入 C code 的 start_armboot()之後,它第一件事就是初始化一個稱為 gd 的 global 指標。
(它的實作是十分 architecture dependent 的)。

參考 include/asm-arm/global_data.h

它的宣告是:

register volatile gd_t *gd asm("r8")

是一個放在 register 的指標!!

它將這個指標指到 RAM 的指定位址,然後清為 0

之所以指定它為 register,是要讓它在這個最初階段,可以讓我們任意指定它指到 RAM 的位址初使化它。

這個 global variable 在 u-boot 中用來存放一些最開始初始化時所需要用的參數。(這些動作一定要在 RAM 完成)


3.
第一階段的初始化:藉由一個個執行 init_sequence[] 所指到的函式來完成。

目前有的函式為:
cpu_init
board_init
interrupt_init
env_init
init_baudrate
serial_init
console_init_f
display_banner
dram_init
display_dram_config

其中每個函式都回傳 0 表示正確執行,其中 env_init 是去哪裏取得環境變數,

可以是一個固定的陣列,flash,環境變數的資料,會放在 gd 所指的資料結構之中。

由以上看來,因為每個都是 function pointer,各分別屬於在 configuration 階段會指定的目錄中。

如 CPU, BOARD 所指定的目錄,
換言之,我們只要為這些 function pointer 實作出適合我們板子的內容,就可以把融入 U-boot 之中。


4.
在 init_sequence[] 之後, 我把它稱作是第二階段的 initialization。

看來有點亂,一堆 #ifdef,而且有的和前面似乎有重複或矛盾,想是不同 board 的差異太太的關係。

大體上就是 initialize 更多的 device 或是前面 intialization 的第二階段。

U-boot的一些指令

來源:welkin的小窩 U-boot的一些指令

U-boot的一些指令

Printenv 列印環境變數
--------------------
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes

Setenv 設定新的變數
--------------------
Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes

Saveenv 儲存變數
--------------------
命令將當前定義的所有的變數及其值存入flash中。用來存儲變數及其值的空間只有8k位元組,應不要超過。

Tftp 透過網路下載程式,需要先設定好網路配置
--------------------
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254 (tftp伺服器的位址)

Uboot> tftp 20000000 application.bin (application.bin應位於tftp服務程式的目錄)
下載bin檔案到位址0x20000000處。

Uboot> tftp 32000000 vmlinux
把server(IP=環境變數中設定的serverip)中/tftpdroot/下的vmlinux透過TFTP讀入到物理內存32000000處。

Loadb 透過串口Kermit協議下載二進製數據。
--------------------

Bootm 執行Memory 中的二進製代碼
--------------------
要求二進製代碼為製定格式的。通常為mkimage處理過的二進製檔案。
起動UBOOT TOOLS製作的壓縮LINUX內核, bootm 3200000

Bootp 透過網路啟動,需要提前設定好硬體位址。
--------------------

run 執行設定好的腳本
--------------------
Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit

bootcmd 保留的環境變數,也是一種腳本(如果定義了該變數,在autoboot模式下,將會執行該腳本的內容。)
--------------------

Protect 寫保護操作
--------------------
protect on 1:0-3(就是對第一塊FLASH的0-3扇區進行保護)
protect off 1:0-3取消寫保護

Erase 清除扇區
--------------------
erase: 刪除FLASH的扇區
erase 1:0-2(就是對每一塊FLASH的0-2扇區進行刪除)

對DataFlash的操作
--------------------
U-Boot在引導時如果發現NPCS0和NPCS3上連有DataFlash,就會分發虛擬的位址給它,具體為 ︰
0xC0000000---NPCS0
0xD0000000---NPCS3

Go 執行Memory中的二進製代碼,一個簡單的跳轉到指定位址
--------------------

? 得到所有命令清單
--------------------

help help usb, 列出USB功能的使用說明
--------------------

ping 注︰只能在開發板上去PING別的機器
--------------------

Cp 拷貝一塊Memory到另一塊
--------------------

Cmp 比較兩塊Memory區
--------------------
這些Memory 操作命令後都可加一個後綴表示操作數據的大小,比如cp.b表示按位元組拷貝。

Md 顯示Memory的內容。
--------------------

Mm 修改Memory,位址自動遞增。
--------------------

Nm 修改Memory,位址不自動遞增。
--------------------

Mw 用模型填充Memory
--------------------
mw 32000000 ff 10000(把Memory 0x32000000開始的0x10000位元組設為0xFF)

usb
--------------------
usb start: 起動usb 功能
usb info: 列出設備
usb scan: 掃描usb storage(usb碟)設備

kgo 起動沒有壓縮的linux內核
--------------------
kgo 32000000

fatls 列出DOS FAT檔案系統
--------------------
fatls usb 0列出第一塊U盤中的檔案

fatload 讀入FAT中的一個檔案
--------------------
fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 讀到物理Memory 0x32000000處﹗

flinfo 列出flash的訊息
--------------------

nfs
--------------------
nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS檔案系統)中的NFS檔案系統中的aa.txt 讀入Memory 0x32000000處。

Embedded Linux 技術與概念解析

引言

Embedded Linux技術基於開放源碼的資源,並且已經是當今最重要的嵌入式應 用技術之一。Embedded Linux是燒錄在目標裝置上的系統,1個Embedded Linux系統包含Linux kernel與 root filesystem 2大部分,Embedded Linux系統到底包含哪些組成要素構成,本文將由概念的層面進行解析。

本文

由於目前的目標裝置,都必須嵌入極為複雜的功能,所以嵌入式操作系統(Embedded system)成為嵌入式系統不可或缺的要素。由於嵌入式系統是功能導向的系統,因此必須設計、選擇或購買正確(或適合)的目標裝置,才能開始實作並嵌入嵌入式系統。因此,嵌入式系統技術是以功能、與目標裝置為分類的1種技術。

例如,與PDA相關的目標裝置(即硬件)、與MP3播放器相關的目標裝置、與3G手機相關的目標裝置...等等;使用這些目標裝置所開發的特定功能系統,便是PDA的嵌入式系統、MP3音樂播放的嵌入式系統、3G手機的嵌入式系統。

Embedded Linux其實並不是1個操作系統,而是代表應用Linux系統於Embedded system的名詞。Embedded Linux的技術核心主軸是在研究如何將Linux系統嵌入至嵌入式目標裝置裡。

Embedded Linux是基於Linux系統的特殊應用,當然也要符合眾多標準才行。LSB與FHS標準是重要的2大標準,跟隨標準不但可以提供系統間的兼容性,也可以提供我們1個Linux系統的建構依據。

GNU/Linux的2個標準

由FSG (Free Standards Group) 所主持的 LSB (Linux Standard Base) 項目即是在制定 GNU/Linux 標準。根據LSB標準所發展的GNU/Linux系統,才能提供應用程序最小的可執行環境,並且可在依循LSB標準的Linux distributions上執行無誤。例如,我們可以在符合LSB標準的Red Hat Linux上發展應用程序,只要自行發展的Embedded Linux系統符合LSB標準所訂定的規範,應用程序就可以順利移植到Embedded Linux上執行。

LSB標準提供我們發展Embedded Linux的依據,雖然Embedded Linux系統是最小化的Linux,但因為Embedded Linux是嵌入式系統的軟件平台,所以我們不能任意精簡Linux系統,在精簡的過程中仍要保留最基本的操作系統環境,而LSB的標準正是在制定這些基本的需求。

FHS全名為Filesystem Hierarchy Standard,是定義檔案與目錄標準的文件,FHS的標準,定義了目錄與檔案的擺放位置,而UNIX-like的系統則是根據這個標準,管理整個檔案結構。因此,不管是系統廠商、Linux/UNIX distribution發展者、應用程序作者、套件管理者、系統維護人員都應該要依照FHS的標準來管理UNIX系統的目錄與檔案。

Embedded Linux的特色是大量使用自由軟件、與開放源碼軟件(FOSS- Free & Open Source Softwar)資源,任何你想要的軟件,幾乎都能在網絡上找到自由軟件已經成為Embedded Linux技術的重要支柱。自由軟件資源包山包海,舉凡應用程序、系統工具、網絡工具、鏈接庫、圖形接口、小型瀏覽器、程序發展工具...等等都能找得 到。

Busybox

Busybox是重要的Embedded Linux工具箱,這個工具箱提供基本的UNIX指令、系統程序(daemon)與開機程序(init process)。Busybox用來建造1個基本、最小化且可開機的Linux系統,由於Busybox裡的指令與工具都經過最小化處理,因此已經是目前主要應用在Embedded Linux實作上的開放源碼項目了。

Embedded Linux的組成

圖 Embedded Linux整體架構

Embedded Linux平台除了Linux kernel外,還包含共享鏈接庫(shared library)。shared libraries是Linux kernel的重要支持,並且也是Linux架構裡獨立的1層。在應用程序方面,許多現存的開放源碼項目都可以直接移植到ARM9平台。但這裡所指的移植 是對原始碼進行跨平台編譯(cross compile),並不是BSP(board support package)的移植。

跨平台編譯

因為開放源碼開發工具的特性,在應用程序級別的移植工具上,可以有1套比較系統化的方法,也有相關的工具與環境可以使用,目前最熱門的跨平台編譯環境為 OpenEmbedded。開放源碼軟件採用GNU Autoconf與GNU Automake來撰寫編譯法則(Makefile),因此實務上,要將應用程序移植到ARM9平台,大部分案例只需要做跨平台編譯即可。要瞭解如何將原 始碼移植到ARM9平台,需要學會GNU Autoconf以及GNU Automake的使用。

GNU Autoconf

Autoconf是m4宏的擴充套件,可以用來自動設定軟件套件的原始碼。Autoconf會產生1個協助程序編譯的設定文稿執行檔 (configuration script),以方便編譯原始碼前進行系統檢查與設定,使用GNU Autoconf時,必須安裝GNU m4套件。

GNU Automake

Automake是自動產生Makefile.in的工具,需配合Autoconf使用,以產生可以讓GNU Make自動編譯原始碼的」Makefile」檔案。

GNU Make

GNU Make會根據「Makefile」來自動編譯程序,而編譯完成的程序為執行文件。GNU Make的重要特點,是沒有特定程序語言限制,甚至可以應用在非程序語言編譯的環境中,例如:系統維護工作與套件安裝,因此GNU Make可以說是系統自動化的好工具。

GNU Make根據「Makefile」檔案裡所定義的規則,執行Unix命令,簡單的Makefile規格,可以利用編輯器手動撰寫,但較複雜且與針對不同平 台的設定,則建議採用GNU Autoconf/GNU Automake來產生「Makefile」。當我們能夠產生使用cross toolchain的Makefile時,就可以將套件編譯成ARM9的執行檔。

ARM 平台的選擇與支持

嵌入式裝置的硬件選擇當然沒有所謂的標準,但若是談論到嵌入式Linux的 應用,在平台的選擇上就會有一些考慮。最重要的考慮因素,當然就是處理器對於操作系統的支持,如此一來,沒有MMU(內存管理單元)的ARM7平台,就不 在主要的選擇範圍內。以下列出幾個目前普遍使用的ARM9應用程序處理器(application processor):

在選擇解決方案時,若是決定採用Linux做為嵌入式操作系統,首先當然就是要確定廠商是否提供完整的BSP。不過,由於Linux是由社群所維護髮展,因此,選擇目前Linux kernel內有支持的平台,將會是較好的選擇,這也是為什麼有許多大廠,主動貢獻並提交BSP給kernel.org的原因。

目前在kernel社群比較活躍的ARM9廠商,或是社群主動積極協助維護的SOC平台,像是ATMEL、Samsung與TI OMAP等,這些都是kernel.org的Linux kernel就有支持的處理器,這表示讓Linux支持這些平台的方式也很簡單,就是到kernel.org下載官方的Linux kernel即可。

Crosstool

針對ARM9或是其它平台的開發,最重要的工具就是Cross Toolchain。Cross Toolchain的製作一直是Embedded Linux開發者的夢靨,大多數人選擇由網絡下載現成的開發工具,但經常會遇到缺乏鏈接庫的編譯錯誤。完整的Cross Toolchain包含1套基本的gcc cross compiler以及其它的應用鏈接庫;Cross Toolchain是製作基本gcc cross compiler的工具,透過crosstool即可製作ARM9的基本toolchain。

Root Filesystem概念

Root filesystem的建置,即是在建立1個基本的Linux系統(base system),讓kernel在完成開機後,進入user mode執行使用者程序。Root filesystem的建置主要是以Busybox為主,並加入(移植)客制化的開放源碼(open source)與自由軟件(free software)。

因為嵌入式Linux的root filesystem是依照需求加入套件,與桌面環境的Linux distribution不同,因此都是用從頭打造的方式做起。在建立root filesystem時,鏈接庫相依 (library dependencies) 的議題是相當重要的項目。當root filesystem缺少必要的library時,程序當然無法執行,甚至系統也會無法順利啟動。分析應用程序所需的相依鏈接庫,觀念如下:

(1)先利用Cross Toolchain的objdump指令觀察ELF格式裡的「NEEDED」項目。

(2)必須再檢查這些library是否相依其它library。

1個基本且可開機的root filesystem,也稱做bootstrap root filesystem,1個可用的bootstrap root filesystem只需要包含busybox與libc即可。傳統的Embedded Linux應用,大多是以NFS的方式來測試目標裝置的完整root filesystem(full root filesystem)。以NFS進行Embedded Linux開發測試,主要是針對目標裝置的full root filesystem做立即(right now)的系統執行測試(run-time),免除不斷打包image file、開機的惡夢。這是1種流行很久的Embedded Linux系統測試與開發方式,其概念如下:

(1)將target的完整root filesystem(例如ARM9 root filesystem)建置後,存放於host端的某個目錄下,例如/home/rootfs。

(2)為target製作1個NFS root filesystem,也就是bootstrap root filesystem+ NFS功能,並使用NFS root filesystem將目標裝置開機。

(3)設定host端為NFS server。

(4)以NFS mount方式將host端上的root filesystem目錄mount進來,即可在目標裝置上執行full root filesystem裡的應用程序。

這種方式不但簡單,而且方便,需要的基礎建設如下:

1.目標裝置使用的kernel必須支持NFS。

2.製作bootstrap root filesystem時,需要加入mount指令,並且開啟mount指令的NFS功能。

3.加入NFS functionality至bootstrap root filesystem。

4.設定NFS server。

製作完成的root filesystem必須做打包的動作,將整個root filesystem包裝成1個映像檔(image file)。根據目標裝置的不同,我們可以將映像檔包裝成ROM fs、Compress ROM fs、ext2fs或是compress RAM fs。

ROM file system

ROM file system(romfs)是1種只讀的檔案系統,在Embedded Linux裡的主要應用為製作romfs格式的檔案系統映像文件。我們將root filesystem製作成romfs filesystem的image檔。開機後,整個filesystem僅能讀取。要使用romfs filesystem必須將Linux kernel裡的CONFIG_ROMFS_FS功能選項打開。製作ROM fs映像檔所使用的工具為genromfs。

Compressed ROM file system

Compressed ROM file system(cromfs)即是壓縮過的ROM file system,其製作方式相當簡單,只要使用gzip將ROM file system的映像檔壓縮即可。

製作ext2fs映像檔

製作ext2fs映像檔的方式有2種。1種是使用dd指令產生1個空白的映像檔,接著再將此映像檔以mkfs.ext2指令格式化成ext2的格式。製作 好的空白映像檔再以loopback mount方式掛載到1個目錄下,再將root filesystem整個複製到此目錄下,即可完成ext2fs映像檔的製作。

另外1種建立ext2fs映像檔的方式是使用genext2fs工具,此工具的好處是,當我們需要在root filesystem裡預先建立(pre-built)裝置文件時(device file),只需要編寫1個裝置文件表格,genext2fs工具會在打包映像檔時,自動在root filesystem裡建立裝置文件。

Initial RAM disk(initrd)

RAM disk是存在於內存中的虛擬磁盤,也就是將RAM拿來當成磁盤使用。在Embedded Linux的應用中,我們通常會將ramdisk當成暫存目錄來使用。例如將/dev/ram1附掛到/tmp目錄,以便能讓應用程序存放暫時性檔案。 /dev/ram?為ramdisk的device file。由於整個root filesystem是從真正的儲存裝置讀取並加載至ramdisk,因此有1個重要的特性是對file system所做的任何修改,都不會影響到真正root filesystem的內容。

initrd全名為initialize RAM disk,是1個特殊的RAM disk。bootloader會將initrd載至內存,Linux kernel則可在/dev/ram0找到initrd。initrd會在Linux kernel開機前就加載,initrd正式的用途是用來存放開機時所需要的驅動程序(因root filesystem尚未mount進來)。在Embedded Linux應用上,我們會利用initrd來存放整個檔案系統(root filesystem),也就是將root filesystem製作成ext2或romfs格式(或其它檔案系統)的映像文件,並在開機時由bootloader加載內存,initrd均位於 /dev/ram0。要使用RAM disk與initrd,必須將Linux kernel的CONFIG_BLK_DEV_RAM以及CONFIG_BLK_DEV_INITRD)。

使用initrd做為root filesystem裝置

將initial RAM disk當成root filesystem來使用,是在Embedded Linux應用上是相當常見的技巧,如果我們想將initial RAM disk當成存放root filesystem的裝置來使用,在開機時,只需要配合root=的kernel開機參數即可。

initramfs

Linus本人在Linux 2.6時代所提出的 "initramfs" ,是1種更好的 "root=" 做法。簡單來說,initramfs就是kernel 2.6 的 initrd,initramfs是屬於1種compressed ramfs(ram filesystem)的映像檔。

C鏈接庫

在C鏈接庫方面,除了標準的glibc也被廣泛應用在嵌入式系統領域外,也有一些專門針對嵌入式系統應用所發展的C鏈接庫,像是uClibc以及Diet libc。但是由於現在的ARM9處理器計算效能都很快,平台也多搭載大容量NAND閃存,所以許多實作都直接使用libc來實作root filesystem。

Linux驅動程序

由於嵌入式系統整體來看,除了軟件開發外,也包含硬件客制化,因此驅動程序在嵌入式系統技 術領域中,佔了舉足輕重的地位。學習驅動程序需要確實瞭解硬件的規格與微處理器架構,並且工程師還要能分得清楚哪些東西是接口 (interfacing),也就是與硬件無關的程序(machine-independent);以及哪些是站在第一線做硬件控制的程序 (machine-dependent)。各種軟件硬接口與匯流排也都要精通。

瞭解Linux驅動程序的架構,是進入嵌入式Linux領域的重點功課,因為許多針對ARM9平台的驅動程序都是參考框架、或是針對特定開發板的實作,因此必須瞭解Linux驅動程序的架構,並進行修改,以符合自己的開發板與外圍規格。

Linux驅動程序,採取嚴謹的分層式架構設計(layered architecture),利用分層的架構設計來徹底區分generic device driver(machine independent)與machine dependent driver。

Linux驅動程序透過註冊與回呼的機制來清楚區分每1層的關係。分層架構的實作必須在下層將自己註冊給上層,上層再回呼下層;上層的驅動程序必須提供註冊函數供下層呼叫,下層驅動程序所使用的註冊函數也將決定自己的上層架構。

與user application如何互動,是撰寫驅動程序時所要考慮的重要一環,因此撰寫驅動程序時,要提供什麼功能給應用程序引用,就必須事先定義清楚。 Linux的 generic device driver層已經幫我們把這些功能定義清楚了。Linux驅動程序如何透過I/O port或I/O memory來控制裝置,也就是與芯片組的溝通,方式是使用Linux kernel所提供的I/O函數來存取並控制實體硬件裝置。

Linux驅動程序的裝置文件

Device files是UNIX系統的獨特觀念,在UNIX系統底下我們把外部的周邊裝置均視為1個檔案,並透過此檔案與實體硬件溝通,這樣的檔案就叫做device files或special files。

Device file的major number代表1個特定的裝置,例如major number 1為」null」虛擬裝置,major number定義於kernel文件目錄Documentation/devices.txt。Minor number代表裝置上的子裝置,例如同1個硬盤上的分割區就用不同的major number來代表,但其major number相同。

我們在設計device driver時,會先透過1個「註冊」(register)的動作,將自己註冊到kernel裡,註冊時,我們會指定1個major number參數,以指定此驅動程序所要實作的外圍裝置。當user開啟device file時,kernel便會根據device file的 major number找到對應的驅動程序響應使用者。Minor number則是device driver內部所使用,kernel並不會處理不同的minor number。

Linux 2.6的kobject模型

Linux 2.6在驅動程序的架構方面,加入kobject的概念。kobject以更有系統、組織的方式維護系統裡的driver(集中式管理),但並非改變現有 (kernel 2.4以來)的driver架構。在kobject的模型下,可以看到1個platform driver觀念。所謂「platform driver」就是machine- dependent driver,當驅動程序設計師在kernel 2.6底下實作machine-dependent driver時,就要以platform driver的架構來實作。例如,針對我們的目標裝置進行硬件層的驅動程序撰寫時,就要以platform driver的方式來撰寫,實作上,只是多1個註冊到platform driver層的動作而已。

Flash裝置的支持

針對嵌入式系統經 常使用的閃存(Flash)儲存裝置,Linux kernel支持JFFS2與NFTL 2個專門針對快閃記億體設計的檔案系統。JFFS2(Journaling Flash File System version 2)是專門針對 NOR 型閃存所設計的檔案系統。NFTL(NAND Flash Translation Layer)則是專門針對NAND型閃存設計的檔案系統。

結論

綜合而言,Embedded Linux是1個平台、也是一些工具的集合、也是1個嵌入式軟件的開發環境;實作上,Embedded Linux除了會進行kernel的修改、驅動程序的移植或開發外,也會是系統管理與系統整合的再應用,這是一門集大成的技術,並不只是1個嵌入式操作系統,也不只是1套開發工具。

(本文為Jollen’s Consulting, Inc.技術顧問撰寫http://www.jollen.org/consulting)