<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Uboot在S3C2440上的移植詳解(四)

          Uboot在S3C2440上的移植詳解(四)

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          一、移植環(huán)境

          二、移植步驟

          在這一篇中,我們首先讓開(kāi)發(fā)板對(duì)CS8900或者DM9000X網(wǎng)卡的支持,然后再分析實(shí)現(xiàn)u-boot怎樣來(lái)引導(dǎo)Linux內(nèi)核啟動(dòng)。因?yàn)闇y(cè)試u-boot引導(dǎo)內(nèi)核我們要用到網(wǎng)絡(luò)下載功能。

          7)u-boot對(duì)CS8900或者DM9000X網(wǎng)卡的支持。
          u-boot-2009.08版本已經(jīng)對(duì)CS8900和DM9000X網(wǎng)卡有比較完善的代碼支持(代碼在drivers/net/目錄下),而且在S3C24XX系列中默認(rèn)對(duì)CS8900網(wǎng)卡進(jìn)行配置使用。只是在個(gè)別地方要根據(jù)開(kāi)發(fā)板的具體網(wǎng)卡片選進(jìn)行設(shè)置,就可以對(duì)S3C24XX系列中CS8900網(wǎng)卡的支持使用。代碼如下:

          現(xiàn)在修改對(duì)我們開(kāi)發(fā)板上DM9000X網(wǎng)卡的支持。
          首先,我們看看drivers/net/目錄下有關(guān)DM9000的代碼,發(fā)現(xiàn)dm9000x.h中對(duì)CONFIG_DRIVER_DM9000宏的依賴,dm9000x.c中對(duì)CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依賴,所以我們修改代碼如下:

          #gedit include/configs/my2440.h

          /* * Hardware drivers */ 屏蔽掉u-boot默認(rèn)對(duì)CS8900網(wǎng)卡的支持
          //#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
          //#define CS8900_BASE 0x19000300
          //#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */

          //添加u-boot對(duì)DM9000X網(wǎng)卡的支持

          #define CONFIG_DRIVER_DM9000 1
          #define CONFIG_NET_MULTI 1
          #define CONFIG_DM9000_NO_SROM 1
          #define CONFIG_DM9000_BASE 0x20000300 //網(wǎng)卡片選地址
          #define DM9000_IO CONFIG_DM9000_BASE
          #define DM9000_DATA (CONFIG_DM9000_BASE + 4) //網(wǎng)卡數(shù)據(jù)地址

          //#define CONFIG_DM9000_USE_16BIT 1

          注意:
          u-boot-2009.08 可以自動(dòng)檢測(cè)DM9000網(wǎng)卡的位數(shù),根據(jù)開(kāi)發(fā)板原理圖可知網(wǎng)卡的數(shù)據(jù)位為16位,并且網(wǎng)卡位于CPU的BANK4上,所以只需在 board/samsung/my2440/lowlevel_init.S中設(shè)置 #define B4_BWSCON (DW16) 即可,不需要此處的 #define CONFIG_DM9000_USE_16BIT 1

          //給u-boot加上ping命令,用來(lái)測(cè)試網(wǎng)絡(luò)通不通

          #define CONFIG_CMD_PING

          //恢復(fù)被注釋掉的網(wǎng)卡MAC地址和修改你合適的開(kāi)發(fā)板IP地址

          #define CONFIG_ETHADDR 08:00:3e:26:0a:5b //開(kāi)發(fā)板MAC地址
          #define CONFIG_NETMASK 255.255.255.0
          #define CONFIG_IPADDR 192.168.1.105 //開(kāi)發(fā)板IP地址

          #define CONFIG_SERVERIP 192.168.1.103 //Linux主機(jī)IP地址

          添加板載DM9000網(wǎng)卡初始化代碼,如下:

          #gedit board/samsung/my2440/my2440.c

          #include
          #include

          #ifdef CONFIG_DRIVER_DM9000
          int board_eth_init(bd_t *bis)
          {
          return dm9000_initialize(bis);
          }
          #endif

          修改MD9000網(wǎng)卡驅(qū)動(dòng)代碼,如下:

          #gedit drivers/net/dm9000x.c

          #if 0 //屏蔽掉dm9000_init函數(shù)中的這一部分,不然使用網(wǎng)卡的時(shí)候會(huì)報(bào)“could not establish link”的錯(cuò)誤
          i = 0;
          while(!(phy_read(1)& 0x20)){/* autonegation complete bit */
          udelay(1000);
          i++;
          if(i == 10000){
          printf("could not establish link ");
          return 0;
          }
          }
          #endif

          然后重新編譯u-boot,下載到Nand中從Nand啟動(dòng),查看啟動(dòng)信息和環(huán)境變量并使用ping命令測(cè)試網(wǎng)卡,操作如下:

          可以看到,啟動(dòng)信息里面顯示了Net:dm9000,printenv查看的環(huán)境變量也和include/configs/my2440.h中設(shè)置的一致。但是現(xiàn)在有個(gè)問(wèn)題就是ping不能通過(guò)。
          經(jīng)過(guò)一段時(shí)間在網(wǎng)上搜索,原來(lái)有很多人都碰到了這種情況。出現(xiàn)問(wèn)題的地方可能是DM9000網(wǎng)卡驅(qū)動(dòng)中關(guān)閉網(wǎng)卡的地方,如是就試著修改代碼如下:

          結(jié)果,只是第一次ping不通,以后都是可以ping通的(據(jù)網(wǎng)友們說(shuō)這是正常的),如下圖:

          好了,現(xiàn)在只剩下一個(gè)問(wèn)題了,就是使用tftp進(jìn)行下載。關(guān)于tftp服務(wù)器在Linux中的安裝和配置,這里我就不講了,在網(wǎng)上搜一下很多的。然而,在tftp下載時(shí)又遇到了問(wèn)題,總是出現(xiàn)傳送不完整又重新傳送的現(xiàn)象,不斷的循環(huán),如下圖:

          困惑好久的tftp問(wèn)題現(xiàn)在終于搞定啦,心情真是爽啊?。∈紫确治錾厦鎴D中的現(xiàn)象,在下載過(guò)程中斷斷續(xù)續(xù)就說(shuō)明是可以下載的,只是由于某種原因使網(wǎng)絡(luò)出現(xiàn)超時(shí)從而重新下載,那我想出現(xiàn)這種情況的可能性有兩種:1、u-boot中對(duì)網(wǎng)絡(luò)的延時(shí)設(shè)置;2、就是我的物理網(wǎng)絡(luò)結(jié)構(gòu)。首先針對(duì)第一種,我修改了net/net.c中對(duì)網(wǎng)絡(luò)延時(shí)的設(shè)置,結(jié)果還是不行。接著就試試第二種情況,因?yàn)橹拔业木W(wǎng)絡(luò)是通過(guò)路由器來(lái)管理的,主機(jī)和開(kāi)發(fā)板也是通過(guò)路由器來(lái)連接的,所以現(xiàn)在我就改用一條交叉網(wǎng)線直接把主機(jī)和開(kāi)發(fā)板連接起來(lái),一試,果然可以啦,哈哈哈哈....。至此,網(wǎng)絡(luò)部分的移植總算完成了。

          8)實(shí)現(xiàn)u-boot引導(dǎo)Linux內(nèi)核啟動(dòng)。
          在前面幾節(jié)中,我們講了u-boot對(duì)Nor Flash和Nand Flash的啟動(dòng)支持,那現(xiàn)在我們就再來(lái)探討一下u-boot怎樣來(lái)引導(dǎo)Linux內(nèi)核的啟動(dòng)。
          ①、機(jī)器碼的確定
          通常,在u-boot和kernel中都會(huì)有一個(gè)機(jī)器碼(即:MACH_TYPE),只有這兩個(gè)機(jī)器碼一致時(shí)才能引導(dǎo)內(nèi)核,否則就會(huì)出現(xiàn)如下mach的錯(cuò)誤信息:

          首先,確定u-boot中的MACH_TYPE。在u-boot的include/asm-arm/mach-types.h文件中針對(duì)不同的CPU定義了非常多的MACH_TYPE,可以找到下面這個(gè)定義:

          ②、準(zhǔn)備能被u-boot直接引導(dǎo)的內(nèi)核uImage
          通常,kernel的啟動(dòng)需要u-boot提供一些參數(shù)信息,比如ramdisk在RAM中的地址。經(jīng)過(guò)編譯后的u-boot在根目錄下的tools目錄中,會(huì)有個(gè)叫做mkimage的工具,他可以給zImage添加一個(gè)header,也就是說(shuō)使得通常我們編譯的內(nèi)核zImage添加一個(gè)數(shù)據(jù)頭信息部分,我們把添加頭后的image通常叫uImage,uImage是可以被u-boot直接引導(dǎo)的內(nèi)核鏡像。
          mkimage工具的使用介紹如下:

          使用: 中括號(hào)括起來(lái)的是可選的

          mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

          選項(xiàng):
          -A:set architecture to arch //用于指定CPU類型,比如ARM
          -O:set operating system to os //用于指定操作系統(tǒng),比如Linux
          -T:set image type to type //用于指定image類型,比如Kernel
          -C:set compression type comp //指定壓縮類型
          -a:set load address to addr (hex) //指定image的載入地址
          -e:set entry point to ep (hex) //內(nèi)核的入口地址,一般為image的載入地址+0x40(信息頭的大?。?br />-n:set image name to name //image在頭結(jié)構(gòu)中的命名
          -d:use image data from datafile //無(wú)頭信息的image文件名
          -x:set XIP (execute in place) //設(shè)置執(zhí)行位置

          先將u-boot下的tools中的mkimage復(fù)制到主機(jī)的/usr/local/bin目錄下,這樣就可以在主機(jī)的任何目錄下使用該工具了?,F(xiàn)在我們進(jìn)入kernel生成目錄(一般是arch/arm/boot目錄),然后執(zhí)行如下命令,就會(huì)在該目錄下生成一個(gè)uImage.img的鏡像文件,把他復(fù)制到tftp目錄下,這就是我們所說(shuō)的uImage。

          mkimage -n linux-2.6.30.4-A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img

          ③、Nand Flash的分區(qū)。我們查看內(nèi)核在arch/arm/plat-s3c24xx/common-smdk.c中的分區(qū)情況如下:

          起始地址 結(jié)束地址

          uboot : 0x00000000 0x00030000
          param : 0x00030000 0x00040000 //注意這個(gè)環(huán)境變量的地址范圍要與上一節(jié)補(bǔ)充內(nèi)容中配置的CONFIG_ENV_OFFSET一致
          kernel: 0x00050000 0x00200000
          root : 0x00250000 0x03dac000

          ④、設(shè)置修改u-boot的啟動(dòng)參數(shù),在u-boot命令行下輸入:

          //設(shè)置啟動(dòng)參數(shù),意思是將nand中0x50000-0x00200000(和kernel分區(qū)一致)的內(nèi)容讀到內(nèi)存0x31000000中,然后用bootm命令來(lái)執(zhí)行

          set bootcmd nand read 0x31000000 0x50000 0x00200000;bootm 0x31000000

          saveenv //保存設(shè)置

          ⑤、把uImage.img用tftp下載到內(nèi)存中,然后再固化到Nand Flash中,操作和執(zhí)行圖如下:

          tftp 0x30000000 uImage.img //將uImage.img下載到內(nèi)存0x30000000處

          nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的內(nèi)容

          nand write 0x30000000 0x50000 0x200000 //將內(nèi)存0x30000000處的內(nèi)容寫(xiě)入到nand的0x50000處

          650) this.width=650;" src="http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042325.png" style="padding:0px;margin:0px;border:0px;" />
          最后,我們重新啟動(dòng)開(kāi)發(fā)板,可以看到,內(nèi)核被u-boot成功引導(dǎo)起來(lái)了,如圖:
          650) this.width=650;" src="http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042326.png" style="padding:0px;margin:0px;border:0px;" />

          #define MACH_TYPE_SMDK2440 1008 //針對(duì)2440的MACH_TYPE碼的值定義為1008

          那么我們就修改u-boot的MACH_TYPE代碼引用部分,確定u-boot的MACH_TYPE。如下:

          #gedit board/samsung/my2440/my2440.c//修改board_init函數(shù)

          /* arch number of SMDK2410-Board */
          //gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
          改為:
          gd->bd->bi_arch_number = MACH_TYPE_SMDK2440;

          其次,確定kernel中的MACH_TYPE。在kernel的arch/arm/tools/mach-types文件中也針對(duì)不同的CPU定義了非常多的MACH_TYPE,也可以找到下面這個(gè)定義:

          smdk2440 MACH_SMDK2440 SMDK2440 1008

          那么我們就修改kernel的MACH_TYPE代碼引用部分,確定kernel的MACH_TYPE。如下:

          #gedit arch/arm/mach-s3c2440/mach-smdk2440.c//修改文件最后面

          //MACHINE_START(S3C2440, "SMDK2440")
          改為:
          MACHINE_START(SMDK2440, "SMDK2440")

          #gedit arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代碼(紅色部分)

          ENTRY(stext)

          mov r0, #0
          mov r1, #0x3f0 //上面的MACH_TYPE值1008換成十六進(jìn)制就是0x3f0
          ldr r2, =0x30000100

          msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE

          .......

          分別重新編譯u-boot和kernel。u-boot下載后,記得要saveenv;kernel用tftp下載到內(nèi)存后使用go命令來(lái)測(cè)試引導(dǎo)內(nèi)核,結(jié)果可以引導(dǎo)了,如下:
          650) this.width=650;" src="http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042327.png" style="padding:0px;margin:0px;border:0px;" />

          #gedit drivers/net/dm9000x.c //屏蔽掉dm9000_halt函數(shù)中的內(nèi)容

          /*
          Stop the interface.
          The interface is stopped when it is brought.
          */
          staticvoid dm9000_halt(struct eth_device *netdev)
          {
          //DM9000_DBG("%sn", __func__);

          ///* RESET devie */
          //phy_write(0, 0x8000); /* PHY RESET */
          //DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
          //DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
          //DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
          }

          #gedit include/configs/my2440.h

          /*
          * Hardware drivers
          */
          #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
          #define CS8900_BASE 0x19000300 //注意:對(duì)不同的開(kāi)發(fā)板就是要修改這個(gè)片選地址參數(shù),這個(gè)參數(shù)值就看開(kāi)發(fā)板上網(wǎng)卡的片選引腳是接到ARM芯片存儲(chǔ)控制器的哪個(gè)Bank上
          #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */




          關(guān)鍵詞: UbootS3C2440移植詳

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();