?? 移植uclinux到44b0上的過程.txt
字號:
移植UCLINUX到44B0上的過程
電路設(shè)計(jì) www.PCBTech.net 2003-12-24 中國PCB技術(shù)網(wǎng)
我本人對于UCLINUX方面的開發(fā)和應(yīng)用其實(shí)并不熟悉,因?yàn)榭吹诫娮赢a(chǎn)品世界論壇上有很多這方面的討論覺得有點(diǎn)意思,后來就買了塊代博的板子玩玩,然后對此興趣漸濃,后來我覺得不在自己那塊44B0上玩玩UC實(shí)在不甘心,就慢慢摸索著把它移植過去.當(dāng)然碰到了不少的問題,不過現(xiàn)在已經(jīng)在我的板上跑得很好,網(wǎng)絡(luò)也通了,就跟在4510上運(yùn)行差不多.我看看了本論壇上討論4510的UC的貼子還是不少,希望大家也可以在44B0上跑通UC,而且完全可以把4510上運(yùn)行UC的經(jīng)驗(yàn)搬到44B0上來.TPU曾告訴我他以前在這上面跑過MICROWINDOW,這也很吸引人哦,快快學(xué)吧!
在好幾個(gè)壇子上面看到大家對uC的討論熱火朝天,但差不多都是基于4510開發(fā)板的,而基于44B0的好象很少,并且不象4510的那樣成熟和清晰??赡芎?510主要是網(wǎng)絡(luò)應(yīng)用有關(guān)吧,它可以充分利用uC的網(wǎng)絡(luò)功能。如果在44B0上加入uC,也可以體驗(yàn)一下這個(gè)操作系統(tǒng),再加入往卡驅(qū)動(dòng)的話,也能實(shí)現(xiàn)網(wǎng)絡(luò)哦!記得以前在ARM開發(fā)論壇看到一位高人寫過在44B0的uC上加網(wǎng)卡驅(qū)動(dòng)的文章,想做這個(gè)的兄弟可以去找找。
我手頭有4510和44B0的板子各一塊,4510是代博的,上面帶的uC挺好用。于是想在44B0上也跑跑uC,兩周前我調(diào)通了8019后覺得條件差不多了,因?yàn)閡C的IMAGE.RAM是非壓縮的,有1M多,調(diào)試的時(shí)候如果不用到網(wǎng)絡(luò)下載的話會很慢,即使用串口調(diào)到115.2K也要幾分鐘時(shí)間,而且可靠性也較低,所以有網(wǎng)卡芯片是移植的一個(gè)重要條件,當(dāng)然有USB通訊的話也很快,不過我的板那塊壞了,并考慮到以后會用到網(wǎng)絡(luò),還是用8019吧。從我有板開始我就一直找可用于44B0的uC,并下載過TPU兄的源文件,上次看到TPU兄的留言可幫忙移植就馬上留言聯(lián)系,后來通過一封MAIL好象就沒消息了,只好自己摸索著做做,所以我的移植過程可能存在很多不對的地方,大家一起參考修正.
開始我想跑跑TPU的ZIMAGE,這是一個(gè)壓縮后的文件,運(yùn)行時(shí)需要自解壓,查到它的起始運(yùn)行地址是0XC300000,KENERL運(yùn)行地址是0XC008000,用自己的BIOS將數(shù)據(jù)DOWN到設(shè)定地,再RUN,運(yùn)行出現(xiàn)結(jié)果了,開始是些亂碼,調(diào)了一下串口速率,在38400,顯示UCOMPRESS KERNEL...不過到START KERNEL后,再沒下文了,于是用AXD反匯編調(diào)試,發(fā)現(xiàn)是因?yàn)檫M(jìn)入KERNEL后沒找到PROCESSER ID而停掉,可能是要在BIOS中傳遞過去。后來想到一個(gè)辦法,把我現(xiàn)在在4510板上跑的uC改動(dòng)后移植到44B0上,在那一版上大家對uC的應(yīng)用都做得比較熟了,編起來也比較方便。開始有這個(gè)想法沒貼出來,因?yàn)槭紫鹊抿?yàn)證可行性,就先做做實(shí)驗(yàn)啦。
首先準(zhǔn)備一分uC的源碼,我用的是uCLinux-dist20030522版,本來是在4510上跑的,板的型號叫SNDS100,帶上代博的PATCH,以前的版本應(yīng)該也可以,我沒有試。再準(zhǔn)備一個(gè)BIOS,可以下載編譯好的程序進(jìn)行調(diào)試,可以看看我以前貼的那個(gè)。還需要一個(gè)串口調(diào)試工具,用來和BIOS和uC做人機(jī)交互,我用的是SSCOM3.2,在LINUX下也有相應(yīng)程序。我的移植過程是從4510開發(fā)板上開始的,所以需要看本文的人對4510有一定了解。在這我只列出修改的地方,如果你有什么不明之處可以和我討論。uC編譯后在IMAGES目錄生成三個(gè)文件,一個(gè)是IMAGE.RAM,這是帶自啟動(dòng)的壓縮版,可燒入FLASH運(yùn)行,一個(gè)是IMAGE.RAM,這是沒壓縮的,須通過下載后直接運(yùn)行.
首先,拿我的4510板開工做實(shí)驗(yàn),嘗試修改內(nèi)核的一些參數(shù)。
一、
修改波特率
1、INCLUDE/ASM-ARMNOMMU/ARCH-SNDS100/HARDWARE.H中將
#define DEBUG_UBRDIV_REG_VAL (0x500) 改為
#define DEBUG_UBRDIV_REG_VAL (0x1a0)
此為啟動(dòng)期間輸出信息所用串口波特率分頻系數(shù)
2、DRIVERS/CHAR/SERIAL-SAMSUNG.C中將serial_console_setup函數(shù)中
int baud = 19200 改為 57600
此為CONSOLE STARTUP時(shí)設(shè)置的波特率,此時(shí)用的是這個(gè)文件,到后面移植到44B0X時(shí)換為另一個(gè)文件。
3、VENDERS/SAMSUNG/4510B/CONFIG-ARCH
19200->57600 不知有用否,為防止出錯(cuò)先改了。
編譯運(yùn)行成功。
二、
修改運(yùn)行地址
1、ARCH/ARMNOMMU/MAKEFILE
TEXTADDR 決定KERNEL起始運(yùn)行地址,即IMAGE.RAM應(yīng)DOWN到的位置
2、ARCH/ARMNOMMU/BOOT/MAKEFILE
ZREALADDR 決定KERNEL解壓后數(shù)據(jù)輸出的地址,同1
ZTEXTADDR 帶BOOTLOADER的壓縮內(nèi)核文件燒入FLASH的起始地址,即從哪個(gè)位置開始執(zhí)行
BOOTLOADER,若啟動(dòng)時(shí)直接執(zhí)行,將其設(shè)為0,若自帶BIOS可以跳到你想要的地址,可改為你要的位置。
我把KERNEL運(yùn)行地址改為0X00208000,編譯運(yùn)行成功。
三、(重點(diǎn))
修改uC使其在不REMAP的情況下在4510上運(yùn)行。因?yàn)?4B0與4510第一點(diǎn)區(qū)別就是4510可REMAP而44B0不行。在這點(diǎn)上遇到點(diǎn)問題花了我三天時(shí)間才搞掂,其實(shí)是在個(gè)很簡單的地方設(shè)置一下。
1、修改存儲器參數(shù)
ARCH/ARMNOMMU/CONFIG.IN里面對應(yīng)的SNDS100下的參數(shù):
DRAM_BASE,DRAM_SIZE,F(xiàn)LASH_MEM_BASE,F(xiàn)LASH_SIZE
針對不同的開發(fā)板,這些參數(shù)也可能不同,我的4510板原值分別為
0X00000000,0X01000000,0X01000000,0X00200000
這些參數(shù)意思一看就明,我將它們分別改為
0X01000000,0X01000000,0X00000000,0X00200000
即不對內(nèi)存分配REMAP。
2、把第二步中的KERNEL運(yùn)行地址改為0X01008000。
3、修改VECTORS_BASE的宏定義,原值在INCLUDE/ARMNOMMU/PROC-ARMV/SYSTEM.H中定義為0,意思是KERNEL將向量表COPY到DRAM中的地址,現(xiàn)改DRAM_BASE即0X01000000,因?yàn)閷?shí)際向量還是在0地址即FLASH起始地址,所以在FLASH中向量處做個(gè)跳轉(zhuǎn):
0: LDR PC,=0X01000000
4: LDR PC,=0X01000004
.........
我的BIOS有下載和運(yùn)行程序的功能,因此沒有改地址0的指令。這樣發(fā)生中斷時(shí)先到實(shí)際地址0X18,再跳到UCLINUX的中斷向量地址0X01000018。
4、修改ARCH/ARMNOMMU/MACH-SNDS100/ARCH.C,
在 MAINTAINER("XXX") 后加上
BOOT_MEM(DRAM_BASE, 0x00000000, 0x00000000)
5、修改ARCH/ARMNOMMU/INIT.C,在reserve_node_zero函數(shù)里將
if (machine_is_integrator() || machine_is_snds100() ||
machine_is_evS3C4530HEI() )
reserve_bootmem_node(pgdat, 0, __pa(&_stext));
改為
if (machine_is_integrator() || machine_is_snds100() ||
machine_is_evS3C4530HEI() )
reserve_bootmem_node(pgdat, DRAM_BASE, __pa(&_stext)-DRAM_BASE);
6、make menuconfig時(shí)不要選擇自己手動(dòng)設(shè)置存儲器參數(shù)?。ê芎唵蔚囊稽c(diǎn),搞了我好久)
上訴過程完成后,可以證明這版uC是可以移植到44B0X上的,之后開始移植過程。先做些基本修改,把上面第二步中的KERNEL運(yùn)行地址改為0X0C008000,這是44B0X中的DRAM地址。把上面第三步中的1中DRAM_BASE, DRAM_SIZE 分別改為0X0C000000, 0X00800000, 另外把FLASH中0-0X1C中的指令改跳轉(zhuǎn)到0X0C000000-0X0C00001C。
基礎(chǔ)做好了,之后看看在原版中對應(yīng)于4510的硬件操作包括些什么。第一個(gè)是網(wǎng)絡(luò)部分,我們可以先把它去掉,以后在加自己的驅(qū)動(dòng),我在DRIVERS/NET/MAKEFILE里面屏蔽了
obj-$(CONFIG_ETH_S3C4510) += s3c4510.o這一行,使網(wǎng)絡(luò)驅(qū)動(dòng)不被編譯,也不知道有什么相關(guān)的遺留問題,不過我把VENDORS/SAMSUNG/4510B/下面inittab和rc兩個(gè)文件中啟動(dòng)網(wǎng)絡(luò)的命令也關(guān)了。剩下的和硬件相關(guān)的操作還有三個(gè),一是中斷處理,二是TIMER,三是串口控制臺,另外在編譯IMAGE.ROM時(shí)用到ARCH/ARMNOMMU/BOOT/COMPRESSED/HEAD.S文件,原文件因是啟動(dòng)版包含了相關(guān)的硬件初始化,因?yàn)橄炔挥每梢远计帘蔚簟?下面仔細(xì)對付先前提的三個(gè)問題。和4510相關(guān)的寄存器定義都在INCLUDE/ASM-ARMNOMMU/ARCH-SNDS100/HARDWARE.H中,同時(shí)在這個(gè)目錄下還包含了一些需要修改的頭文件,在后面說明。在HARDWARE.H中根據(jù)寄存器的用途和地址作出修改,我并沒改它們的名字,只是先改成44B0中相對的寄存器所在的地址,另外還有些修改我不能盡述,可以把文件貼出來。其實(shí)對三個(gè)問題的解決應(yīng)該是同時(shí)搞好才行,缺了哪個(gè)都不能看到正常結(jié)果輸出,但我只能一一說明。
調(diào)試中我遇到不少問題,但不能都寫出來,就講必須作的吧。第一要保證中斷可以開了,在
ARCH/ARMNOMMU/MACH-SNDS100/IRQ.C里加上中斷初始化,設(shè)置模式及預(yù)清一次所有中斷,使能全局中斷。
時(shí)鐘的初始化和中斷使能在INCLUDE/ASM-ARMNOMMU/ARCH-SNDS100/TIME.H中設(shè)置,頻率在TIMEX.中,我用的是TIMER5。
對于中斷,開始的處理過程和在4510上面不REMAP的情況差不多,差別就在于獲取中斷號,可以看看源文件ARCH/ARMNOMMU/KERNEL/ENTRY-ARMV.S里面有個(gè)get_irqnr_and_base的宏定義,我先自己改了個(gè),后來試了在calibrate_delay中TIMER中斷老有問題,我也沒再仔細(xì)研究,把TPU的相關(guān)代碼直接COPY來用,呵呵,好了!顯示出我的BogoMIPS了,不過顯示值是我實(shí)際運(yùn)行頻率的一半,我想是因?yàn)槲业腄RAM數(shù)據(jù)總線只有16位的原因吧。后來運(yùn)行老是會死掉,要不就顯示一些錯(cuò)誤信息停掉,要不就瘋狂打出亂七八糟的數(shù)據(jù)來,反正顯示不到SH這個(gè)SHELL下,讓我一直懷疑這樣做是不是有問題。后來才用降頻法,我原來用50M,和4510板一樣,后來改到20M才算是正常了,(好在我的BIOS可以交互式改頻
,不用退到98下修改再燒入),這個(gè)我估計(jì)和硬件穩(wěn)定性有關(guān),也可能你的可跑高頻。不過正常的時(shí)候是停住了,沒錯(cuò)誤信息也沒瘋狂打印,我敲了下鍵盤,之后就顯示出一堆數(shù)據(jù),進(jìn)入了SH,再按鍵沒有輸出,奇怪!這是串口控制臺的問題了。
再講講串口控制臺,我開始把4510中相對的寄存器換到44B0中相應(yīng)的位置,并對狀態(tài)寄存器做了相應(yīng)的轉(zhuǎn)換,因?yàn)?510的是一個(gè)寄存器而44B0是兩個(gè),我把DRIVERS/CHAR/SERIAL-SAMSUNG.C中相應(yīng)讀狀態(tài)的語句都加了加讀一個(gè)寄存器內(nèi)容的操作,以為做得可以了,實(shí)際還是出了些問題,先是忘了改注冊發(fā)送中斷的部分,所以出現(xiàn)前面的問題,改過后能輸出我按的鍵了,不過是按鍵有時(shí)沒顯示有時(shí)顯示兩三個(gè)字符,但輸入命令后居然可以執(zhí)行。我想再仔細(xì)研究一下源碼吧,可覺得這是一項(xiàng)很艱苦的工作,我對LINUX并不熟,SEIRAL文件有一百多K四千多行,再加上相關(guān)部分各種結(jié)構(gòu)和控制臺、中斷等等,不是能短期內(nèi)完成的。后來還是TPU兄的源碼幫了忙,我看了那里面使用串口控制臺的部分,有個(gè)SERIAL-CORE.C和一個(gè)S3C44B0.C文件,前者應(yīng)該是個(gè)標(biāo)準(zhǔn)文件,后者比較小,包括控制臺的一些標(biāo)準(zhǔn)操作,里面調(diào)用前者的一些函數(shù)。摸索一番后把它們COPY到CHAR目錄下,作了一些修改,并在MAKEFILE里面去掉SERIAL-SAMSUNG,加上后面兩個(gè),編譯-出錯(cuò)-修改-編譯......,最后搞掂,懷著忐忑不安的心情把IMAGE.RAM下到板上RUN,呵呵,一用就好。運(yùn)行自己以前在4510下編了個(gè)最簡單的用戶程序輸出“Hello,uCLinux”(我的LINUX編程水平僅限于此)也成功了!
通過上述總結(jié),大家應(yīng)該可以自己動(dòng)手做做了,之后就測試其是否可以正常運(yùn)轉(zhuǎn)了,如果有什么缺陷漏洞的話我想應(yīng)都可解決,希望高手們可以幫忙修改。這一招可叫做借殼上市,如果成功的話可以在uC編譯增加一項(xiàng)44B0的選項(xiàng)以為其正名。
把我的步驟總結(jié)一下,文件位置就不說了
1.修改運(yùn)行地址和存儲器參數(shù),包括兩個(gè)MAKEFILE和一個(gè)CONFIG.IN,再 make menuconfig不選手動(dòng)輸入存儲器參數(shù).
2.改ARCH.C(加BOOT_MEM), 改IRQ.C(改中斷初始化,并加一句 INTCON = 5),改SYSTEM.H(VECTORS_BASE),改INIT.C(reserve_node_zero),改你的FLASH向量處指令
3.改HARDWRE.H,TIME.H,TIMEX.H,IRQS.H
4.改網(wǎng)絡(luò)驅(qū)動(dòng)中的MAKEFILE, 改字符驅(qū)動(dòng)中的MAKEFILE,加入SERIAL-CORE.C H, S3C44B0.C H
5.改ENTRY-ARMV.S, HEAD.S
記住在你的BIOS中設(shè)好一些外圍參數(shù),或者用壓縮內(nèi)核時(shí)在HEAD.S中初始化
從我移植的經(jīng)歷來看,把UC轉(zhuǎn)到一個(gè)類似的核上去并不是一件很艱深的工作,當(dāng)你熟悉之后就會找到訣竅很快搞掂.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -