2011年4月20日 星期三

[探索頻道 無限大工程]個人運輸莢艙Personal Pods

華盛頓特區是所有人的交通夢魘。通勤族每年困在車陣中的時間長達1億5千萬個小時,浪費的燃料與時間成本估計多達25億美元。但城市規劃單位卻束手無策。 巴士只會增加污染,讓交通更加壅塞。華盛頓特區的地鐵系統負載量過大,但擴建速度卻趕不上成長需求。但個人運輸莢艙卻帶來了解決問題的契機。過去半世紀以 來,運輸工程師認為這種高速、從不間斷的自行驅動運輸系統將為擁擠的交通帶來希望的曙光。自動化的個人運輸莢艙系統將改寫華盛頓特區的交通規則,也將成為 世界各地的運輸系統新典範。

links:
dicovery video:
[探索頻道]智能個人運輸莢艙

Personal Pods
official website
ULTra (rapid transit) - Wikipedia, the free encyclopedia

kiva robot
official website
Kiva Systems - Wikipedia, the free encyclopedia

2011年3月30日 星期三

免費軟體(64-bit)

光碟燒錄

虛擬光碟

壓縮工具
網路傳輸

防毒軟體&防火牆
  • 軟體名稱:Avira AntiVir Personal
  • 軟體性質:免費
  • 軟體版本:32-bit & 64-bit
  • 官方網站:www.avira.com
  • 軟體下載:按這裡

其他portable軟體(http://portableapps.com/)

免費軟體

重灌狂人
用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 的第二階段。