亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1095 | 回復(fù): 0
打印 上一主題 下一主題

u-boot for s3c44b0 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-10-19 17:05 |只看該作者 |倒序?yàn)g覽

               
                               
                                               
                                                               


from http://www.cnitblog.com/luofuchong/archive/2007/01/10/21726.aspx




1)
                                               
                                在網(wǎng)上下載一個(gè)
                                u-boot
                                源代碼,我用的是
                               
                                                1.1.2
                                版本的,最新的應(yīng)該是
                                1.1.4的吧,其實(shí)差不多,那就像我那樣下載一個(gè)
                                1.1.2
                                版本的吧。把源文件解壓,這個(gè)應(yīng)該不用說了吧,學(xué)過
                                linux
                                的人應(yīng)該會(huì),不會(huì)的話我想你繼續(xù)做下去也困難,那就先裝個(gè)linux
                                用下吧(我用的是
                                RedHat
                                的,哦對了,編譯程序是需要
                                gcc
                                編譯器的,所以安裝方式一定要選擇工作站哦
                                ^_^
                                )。好了,解壓后你發(fā)現(xiàn)在
                                u-boot.1.1.2
                                目錄下有
                                Makefile
                                這個(gè)文件吧?讓我們看看它里面的內(nèi)容,最簡單的方法就是
                                vi Makefile
                                了。我們要看的是它選擇的是哪一個(gè)交叉編譯器?梢钥吹竭@一項(xiàng):
                                               
                                               
                               
                               
                               
                               
                               
                               
               
               
                                ifeq ($(ARCH),arm)
               
               
                                CROSS_COMPILE = arm-linux-
               
               
                                看到吧,也就是說這里所用的交叉編譯器是
                                arm-linux-gcc
                                了,(
                                u-boot
                                默認(rèn)是用這個(gè)的,也有用
                                arm-elf-gcc
                                的,網(wǎng)上有個(gè)工具包arm-elf-tools-20030314.sh,
                                我試過用它來編譯,沒有問題,順便提一下,arm-elf-gcc
                                是用來編譯
                                uClinux
                                內(nèi)核的工具來的)那你就下載一個(gè)arm-linux-
                                的交叉編譯器吧,我是在網(wǎng)上下載
                                cross-2.95.3.tar.bz2
                                這個(gè)文件,然后解壓得到
                                2.95.3
                                版本的交叉編譯工具的,具體設(shè)置如下(參考網(wǎng)上資料):
                                               
                                               
                               
                               
                               
                               
                               
               
               
                               
                                                 
                               
               
               
                               
                                                2
                               
                                                )在宿主機(jī)上建立
                                                arm-linux-gcc
                               
                                                交叉編譯環(huán)境
                                               
                                                               
                                                               
                                               
                               
                               
                               
               
               
                                在
                                RedHat Linux
                                系統(tǒng)下以
                                root
                                用戶登錄,
                               
                                               
                                將
                                cross-2.95.3.tar.bz2
                                文件復(fù)制到
                                /
                                目錄下,
                               
                                               
                                安裝:
                               
                                               
# tar jxvf cross-2.95.3.tar.bz2
這個(gè)命令會(huì)在你的
                                /usr/local/arm/2.95.3
                                目錄下安裝
                                 arm-linux-gcc 交叉編譯程序,
                               
                                               
                                然后在
                                PATH
                                變量中添加一項(xiàng):
                                /usr/local/arm/2.95.3/bin.
[root@localhost root]# export ATH=/usr/local/arm/2.95.3/bin:$PATH
                               
                               
                               
                               
                               
               
               
                                或
                               
                                               
                                把
                                PATH=/usr/local/arm/2.95.3/bin:$PATH
                                添加到
                                /ETC/bash_profile文件中
                               
                               
               
               
                                或者
                               
                                               
                                在
                                /etc/bashrc
                                文件中添加一項(xiàng)
                                :
export PATH=/usr/local/arm/2.95.3/bin:$PATH
                               
               
               
                                測試:
                               
                                               
                                把終端關(guān)閉,重新打開后執(zhí)行如下命令:
                               
               
               
                                # arm-linux-gcc –v
               
               
                                好了,建立好交叉編譯環(huán)境后可以試著編譯
                                u-boot
                                了
               
               
                               
                                                 
                               
               
               
                               
                                                這里提幾個(gè)注意點(diǎn):
                                               
                                                               
                                                               
                                               
                               
               
               
                                1.
                                不可用
                                winRAR
                                解壓
                                u-boot-1.1.2.tar.bz2
                                或
                                u-boot-1.1.2.tar.gz這種文件(就個(gè)可能新手會(huì)犯,一般熟悉
                                linux
                                命令的人應(yīng)該都不會(huì)這樣做吧,在此還是要提一下)
                                               
                                               
                               
                               
                               
               
               
                                2.
                                可能下載的文件有一些中間文件會(huì)阻礙編譯的運(yùn)行,所以在編譯前最好來個(gè)徹底清除,在
                                u-boot.1.1.2
                                目錄下運(yùn)行命令:
                                make distclean (其實(shí)這個(gè)命令在Makefile
                                文件下就有)我當(dāng)時(shí)為這個(gè)問題郁悶了很久,希望你們不會(huì)像我這樣
                                ^_^
                                )
                                ;
                               
                               
               
               
                                3
                                ,有些人為了方便想在
                                cygwin
                                下編譯,但是經(jīng)常在網(wǎng)上看到在這個(gè)虛擬平臺(tái)下編譯有很多的問題,要配置的東西也多,而且好像我用過那個(gè)
                                vi
                                沒有
                                linux
                                環(huán)境下的好用,所以最好還是不要用這個(gè)軟件了吧,如果你真的離不開
                                windows
                                的話可以像我這樣裝個(gè)虛擬機(jī),在虛擬機(jī)下再裝
                                linux
                                的系統(tǒng),具體參考這個(gè)網(wǎng)站):
                                               
http://fedora.linuxsir.org/doc/vmware/
                                               
                                               
                               
                               
               
               
                               
                                               
                                                                3
                                               
                                               
                                                                )好了,現(xiàn)在開始測試你的交叉編譯器搞好沒有。在u-boot.1.1.2目錄下執(zhí)行如下命令:
                                               
                               
               
               
                               
                                               
                                                                1)
                                                                     
                                               
                               
                               
                                                Make distclean (
                                                再次強(qiáng)調(diào))
                               
               
               
                               
                                               
                                                                2)
                                                                     
                                               
                               
                               
                                                Make B2_config(
                                                隨便再個(gè)現(xiàn)成的試試^_^)
                               
               
               
                               
                                               
                                                                3)
                                                                     
                                               
                               
                               
                                                Make (
                                                沒錯(cuò)的話應(yīng)該會(huì)生成u-boot.bin文件,發(fā)生錯(cuò)誤的話也不怕,只要細(xì)心看一下哪里錯(cuò)就行了,gcc碰到錯(cuò)誤后會(huì)退出編譯,所以可以一個(gè)個(gè)錯(cuò)誤來改,一般的問題都是沒找到編譯器(可能你沒裝或者裝的不對,例如人家用的是arm-linux-而你裝的是arm-elf-,如果你裝了的話看看你的環(huán)境變量設(shè)好了沒有,前面有講,如果不關(guān)編譯器的事的話那就再看看,一般是文件的后綴不對,有些文件后綴是大寫的,例如start.S但是如果你的是start.s小寫的話那當(dāng)然找不到(解決方法很,把它改成大寫就行了)。細(xì)心看吧,不用怕,它都有注明路徑,很容易可以找到的))
                               
               
               
                               
                                               
                                                                如果以上步驟都無誤的話那么恭喜你,你的交叉編譯環(huán)境可以用來編譯你的u-boot源代碼了,可以開始以下階段。
                                               
                               
               
               
                               
                                                3.
                               
                                                移植
                               
                                                :
                                               
                                                               
                                                               
                                               
                               
                               
                               
               
               
                                說時(shí)遲那時(shí)快,現(xiàn)在開始移植工作(以下是我一步步重新做一遍,力求說得詳細(xì)點(diǎn),感謝我吧^_^)
               
               
                                我以B2板子的程序做為模板來做.
#cd u-boot-1.1.2
               
               
                                #cd board
#cp -R dave myboard (
                                這是我取的板子名字,可以換上你的,但是后面的也要跟著來換哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (
                                自己取個(gè)板子名
                                )
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改
                                myboards3c44b0
                                里面的
                                Makefile, 把
                                B2
                                改成
                                myboards3c44b0
                                ,編譯時(shí)如果報(bào)的其它類似找不到
                                B2
                                的錯(cuò)誤也是把相應(yīng)的
                                B2
                                改成
                                myboards3c44b0
                                來處理。
                               
                               
                               
               
               
                               
                                                 
                               
               
               
                                1
                                )其中的
                                myboards3c44b0.c
                                文件是板的初始化代碼,看一下就知道,根據(jù)你的板上自帶的
                                44binit.s
                                來修改吧。
                                memsetup.S
                                文件主要是存儲(chǔ)器的初始化設(shè)置,其實(shí)也是44binit.s
                                里面的一部分。
                               
               
               
                                2
                                )其實(shí)
                                board
                                這里要修改的不多,先跳過
                                flash
                                部分吧,我們來看一下
                                cpu
                                設(shè)置部分吧。
               
               
                                u-boot-1.1.2
                                里面已經(jīng)加入了對
                                s3c44b0
                                的支持,讓我們來看一下
                                cpu/s3c44b0
                                里面的部分吧。
               
               
                                看到
                                start.S
                                這個(gè)文件了嗎?要修改的其實(shí)并不多,按照你的板設(shè)置一下中斷跳轉(zhuǎn)矢量就行了,或者上網(wǎng)查一下吧,應(yīng)該很容易看明的。其中
                                cpu.c
                                這個(gè)文件簡直不用修改,再來看一下
                                serial.c這個(gè)文件吧,改一下波特率的設(shè)置就行,就是你用多少
                                M
                                的
                                CPU
                                頻率的話對應(yīng)的波特率參數(shù)設(shè)置問題,其實(shí)
                                B2
                                已經(jīng)做得不錯(cuò)的了,很多子程序都不用自己寫的了
                                ^_^
                                ,在我的板上是這樣設(shè)置的
                                ,參考一下吧
                                :
                               
                               
               
               
                                #if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的這些
                                66
                                改成
                                60
                                ,原因,我的實(shí)驗(yàn)板上用的頻率是
                                60
                                (
                                44B0
                                最高頻率為
                               
                                                64M
                                )。然后其它分頻系數(shù),寄存器初始化設(shè)置,可以參考一下
                                44blib.c
                                ,在這里我給出我的設(shè)置出來吧,可以參考一下。
                               
                               
               
               
                               
                                                 
                               
               
               
                                case 115200:
               
               
                                #if CONFIG_S3C44B0_CLOCK_SPEED==60
               
               
                                divisor = 32;
               
               
                               
                                                 
                               
               
               
                                UFCON0 = 0x0;
               
               
                               
                                                       ULCON0 = 0x03;
               
               
                               
                                                       UCON0 = 0x245;
               
               
                               
                                                       UBRDIV0 = divisor;
               
               
                               
                                                 
                               
               
               
                                我在這方面算術(shù)不好,所以都是參考人家的。
               
               
                               
                                                 
                               
               
               
                                3
                                )好,再加上個(gè)頭文件:
               
               
                                cd u-boot-1.1.2/include/configs
               
               
                                cp B2.h myboards3c44b0.h
               
               
                                這個(gè)頭文件其實(shí)要改的地方還挺多的,我等下再說怎樣修改。先回到
                                u-boot.1.1.2
                                目錄,
               
               
                               
                                                 
                               
               
               
                                4
                                )在
                                Makefile
                                里面加上這部分,不會(huì)的話就模仿
                                B2
                                來寫吧
                                ^_^
               
               
                                在
                                B2
                                的這部分文件
               
               
                                B2_config      :      unconfig
               
               
                               
                                                       @./mkconfig $(@:_config=) arm s3c44b0 B2 dave
               
               
                                后面加上這部分:
               
               
                                myboards3c44b0_config       :      unconfig
               
               
                               
                                                       @./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
               
               
                               
                                               
                                                                 
                                               
                               
               
               
                               
                                                切記在
                                                @./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
                               
                                                前面的是
                                                Tab
                               
                                                來的,萬萬不能用空格代替,因?yàn)樗强窟@個(gè)來識(shí)別命令的!
                                               
                                                               
                                                               
                                               
                               
                               
                               
               
               
                               
                                                    
                               
               
               
                                5
                                )好,現(xiàn)在可以在
                                u-boot-1.1.2
                                目錄下執(zhí)行如下命令:
               
               
                                Make distclean
                                (還是用這個(gè)吧,比較徹底)
               
               
                                Make myboards3c44b0_config
               
               
                                Make
               
               
                                看看有沒有錯(cuò),有錯(cuò)的話按著提示來改,如果沒錯(cuò)的話應(yīng)該就能生成
                                u-boot.bin
                                這個(gè)文件,現(xiàn)在還不能用哦,因?yàn)檫@幾是
                                B2
                                的一個(gè)仿制品而已(注:在我的機(jī)上到這一步可沒有報(bào)錯(cuò)哦,你一步步按著來做的話應(yīng)該也不會(huì)有什么錯(cuò)誤吧
                                ^_^
                                )。
               
               
                               
                                                 
                               
               
               
                               
                                                 
                               
               
               
                                6
                                )好,現(xiàn)在繼續(xù)修改
                                u-boot-1.1.2/include/configs/myboards3c44b0.h
                                這個(gè)文件。
               
               
                                #define CONFIG_INIT_CRITICAL     1         這個(gè)在
                                cpu/s3c44b0/start.S里面用到,如果你的
                                u-boot
                                程序不是在
                                sdram
                                中調(diào)試而是固化到
                                flash
                                中運(yùn)行的話,這個(gè)必不可少。
                               
                               
               
               
                                找到
                                 #define CONFIG_B2          1        
                                把
                                B2
                                改成
                                myboards3c44b0
                                吧(不然就不會(huì)編譯你的板了)
               
               
                                找到
                                 #define CONFIG_S3C44B0_CLOCK_SPEED   75   
                                你的
                                44b0x
                                應(yīng)該沒有
                                75M吧
                                我的是改成
                                60
                                的
                               
               
               
                                找到
                                Size of malloc() pool
                                這部分設(shè)置,改成這樣吧,反正我是照著人家來做的,你自己研究下吧
                                ^_^
                                。
               
               
                               
                                                 
                               
               
               
                                #define CFG_MONITOR_LEN            (256 * 1024)   /* Reserve 256 kB for Monitor      */
               
               
                                #define CFG_ENV_SIZE                 (64*1024)        /* 1024 bytes may be used for env vars*/
               
               
                                #define CFG_MALLOC_LEN              (CFG_ENV_SIZE + 128*1024 )
               
               
                                #define CFG_GBL_DATA_SIZE    128  /* size in bytes reserved for initial data */
               
               
                                #define CFG_ENV_IS_IN_FLASH         1  這個(gè)必不可少,如果你想把你的參數(shù)保存到flash
                                的話(有些板是保存到
                                EEPRAM
                                中去的,但是
                                s3c44b0
                                的話還是保存到
                                flash
                                吧)
                               
                               
               
               
                                #define CFG_ENV_ADDR    (PHYS_FLASH_1+0x40000)  這個(gè)就是你的參數(shù)保存在
                                flash里的起始地址了
                               
                               
               
               
                                #define CFG_ENV_OFFSET0x40000      
                                這個(gè)我后來看它源程序發(fā)現(xiàn)如果你上一步?jīng)]有設(shè)置它的起始地址的話就會(huì)用它來作默認(rèn)地址的了
               
               
                                #define CONFIG_AUTO_COMPLETE
               
               
                               
                                                 
                               
               
               
                                其它地方?jīng)]有深究哦,有些好像不要也行,你就試試吧。
               
               
                               
                                                 
                               
               
               
                                找到
                                Hardware drivers
                                部分,這應(yīng)該是網(wǎng)絡(luò)芯片設(shè)置吧,參考一下這個(gè)吧(要看芯片的):
               
               
                                #define CONFIG_DRIVER_RTL8019        這個(gè)就要看你的板上用的是什么網(wǎng)卡了(這個(gè)是臺(tái)灣出的,有
                               
                                                10M
                                )
                               
                               
               
               
                                #define RTL8019_BASE        0x06000000   
                                這個(gè)是網(wǎng)卡相就寄存器的起始地址
               
               
                                以下部分我試過不要也行,你試下吧
               
               
                                #define RTL8019_BUS32             0
               
               
                                #define CONFIG_SMC_USE_16_BIT
               
               
                                #undef  CONFIG_SHOW_ACTIVITY
               
               
                                #define CONFIG_NET_RETRY_COUNT           10       應(yīng)該是重試的次數(shù)吧
                               
               
               
                               
                                                 
                               
               
               
                                #define CONFIG_BAUDRATE             115200  設(shè)置波特率
                               
               
               
                               
                                                 
                               
               
               
                                #define CONFIG_COMMANDS          ( CONFIG_CMD_DFL | \
               
               
                               
                                                                                                        CFG_CMD_DATE | \
               
               
                               
                                                                                                        CFG_CMD_ELF    | \
               
               
                               
                                                                                                        CFG_CMD_NET    | \
               
               
                               
                                                                                                        CFG_CMD_EEPROM   | \
               
               
                               
                                                                                                        CFG_CMD_I2C            | \
               
               
                               
                                                                                                        CFG_CMD_FAT | \
               
               
                               
                                                                                                        CFG_CMD_JFFS2)
               
               
                                把
                                CFG_CMD_EEPROM
                                改成
                                CFG_CMD_FLASH
                                吧,雖然不改也是可以的,具體沒考究。
               
               
                               
                                                 
                               
               
               
                                以下是板上
                                env
                                參數(shù)設(shè)置,看一下吧,其實(shí)我覺得了解一下就行的了,只是一些初始設(shè)置值,以后可以用命令
                                setenv  saveenv
                                來修改的。
               
               
                                #define CONFIG_BOOTDELAY   3                這個(gè)就是運(yùn)行
                                bootcmd
                                之前的等待時(shí)間
                               
               
               
                                #define CONFIG_BOOTARGS  "devfs=mount root=ramfs console=ttyS0,115200" 引導(dǎo)
                                uClinux
                                的時(shí)候傳遞的參數(shù),不會(huì)就先不用管它也行。
                               
               
               
                                #define CONFIG_ETHADDR       00:50:c2:1e:af:fb    網(wǎng)卡的物理地址
                                MAC
                               
               
               
                                #define CONFIG_NETMASK  255.255.255.0       掩碼地址,設(shè)置過
                                ip
                                的人都應(yīng)該知道吧
                               
               
               
                                #define CONFIG_IPADDR   192.168.0.30          這是你板上網(wǎng)卡
                                8019
                                的
                                ip
                                地址
                               
               
               
                                #define CONFIG_SERVERIP       192.168.0.10       這是你宿主機(jī)的
                                ip
                                地址,以后用
                                tftp
                                下載的時(shí)候用到,一定要跟你的宿主機(jī)一致才行。
                               
               
               
                                #define CONFIG_BOOTFILE       "u-boot.bin"        這個(gè)就是你要下載文件的默認(rèn)名字
                               
               
               
                                #define CONFIG_BOOTCOMMAND   "bootm 0x50000"   這是
                                bootdelay
                                后運(yùn)行的命令
                               
               
               
                               
                                                 
                               
               
               
                                Miscellaneous configurable options
                                部分,參考一下吧:
               
               
                                #define    CFG_LONGHELP                       /* undef to save memory       */
               
               
                                #define    CFG_PROMPT      "s3c44b0=>"   這是進(jìn)入命令模式下的提示符,改個(gè)帥一點(diǎn)的吧
                               
               
               
                                #define    CFG_CBSIZE        256         /* Console I/O Buffer Size     */
               
               
                                #define    CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
               
               
                                #define    CFG_MAXARGS          100              /* max number of command args  */
               
               
                                #define CFG_BARGSIZE             CFG_CBSIZE/* Boot Argument Buffer Size       */
               
               
                               
                                                 
                               
               
               
                                #define CFG_MEMTEST_START    0x0C400000   /* memtest works on     */
               
               
                                #define CFG_MEMTEST_END           0x0C800000   /* 4 ... 8 MB in DRAM  */
               
               
                                #undef  CFG_CLKS_IN_HZ              /* everything, incl board info, in Hz */
               
               
                                #define    CFG_LOAD_ADDR             0x0c008000    默認(rèn)的下載地址
                               
               
               
                                #define    CFG_HZ                      1000              /* 1 kHz */
               
               
                                #define CFG_BAUDRATE_TABLE  { 9600, 19200, 38400, 57600, 115200 } 可供選擇的波特率
                               
               
               
                               
                                                 
                               
               
               
                               
                                                 
                               
               
               
                                Physical Memory Map
                                部分,比較重要,修改你的
                                sdram
                                和
                                flash
                                的地址和容量。
               
               
                                #define CONFIG_NR_DRAM_BANKS1        我們只占用了一個(gè)
                                Bank
                                用來映射
                                sdram
                               
               
               
                                #define PHYS_SDRAM_1            0x0c000000     sdram
                                的起始地址
               
               
                                #define PHYS_SDRAM_1_SIZE   0x00800000     sdram
                                的容量(
                               
                                                8M
                                )
                               
               
               
                                #define PHYS_FLASH_1              0x00000000     flash
                                的起始地址
               
               
                                #define PHYS_FLASH_SIZE        flash
                                的容量(
                               
                                                2M
                                )
                               
               
               
                                #define CFG_FLASH_BASE         PHYS_FLASH_1   定義多個(gè)名字而已,其它地方會(huì)用到
                               
               
               
                               
                                                 
                               
               
               
                               
                                                 
                               
               
               
                                FLASH organization
                                部分,看注釋應(yīng)該知道了吧,參考一下:
               
               
                                #define CFG_FLASH_ERASE_TOUT   4120000  /* Timeout for Flash Erase (in ms)       */
               
               
                                #define CFG_FLASH_WRITE_TOUT  4000       /* Timeout for Flash Write (in ms)       */
               
               
                               
                                                 
                               
               
               
                               
                                                 
                               
               
               
                                按著來一步步的做應(yīng)該不難,這里提一下
                                vi
                                程序的用法,其實(shí)在
                                google
                                一搜就找到了,不過為了方便大家,還是說一聲吧,
               
               
                                在命令模式下:
               
               
                                按
                                / xxx
                                再回車即可搜索到你所需要的內(nèi)容(
                                xxx
                                ),再按
                                n
                                搜索下一個(gè),按
                                shift+n
                                搜索上一個(gè)
                               
                               
               
               
                                按
                               
                                                :
                                xxx
                                即可跟到你想要的行
                               
               
               
                                按
                               
                                                :
                                set nu
                                顯示行號(hào)
                               
               
               
                                其它查書都可以找到就不說了。
               
               
                               
                                                 
                               
               
               
                                做到這個(gè)時(shí)候,你可以再編譯一下,看有沒有錯(cuò),這一步我就沒有幫你們做了,不過我覺得應(yīng)該不會(huì)有問題吧,下載到
                                ram
                                中運(yùn)行,看看效果。
               
               
                               
                                               
                                                                 
                                               
                               
               
               
                               
                                               
                                                                 
                                               
                               
               
               
                                7
                                )終于到了
                                flash
                                的設(shè)置部分了,這完全是我個(gè)人悟出來的,網(wǎng)上資料好像講得不是先清楚。
               
               
                               
                                                  
                                首先介紹一下
                                flash
                                的識(shí)別吧,每塊
                                flash
                                都有一個(gè)
                                id
                                ,前部分用來說明生產(chǎn)廠家,后部分用來說明它的容量,類型,位數(shù)等。它們的定義是在
                                u-boot-1.1.2/include/flash.h中,就以我的
                                ssts9vf1601
                                為例:
                               
                               
               
               
                                #define SST_MANUFACT    0x00BF00BF  這是生產(chǎn)廠家
                                id
                               
               
               
                                #define SST_ID_xF1601       0x234B234B  這是它的型號(hào),容量,位數(shù)等
                                id
                               
               
               
                                #define FLASH_SST160A     0x0046       這個(gè)我還說不清楚,有個(gè)要注意的問題是像
                                sst160
                                是不能用奇地址的,我做的過程中是把
                                SST160A
                                改成
                                SST1601
                                的,懶得幫它創(chuàng)一個(gè)
                               
               
               
                                好了,相信你已經(jīng)找到你的板上所用的
                                flash
                                對應(yīng)的
                                id
                                號(hào)了吧?現(xiàn)在就來談?wù)勗趺锤摹?br />                
               
                                先進(jìn)入
                                u-boot-1.1.2/board/myboards3c44b0/common/flash.c
               
               
                                它里面已經(jīng)幫
                                SST160A
                                設(shè)置好了,我的做法是把
                                SST
                                公司的
                                160A
                                都改成
                                1601
                                ,是不是很簡單,當(dāng)然你也可以幫
                                1601
                                再寫一分,但是我是個(gè)懶人,所以我就樣做了
                                ^_^
               
               
                               
                                                 
                               
               
               
                               
                                                到這里還有個(gè)問題沒提到的,就是如果你重新用
                                                setenv saveenv
                               
                                                設(shè)置了參數(shù),但是復(fù)位后會(huì)發(fā)現(xiàn)怎么沒有保存到的(不信你試試看)。其實(shí)我是故意留到這里講的,應(yīng)該它不會(huì)報(bào)錯(cuò),可以說是比較隱秘的問題,所以我故意放到這里來說,以引起你的重視。
                                               
                                                               
                                                               
                                               
                               
                               
               
               
                                解決方法:
                                vi u-boot-1.1.2/board/myboard/common/flash.c
               
               
                                找到這個(gè)函數(shù):
                                write_buff
               
               
                                里面有這句話:
                                #ifdef CONFIG_B2
               
               
                                要把
                                B2
                                改了,因?yàn)槲覀兊陌宀唤?br />                                 B2
                                ,那叫什么呢?原來是在這里定義的:u-boot-1.1.2/include/configs/myboards3c44b0.h
                               
               
               
                                里面有這句話:
                                #define CONFIG_HFRK 你不喜歡
                                HFRK
                                這個(gè)名字也行,可以改成別的名字,只不過相應(yīng)地前面的
                                B2
                                也要改成這個(gè)名字而已。
                               
               
               
                               
                                                 
                               
               
               
                               
                                                 
                               
               
               
                               
                                                4.
                               
                                                后記:
                               
                                               
                                                               
                                                               
                                               
                               
                               
                               
               
               
                               
                                                  
                                本來是想剛做好的時(shí)候?qū)懙模呛髞戆l(fā)現(xiàn)有些功能實(shí)現(xiàn)不了,所以就停住了筆,等我搞好了以后,又急著去學(xué)習(xí)
                                uClinux
                                的移植,真的很忙,現(xiàn)在終于抽空把它寫完。雖然有些地方還沒說清楚(畢竟我對它的了解還不是很深,但我相信在我以后移植系統(tǒng)的過程中會(huì)逐步加深對它的了解),我還是希望它能成為最詳盡的
                                u-boot
                                移植新手指導(dǎo),對
                                u-boot
                                移植的初學(xué)者起到實(shí)質(zhì)性的作用,這樣就不枉我花了這么多的心思來寫這個(gè)文檔。
                                               
                                               
                               
                               
                               
               
               
                               
                                                 
                                               
                                               
                               
               
               
                                參考資料:
                                               
                                               
                               
                               
               
               
                               
                                               
http://blog.21ic.com/more.asp?name=sockit&id=8509
                                               
                                               
                               
               
               
                                我所認(rèn)為的最有奉獻(xiàn)精神,寫得最詳細(xì)的記錄,在此表示我深深的敬意!
(2) 開始
由于沒有接觸過u-boot,因此第一步要做的就是google一些資料.
u-boot官方網(wǎng)站:http://sourceforge.net/projects/u-boot(比較慢)
http://u-boot.sourceforge.net/這個(gè)快一些.

DENX U-Boot及Linux使用手冊:
http://coosign.blogchina.com/coosign/1318487.html
, 這是一遍翻譯的文檔.主要介紹了u-boot編譯及使用的命令.但沒有涉及新板子的移植流程.
根據(jù)上面手冊中的說明,下載了最新的u-boot代碼,命令:
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
到board目錄查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
結(jié)果是:
./dave/B2/B2.c
B2網(wǎng)站是:
http://www.dave-tech.it
,初初看了B2開發(fā)板的介紹,但不詳細(xì).包括使用的網(wǎng)絡(luò)芯片等都沒有介紹.
google "u-boot 移植"后查到一篇文章:
"收集了一些關(guān)于U-BOOT的文章"
http://www.bloghome.cn/index.php?op=ViewArticle&articleId=2111&blogId=390
里面搜集了不少關(guān)于u-boot移植的問題.

面介紹了"U-Boot 在44B0X
開發(fā)板上的移植以及代碼分析"的內(nèi)容,仔細(xì)看了看.發(fā)現(xiàn)其移植的版本比較低,但對了解u-boot結(jié)構(gòu)是滿不錯(cuò)的,因?yàn)檫@個(gè)版本不支持44B0X,因此完
全是支持新CPU的移植.了解到make XX_config是在Makefile中定義的.
另外"MPC8xx的U-Boot移植體會(huì)(ZT) "這一篇對u-boot介紹滿詳細(xì)的.但對移植工作只做了理論性和經(jīng)驗(yàn)性介紹,沒有具體的操作步驟.
"基于Atmel at91rm9200的armlinux的bootloader啟動(dòng)代碼分析 "
http://www.linuxfans.org/nuke/modules.php?name=News&file=print&sid=2765

里面介紹了u-boot移植到at91rm9200上的情況,可以參考一下.
另外就是仔細(xì)閱讀u-boot下的README文件.
(3) 編譯一把
看了相關(guān)的資料,心動(dòng)不如行動(dòng).先編譯一把看看情況.既然只有B2開發(fā)板是S3C44B0X CPU的,因此先編譯一下B2開發(fā)板看看. 具體:
#cd u-boot
#make B2_config
#make
結(jié)果順利,成功編譯.
(4) 開始動(dòng)手移植
我以B2板子的程序做為模板來做.
#cd board
#cp -r dave wx (自己取個(gè)公司名wx)
#cd wx
#mv B2 wx20 (自己取個(gè)板子名wx20)
#cd wx20
# mv B2.c wx20.c
修改Makefile及wx20.c, 主要是B2改成wx20.
增加配置文件:
#cd include/configs
#cp B2.h wx20.h
修改Makefile配置文件,增加wx20_config.
1432 wx20_config : unconfig
1433 @./mkconfig $(@:_config=) arm s3c44b0 wx20 wx
[注:前面的數(shù)字是文件行號(hào),以下一樣].
將board/wx目錄下和wx20.h文件中的B2改成wx20或WX20.
這里其實(shí)是最重要的步驟,就是根據(jù)硬件的情況來修改相關(guān)的參數(shù).由于對硬件板子的情況不是太了解,因此此時(shí)最需要的就是耐心地看看硬件資料.主要修改的地方有:
include/configs/wx20.h ---- 配置文件,大部分參數(shù)是這里配置的.
board/wx/wx20/lowlevel_init.S -- 內(nèi)存參數(shù)配置
cpu/s3c44b0/serial.c -- 串口配置
cpu/s3c44b0/start.S -- 程序入口
如果此時(shí)配置全部正確了,那么我們就簡單的很了.(如果你用我的patch的話,就是如此了!)那么我也就不會(huì)仔細(xì)再去研究u-boot其他部分了. 困難就是你學(xué)習(xí)的最好機(jī)會(huì)!
(5) 開始編譯
經(jīng)過簡單的參數(shù)修改,編譯成功.然后下載u-boot.bin(二進(jìn)制格式). 此時(shí)你可以用nm看一下u-boot(elf格式)的內(nèi)容,會(huì)有所收獲的.
然后用armsys的bootloader將u-boot.bin調(diào)入到內(nèi)存0xc100000運(yùn)行.結(jié)果可想而知,串口沒有任何顯示,而且死機(jī).bootloader也必須斷電重起.
(6) u-boot流程

因是比較明顯的,就是參數(shù)和硬件沒有符合.因此接下來做的事情就是仔細(xì)閱讀S3C44B0
CPU的硬件資料,包括內(nèi)存配置,串口配置這些.我覺得要讓串口出信息,最主要的就是CPU的初始化,內(nèi)存配置和串口配置.另外就是了解u-boot程序
運(yùn)行流程,這個(gè)對了解需要設(shè)置的參數(shù)是非常有幫助的.我這里大致說一下u-boot運(yùn)行流程.
入口: cpu/s3c44b0/start.S
主要是CPU初始化( cpu_init_crit ), 調(diào)內(nèi)存配置函數(shù)( lowlevel_init ), 然后判斷u-boot是否從flash運(yùn)行,如果是就把u-boot代碼拷貝到TEXT_BASE定義的地方.然后轉(zhuǎn)到start_armboot.
start_armboot: lib_arm/board.c
進(jìn)行各種初始化設(shè)置,主要有:
cpu_init CPU相關(guān)的設(shè)置, 具體在./cpu/s3c44b0/cpu.c中.
board_init 板子相關(guān)的設(shè)置, 具體在board/wx/wx20/wx20.c 中
interrupt_init中斷設(shè)置,我們沒有用,具體在./cpu/s3c44b0/interrupts.c中
env_init 初始化環(huán)境變量, 具體要看用什么介質(zhì)來存儲(chǔ)環(huán)境變量,如果用flash來存貯, 程序在common/env_flash.c中.
init_baudrate 設(shè)置baud參數(shù)
serial_init 串口初始化, 具體在cpu/s3c44b0/serial.c.
console_init_f 控制臺(tái)設(shè)置, 具體在./common/console.c
display_banner 顯示標(biāo)題.
dram_init 可用內(nèi)存配置, 具體在./board/wx/wx20/wx20.c.
flash_init flash初始化,具體./drivers/cfi_flash.c.
接下來就是環(huán)境變量初始化, 網(wǎng)絡(luò)初始化,最后到main_loop,可以運(yùn)行各種命令.
(7) 主要參數(shù)修改
經(jīng)過一段時(shí)間調(diào)試,終于串口出東西了,這段時(shí)間犯了一個(gè)小錯(cuò)誤,走了一段冤枉路.其實(shí)配置參數(shù)可能早已正確,但串口老是亂碼,原因是自己的u-boot.bin傳下來時(shí)目錄搞錯(cuò)了,結(jié)果老是運(yùn)行錯(cuò)誤的u-boot.bin.這段時(shí)間里主要改的參數(shù)有:
include/configs/wx20.h:
#define CONFIG_S3C44B0_CLOCK_SPEED 64
CPU主頻,armsys板的是64M
#define PHYS_SDRAM_1 0x0c000000 /* SDRAM Bank #1 */
B2板子里的定義是錯(cuò)誤的.還有RAM大小,flash大小需要修改,跟B2板不同.
#define CONFIG_DRIVER_RTL8019
#define RTL8019_BASE 0x08000000
配置rtl8019AS網(wǎng)絡(luò)芯片.
#define CFG_LOAD_ADDR 0x0c008000 /* default load address */
uclinux運(yùn)行入口地址
lowlevel_init.S:
MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于對armsys硬件不是太了解,沒有辦法,只得看armsys bootloader程序,但每個(gè)版本又有差別.因此是用AXD調(diào)試看bootlaoder啟動(dòng)后0x1c80000中的值定的.
cpu/s3c44b0/serial.c:
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
divisor = 34;
串口設(shè)置,這個(gè)也是根據(jù)bootloader里的公式計(jì)算出來的.這里只定義了115200得值,其他沒有去設(shè)置.
cpu/s3c44b0/start.S:
ldr r1, =PLLCON
#if CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
ldr r0, =((M_DIV 0C11A73C BSS: -> 0C11ECF4
RAM Configuration:
Bank #0: 0c000000 8 MB
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
MAC: 26:26:26:26:26:26
Hit any key to stop autoboot: 0
=>
(10) 希望環(huán)境變量存貯到flash
B2板缺省的定義是把環(huán)境變量存貯到EEPROM上,雖然armsys上也有,但我也搞不清楚它的硬件配置,因此希望把環(huán)境變量存貯到flash上.
增加配置: include/configs/wx20.h (從evb4510.h中學(xué)來。
79 #define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
80 CFG_CMD_DATE | \
81 CFG_CMD_ELF | \
82 CFG_CMD_NET | \
83 CFG_CMD_ENV|CFG_CMD_FLASH )
173 #define CFG_ENV_IS_IN_FLASH
174 #undef CFG_ENV_IS_NOWHERE
175
176 #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x20000) /* environment start address */
177 #define CFG_ENV_SECT_SIZE 0x10000 /* Total Size of Environment Sector */
編譯運(yùn)行, 并操作setenv, saveenv, printenv. 看起來正常.
=> setenv ipaddr 192.168.1.100
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
ð printenv
但重新啟動(dòng)機(jī)器后,參數(shù)沒有起作用,還是缺省的.仔細(xì)看了環(huán)境變量的程序,發(fā)現(xiàn)是由于ENV_IS_EMBEDDED定義造成的,而此變量定義是在./tools/envcrc.c中:
# if (CFG_ENV_ADDR >= CFG_MONITOR_BASE) && \
((CFG_ENV_ADDR + CFG_ENV_SIZE)  0C117DA0 BSS: -> 0C11C0F0
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000
env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram
ip=192.168.1.100:::::eth0:off ether=25,0,0,0,eth0
ethaddr=00:50:c2:1e:af:fb
envptr->crc=1470de2 1470de2
buffer->crc=1470de2
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
env_ptr=20000
gd->env_addr=20004 gd->env_valid=1
env_relocate[211] offset = 0x0
env_relocate[229] malloced ENV at 00000000
In:
Out:
Err:
死機(jī)!!!
然后改回arm-elf編譯:
U-Boot 1.1.3 (Jul 3 2005 - 07:04:48)
U-Boot code: 0C100000 -> 0C119B98 BSS: -> 0C11DCD8
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000
env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram
ip=192.168.1.100:::::eth0:off ether=25,0,0,0,eth0
ethaddr=00:50:c2:1e:af:fb
envptr->crc=1470de2 1470de2
buffer->crc=1470de2
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
env_ptr=20000
gd->env_addr=20004 gd->env_valid=1
env_relocate[211] offset = 0x0
env_relocate[229] malloced ENV at 0c0dfc08
In: serial
Out: serial
Err: serial
rtl8019 MAC: 2a:2a:2a:2a:2a:2a
Hit any key to stop autoboot: 0
=>

常!因此最好是用arm-elf編譯.
我在看網(wǎng)上查資料時(shí)記得有人說過"用arm-linux編譯時(shí),malloc返回0,而改成arm-elf編譯時(shí)就好了".有個(gè)印象,具體帖子不記得在哪
里了.所以后來我就一直使用arm-elf編譯,沒有再去試arm-linux編譯.
(12) 網(wǎng)卡調(diào)試
剩下來的事情就是調(diào)網(wǎng)絡(luò)了.根據(jù)上面配置rtl8019as后,網(wǎng)絡(luò)仍然不同,然后參考uclinux驅(qū)動(dòng)中的寄存器定義修改,網(wǎng)絡(luò)就可以了.具體修改是:
drivers/rtl8019.h
36 #define ETH_ADDR_SFT (8)
37 #define EI_SHIFT(x) ((x) tftpboot
eth_init...00:50:c2:1e:af:fb
TFTP from server 192.168.1.25; our IP address is 192.168.1.100
Filename 'image.bin'.
Load address: 0xc008000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###############################
死機(jī)!
原因是我們現(xiàn)在的u-boot入口地址是C100000,而uclinux內(nèi)核大約2M,因此load過來就沖突了.因此我們把u-boot的入口地址改成C300000,具體修改在board/wx/wx20/config.mk:
TEXT_BASE = 0x0C300000
重新編譯運(yùn)行就可以了.
(14) 設(shè)置自動(dòng)運(yùn)行uclinux
剛才我們是用命令load uclinux并執(zhí)行的.自動(dòng)運(yùn)行需要設(shè)置bootcmd環(huán)境變量:
=> setenv bootcmd "tftpboot; go 0xc008000" ==》設(shè)置錯(cuò)誤
## Starting application at 0x0C008000 ...
=> setenv bootcmd "tftpboot\; go 0xc008000" ==》需要有個(gè)\
=> saveenv
重新開機(jī)運(yùn)行u-boot:
Hit any key to stop autoboot: 0
Unknown command '"tftpboot' - try 'help'
## Starting application at 0x0C008000 ...
結(jié)果還是不能自動(dòng)下載uclinux和運(yùn)行.經(jīng)過調(diào)試才發(fā)現(xiàn)在設(shè)置bootcmd時(shí)多加了引號(hào)造成的!正確的設(shè)法是:
=> setenv bootcmd tftpboot \; go 0xc008000 ==》正確的設(shè)置
此時(shí)可以成功自動(dòng)下載uclinux和運(yùn)行了.
(15) flash運(yùn)行
刻錄到flash后,運(yùn)行uclinux出現(xiàn)問題,運(yùn)行到:uclinux 開中斷后就死機(jī),提示:
Linux version 2.4.24-uc0 (root@samfei) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux
XIP and shared lib patches from
http://www.snapgear.com/))
#46 Áù 7ÔÂ 2 15:52:55 CST 2005
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc

面一直用armsys的bootloader,將u-boot下載到0xc300000運(yùn)行,然后再load
linux到0xc0080000運(yùn)行,正常.而將u-boot刻錄到flash后運(yùn)行不正常,經(jīng)過調(diào)試uclinux,到init/main.c中
sti()函數(shù)后出現(xiàn)死機(jī).因此懷疑中斷向量設(shè)置問題.
將cpu/s3c44b0/start.S中代碼修改成;
40 .globl _start
41 _start: b reset
42 /*
43 add pc, pc, #0x0c000000
44 add pc, pc, #0x0c000000
45 add pc, pc, #0x0c000000
46 add pc, pc, #0x0c000000
47 add pc, pc, #0x0c000000
48 add pc, pc, #0x0c000000
49 add pc, pc, #0x0c000000
50 */
51 LDR PC, Undefined_Addr
52 LDR PC, SWI_Addr
53 LDR PC, Prefetch_Addr
54 LDR PC, Abort_Addr
55 LDR PC,RESERVE_Addr
56 LDR PC, IRQ_Addr
57 /* subs pc,lr,#4*/
58 LDR PC, IRQ_Addr
59 /* subs pc,lr,#4*/
114 Undefined_Addr:
115 .word 0x0c000004
116 SWI_Addr:
117 .word 0x0c000008
118 Prefetch_Addr:
119 .word 0x0c00000C
120 Abort_Addr:
121 .word 0x0c000010
122 RESERVE_Addr:
123 .word 0x0c000014
124 IRQ_Addr:
125 .word 0x0c000018
126 FIQ_Addr:
127 .word 0x0c00001C
128
129 /*
130 * the actual reset code
131 */
132
133 reset:
后編譯,刻錄,然后運(yùn)行.正常了!!!
(16) 補(bǔ)丁制作和測試
[root@samfei u-boot]# make distclean
[root@samfei 44b0]# mv u-boot u-boot.wx
[root@samfei 44b0]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
Logging in to

server:anonymous@cvs.sourceforge.net:2401/cvsroot/u-boot
CVS password:
[root@samfei 44b0]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
cvs checkout: Updating u-boot
U u-boot/CHANGELOG
U u-boot/COPYING
U u-boot/CREDITS
U u-boot/MAINTAINERS
。。。。。。
[root@samfei 44b0]# diff -Naur u-boot u-boot.wx > uboot-wx-20050703.patch
[root@samfei 44b0]# vi uboot-wx-20050703.patch
去掉沒有用的文件.做補(bǔ)丁的好處就是自己可以很清楚的知道哪些文件修改了!做完了,別忘了測試一下.
[root@samfei 44b0]# cd u-boot
[root@samfei u-boot]# patch -p1   
               
               
               
               
               

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u1/45211/showart_403849.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP