乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      u-boot在blackfin上的移植

       zlslm 2021-02-25

      2009-11-10 14:27:0

      文章一:概略介紹

      U-Boot 到blackfin的移植

      如板子名farsight-533

      步驟一:

      總的Makefile文件中添加自己board

      總Makefile文件中:

      image

      我們添加:

      farsight-533_config     :     unconfig

                  @./mkconfig  $(@:_config=)  blackfin bf533  farsight-533

      步驟二:Board Configuration File 

      josh@ubuntu:~$ touch include/configs/farsight-533.h

      步驟三:Board Directory 

      建立目錄:borad/farsight-533/

      Makefile - list all files to generate

      config.mk - custom compiler flags

      farsight-533.c - a C file named exactly the same as your board

      u-boot.lds - the U-Boot linker script

      1) Board C File: farsight-533.c

      這里面需要實(shí)現(xiàn)幾個(gè)應(yīng)該實(shí)現(xiàn)的函數(shù)。

      checkboard()

      用來在初始化driver之前檢查板級相關(guān)的細(xì)節(jié)信息,通常僅僅打印出你板子的標(biāo)識信息(banner)。 返回0 - 成功  返回非0 - 失敗

      int checkboard(void)
      {
          printf("Board: farsight-533 board\n");
          printf("       Support: http://www./\n");
          return 0;
      }

      initdram()

      任何板級的內(nèi)存初始化應(yīng)該在這里進(jìn)行。

      由于公用的blackfin cpu的代碼將基于你的board configuation setting來初始化on-chip external memory controller, 因此實(shí)際上這里沒有太多的事情要做了。很可能你的函數(shù)只需要描述你有多少外部存儲,下面是個(gè)可以copy-paste來用的例子:

      long int initdram(int board_type)
      {
          DECLARE_GLOBAL_DATA_PTR;
          gd->bd->bi_memstart = CFG_SDRAM_BASE;
          gd->bd->bi_memsize = CFG_MAX_RAM_SIZE;
          return CFG_MAX_RAM_SIZE;
      }

      board_get_enetaddr()

      如果你的MAC沒有專門的EEPROM來存儲MAC地址,并且你沒有在你的board configuration file中硬編碼MAC地址,那么你必須實(shí)現(xiàn)這個(gè)函數(shù)。

      如果你的MAC地址有專門的EEPROM來保存MAC地址,那么U-boot driver將為你代勞。你不必實(shí)現(xiàn)

      下面這個(gè)例子是為MAC硬編碼MAC地址:

      int board_get_enetaddr(uchar *mac_addr)
      {
          uchar *board_mac_addr = (uchar *)0x203F0000;
          memcpy(mac_addr, board_mac_addr, 6);
          return 0;
      }

      board_reset()

      這個(gè)函數(shù)是可選的。用來在軟件重啟前對硬件做點(diǎn)額外的事情

      void board_reset(void)
      {
          /* do something weird */
      }

      misc_init_r() : miscellaneous board initialization

      其他的板級初始化函數(shù)

      你需要在你的board configuration file中定義CONFIG_MISC_INIT_R這個(gè)宏

      #if defined(CONFIG_MISC_INIT_R)
      int misc_init_r(void)
      {
          /* do random stuff */
      }
      #endif

      文章二:基于 華恒科技開發(fā)板 的移植

      本文介紹的移植過程基于華恒科技提供的軟件包(用于HHBF531-StartKIT-R1開發(fā)板)。我
      們的硬件平臺是:
      CPU:BF533
      FLASH:S29AL004D-512KB
      SDRAM:HY57V281620-16MB
      下面我們分成以下幾個(gè)步驟進(jìn)行介紹:
      一, 建立交叉編譯開發(fā)環(huán)境:
      1, 安裝(虛擬)linux系統(tǒng):
          移植uclinux要在linux系統(tǒng)環(huán)境下交叉編譯,所以需要一個(gè)linux系統(tǒng)??梢园惭b一個(gè)
      完整的linux操作系統(tǒng),也可以在windows系統(tǒng)下利用虛擬軟件運(yùn)行l(wèi)inux系統(tǒng)。本人不習(xí)慣
      使用linux操作系統(tǒng),所以在windows環(huán)境下安裝了一個(gè)虛擬linux——colinux。本人下載
      的colinux安裝包是colinux_installer_v0.95.zip ,安裝包內(nèi)包含blackfin交叉編譯工具
      鏈,利用此工具包安裝的虛擬linux系統(tǒng)內(nèi)已經(jīng)帶有blackfin交叉編譯工具鏈,下載地址為
      http://blackfin./gf/project/bfin-colinux/frs/。
      安裝colinux的方法很簡單,和一般的windows軟件安裝相同,全部采用默認(rèn)值即可。唯一
      要注意的是,要保證安裝盤(比如說c盤)有足夠的空間(大約需要3.5GB)。
      安裝成功后,點(diǎn)擊你桌面上的blackfin-colinux圖標(biāo)就可以運(yùn)行colinux了。Colinux默認(rèn)
      已經(jīng)建立兩個(gè)用戶:root和uclinux,密碼均為bf533。查看linux根目錄下有沒有/opt/uC
      linux/bfin-elf、/opt/uClinux/bfin-linux-uclibc、/opt/uClinux/bfin-uclinux三個(gè)目
      錄,有的話blackfin交叉工具鏈已經(jīng)安裝成功,但不一定適用于本文的源碼編譯;因?yàn)槟?br>些變量定義不一致可能導(dǎo)致華恒提供的源碼編譯錯(cuò)誤,所以要使用華恒提供的軟件包附帶
      的交叉編譯工具鏈。
      更多資料參見:http://blackfin./。
      2, 安裝blackfin交叉編譯工具鏈:
      解壓華恒軟件包HHBF531-R1-v1.0.0-070327.tgz:
      #tar jxvf HHBF531-R1-v1.0.0-070327.tgz
      生成HHBF531-R1文件夾,內(nèi)包含交叉編譯工具鏈、uboot源碼包、uclinux源碼包、jtag工
      具和源碼鏡像。
      進(jìn)入交叉編譯工具鏈目錄:
      #cd HHBF531-R1/toolchains
      交叉編譯工具鏈?zhǔn)且粋€(gè)tgz壓縮包gcc-bfin-3.4.tgz,包含的用于交叉編譯的可執(zhí)行文件,
      直接解壓到相應(yīng)目錄即可以使用,無需安裝。
      #tar jxvf gcc-bfin-3.4.tgz /usr/local/
      設(shè)置編譯工具目錄:
      #PATH=”/usr/local/gcc-bfin-3.4-uclinux/bin:$PATH”
      這樣,交叉編譯環(huán)境就建立好了。開始華恒提供的源碼吧,看看你的環(huán)境是否建立正確!
      如果出現(xiàn)錯(cuò)誤,仔細(xì)檢查以上過程。
      二, 移植u-boot:
      uclinux啟動離不開引導(dǎo)程序,這個(gè)引導(dǎo)程序叫作bootloader。Bootloader是在操作系統(tǒng)運(yùn)
      行之前執(zhí)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的
      映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。
      U-Boot是一種通用的Bootloader,可以方便地移植到各種硬件平臺上。
      華恒提供的u-boot在HHBF531-R1/u-boot目錄下,支持blackfin系列DSP和常用開發(fā)板。
      我們這里把U-Boot的移植分成兩個(gè)部分。第一部分是為我們的新開發(fā)板在目錄/board/下建
      立一個(gè)新目錄,并拷貝最類似的開發(fā)板源碼到該目錄,做一些配置修改,對我們的新開發(fā)
      板進(jìn)行配置并編譯通過;第二部分是針對我們的新開發(fā)板的特點(diǎn)修改相關(guān)源碼文件的內(nèi)容
      ,使其能在我們的新開發(fā)板上運(yùn)行。
      1, 第一部分:
      我們的新開發(fā)板基于BF533,與U-Boot中的hhbf開發(fā)板最類似,我們以hhbf開發(fā)板為模板修
      改得到我們新開發(fā)板的移植代碼。
      進(jìn)入u-boot目錄:
      #cd HHBF531-R1/u-boot
      注意要讓uclinux用戶用于讀寫操作的權(quán)限,否則下面操作時(shí)報(bào)“Permition denied.”錯(cuò)
      誤。簡單點(diǎn),我們直接用root用戶登陸。
      進(jìn)入開發(fā)板目錄,建立對應(yīng)于我們開發(fā)板的文件目錄,這里命名為naribf533。
      #cd board
      #cp –R hhbf naribf533
      #cd naribf533
      #mv hhbf.c naribf533.c(修改文件名)
      刪除不需要的文件:
      #mv –r hhbf*
      #mv psd4256.h
      這樣我們新開發(fā)板的文件目錄和文件都有了(現(xiàn)在還不能在我們開發(fā)板上運(yùn)行)。然后修
      改naribf533目錄下的Makefile和u-boot.lds,把其中的hhbf全部修改為naribf533,后面
      編譯過程中如果報(bào)找不到hhbf的錯(cuò)誤也把相應(yīng)的hhbf改為naribf533。
      再加入一個(gè)頭文件:
      #cd include/configs
      #cp hhbf.h naribf533.h
      這個(gè)頭文件中有很多內(nèi)容要修改,我們將在第二部分中予以修改。
      修改頂層目錄下的Makefile,找到以下內(nèi)容:
      hhbf533_config : unconfig
      @ > include/config.h
      @echo “#define CONFIG_HHBF  1” >> include/config.h
      @echo “#define CONFIG_BF533 1” >> include/config.h
      @./mkconfig –a $(@:_config=) blackfin bf533 hhbf533 #hhtech
      模仿上述語句,在下面增加以下內(nèi)容:
      naribf533_config : unconfig
      @ > include/config.h
      @echo “#define CONFIG_HHBF  1” >> include/config.h
      @echo “#define CONFIG_BF533 1” >> include/config.h
      @./mkconfig –a $(@:_config=) blackfin bf533 naribf533
      切記在“@./mkconfig –a $(@:_config=) blackfin bf533 naribf533”前面的是Tab來的
      ,萬萬不能用空格代替,因?yàn)樗强窟@個(gè)來識別命令的!
      最后編譯u-boot,
      #make distclean
      #make naribf533_config(就是在Makefile里添加的config)
      #make
      看看有沒有錯(cuò),有錯(cuò)的話按著提示來改,如果沒錯(cuò)的話應(yīng)該就能生成u-boot.bin這個(gè)文件
      ?,F(xiàn)在還不能使用,因?yàn)檫@只是hhbf的一個(gè)仿制品而已。
      編譯正確生成u-boot.bin文件,這一部分就算完成了。下面我們嘗試修改相應(yīng)的源代碼。
      2, 第二部分:
          該部分主要是修改開發(fā)板配置文件以及flash驅(qū)動。
      我們先來修改開發(fā)板配置文件,讓u-boot能運(yùn)行起來。修改的主要內(nèi)容包括:串口設(shè)置、
      時(shí)鐘設(shè)置、flash設(shè)置和SDRAM設(shè)置。我們的開發(fā)板上目前還沒有網(wǎng)絡(luò)功能,先不設(shè)置該內(nèi)
      容。
      將以下設(shè)置替換原開發(fā)板配置文件相應(yīng)部分即可。
      串口設(shè)置,將波特率設(shè)置為115200。
      #define CONFIG_BAUDRATE 115200
      時(shí)鐘設(shè)置,根據(jù)開發(fā)板晶振頻率和系統(tǒng)需要的工作頻率設(shè)置,我們開發(fā)板的晶振為27MHz,
      內(nèi)核時(shí)鐘為輸入時(shí)鐘的22倍頻,系統(tǒng)時(shí)鐘為內(nèi)核時(shí)鐘的5分頻,所以如下設(shè)置。
      #ifdef CONFIG_BF533
          #define CONFIG_CLKIN_HZ 27000000
      #endif//CONFIG_BF533
      #ifdef CONFIG_BF561
          #define CONFIG_CLKIN_HZ 33000000
      #endif//CONFIG_BF561
      /* CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN      */
      /*                                                  1=CLKIN/2    */
      #define CONFIG_CLKIN_HALF               0
      /* CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass  */
      /*                                               1=bypass PLL    */
      #define CONFIG_PLL_BYPASS               0
      /* CONFIG_VCO_MULT controls what the multiplier of the PLL is.   */
      /* Values can range from 1-64                                    */
      #ifdef CONFIG_BF533
          #define CONFIG_VCO_MULT                 12
      #endif//CONFIG_BF533
      #ifdef CONFIG_BF561
          #define CONFIG_VCO_MULT                 10
      #endif//CONFIG_BF561
      /* CONFIG_CCLK_DIV controls what the core clock divider is       */
      /* Values can be 1, 2, 4, or 8 ONLY                              */
      #define CONFIG_CCLK_DIV                 1
      /* CONFIG_SPI_BAUD controls the SPI peripheral clock divider     */
      /* Values can range from 2-65535                                 */
      /* SCK Frequency = SCLK / (2 * CONFIG_SPI_BAUD)                  */
      #define CONFIG_SPI_BAUD                 2
      /* CONFIG_SCLK_DIV controls what the peripheral clock divider is */
      /* Values can range from 1-15                                    */
      #define CONFIG_SCLK_DIV                 4
      flash設(shè)置,根據(jù)你的開發(fā)板flash容量和起始地址定制,我們的開發(fā)板flash容量為512KB
      ,起始地址為0x20000000。
      #ifdef CONFIG_BF533
      #define CFG_MAX_FLASH_BANKS 1 //flash只有一段
      #define CFG_MAX_FLASH_SECT 11 //flash一共有11個(gè)sector
      #endif//CONFIG_BF533
      #ifdef CONFIG_BF533
      #define CFG_ENV_ADDR 0x20020000
      #define CFG_ENV_SECT_SIZE 0x10000
      #endif//CONFIG_BF533
      #ifdef CONFIG_BF533
      #define FLASH_SIZE 0x80000
      #define CFG_FLASH_SIZE 0x80000 //容量為512KB
      #endif//CONFIG_BF533
      SDRAM設(shè)置,根據(jù)你的開發(fā)板SDRAM容量和起始地址定制,我們的開發(fā)板SDRAM容量為16MB,
      列地址寬度為9,起始地址為0x00000000。
      #define CFG_LARGE_IMAGE_LEN 0x1000000   /* Large Image Length */
      #ifdef CONFIG_BF533
      #define CONFIG_MEM_SIZE                 16             /* 128, 64, 32, 16 */
      #endif//CONFIG_BF533
      #define CONFIG_MEM_ADD_WDTH             9        /* 8, 9, 10, 11    */
      #define CFG_MEMTEST_START 0x00100000 /* memtest works on */
      #define CFG_MEMTEST_END 0x00f00000 /* 1..15 MB in DRAM */
      #define CFG_SDRAM_BASE 0x00000000
      #ifdef CONFIG_BF533
      #define CFG_MAX_RAM_SIZE 0x01000000
      #endif//CONFIG_BF533
      如上設(shè)置后,重新編譯u-boot,發(fā)現(xiàn)出現(xiàn)錯(cuò)誤#error "CFG_MONITOR_BASE != TEXT_BASE"
      ,原因是TEXT_BASE設(shè)置值與配置文件不一致,主要是由于我們修改了SDRAM的容量。到b
      oard/naribf533目錄下修改config.mk文件,將TEXT_BASE的地址修改為0x0fc0000。接下來
      編譯應(yīng)該沒有任何錯(cuò)誤了。
      編譯生成的u-boot.bin下載到開發(fā)板即可以運(yùn)行了,應(yīng)該能看到串口返回的u-boot成功運(yùn)
      行的信息。這樣第一步修改就完成了。
      在上面看到的u-boot運(yùn)行信息里,你會發(fā)現(xiàn)有很多關(guān)于華恒的信息,可能你很不愿意顯示
      這些內(nèi)容。這是因?yàn)槟氵€沒有修改flash驅(qū)動,里面顯示的還是華恒提供的flash驅(qū)動顯示
      的內(nèi)容。而且此時(shí)還不能下載uclinux鏡像,因?yàn)槿A恒提供的flash驅(qū)動不一定適合你的開
      發(fā)板,不能對你的開發(fā)板flash進(jìn)行寫操作。所以,我們接下來修改flash驅(qū)動。
      flash驅(qū)動對應(yīng)的文件是board/naribf533/flash.c,它主要包括以下幾個(gè)函數(shù):
      unsigned long flash_init (void ),F(xiàn)lash初始化;
          void flash_print_info (flash_info_t *info),打印Flash信息;
          int flash_erase (flash_info_t *info, int s_first, int s_last),F(xiàn)lash擦除
      ;
          volatile static int write_dword (flash_info_t *info, ulong dest, ulong d
      ata),F(xiàn)lash寫入;
          int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),
      從內(nèi)存復(fù)制數(shù)據(jù)。
      Flash驅(qū)動修改要根據(jù)你使用的flash特性進(jìn)行,參考flash的文檔。主要修改內(nèi)容包括:f
      lash操作命令、flash扇區(qū)分配和一些打印信息。
      另外,還有SDRAM的配置。除了再(board).h文件中的配置以外,如果你使用的SDRAM的刷新
      頻率不同于hhbf531學(xué)習(xí)板上使用的,還必須到include/asm-blackfin/mem_init.h文件中
      去修改SDRAM_Tref和SDRAM_NRA兩個(gè)參數(shù)。
      3, 測試U-boot:
      如果以上修改內(nèi)容都做到了,編譯得到的u-boot應(yīng)該沒有什么問題了,但測試還是必要的
      。
      u-boot能正確打印啟動信息,不代表u-boot完全正確了,比如說flash不能正確擦寫、SDR
      AM不能正確操作等問題都可能存在。這里分一下幾項(xiàng)內(nèi)容測試u-boot。
      1)測試u-boot所有命令:
      在u-boot的monitor下,鍵入help,會顯示u-boot支持的所有命令。依次測試各命令,檢查
      是否正確。
      2)測試flash驅(qū)動:
      通過u-boot的loadb和go命令,下載一個(gè)可執(zhí)行程序到某個(gè)未使用的地址空間,檢查是否正
      確運(yùn)行,以測試flash能否正確讀寫。
      3)測試SDRAM:
      SDRAM的測試往往被人忽略,其實(shí)該部分是很重要的,一旦錯(cuò)誤可能給后面的內(nèi)核移植帶來
      很多問題,本人就遇到這樣的問題。
      測試SDRAM主要包括空間的連續(xù)性和是否有空間重疊現(xiàn)象。
      連續(xù)性測試可以通過md命令,從低地址到高地址依次打印內(nèi)存信息,檢查打印的地址是否
      連續(xù)。
      內(nèi)存空間是否重疊可以通過對每MB空間寫入特定數(shù),檢查各MB空間的數(shù)據(jù)是否重復(fù),重復(fù)
      則可能因?yàn)榭臻g重疊。
      除以上測試內(nèi)容外,可能還有其他小問題,視情況另做測試。
      通過以上測試后,你的u-boot基本就沒有問題了,可以放心地利用它下載運(yùn)行l(wèi)inux了。

      U-Boot在基于ADSP BF533的嵌入式Linux系統(tǒng)上的移植

      1 引言

      Boot Loader(內(nèi)核引導(dǎo)程序)是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段自舉程序,用于初始化硬件設(shè)備、改變處理器運(yùn)行模式、重組中斷向量和建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件帶到一個(gè)合適的狀態(tài)或者用戶定制的特定狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境[1]。

      嵌入式Linux系統(tǒng)常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全稱Universal Boot Loader)是當(dāng)前比較流行的遵循GPL條件的開放源碼項(xiàng)目。U-Boot具有源碼公開的特點(diǎn),開發(fā)人員可根據(jù)自身需要進(jìn)行裁減;支持多種處理器和嵌入式操作系統(tǒng)內(nèi)核;具有多種設(shè)備驅(qū)動源碼:支持種引導(dǎo)方式;具有功能強(qiáng)大且成熟、穩(wěn)定等諸多優(yōu)點(diǎn),故在嵌入式系統(tǒng)開發(fā)過程中廣泛采用。U-Boot嚴(yán)重依賴于底層硬件,不同的CPU或嵌入式板極設(shè)備需要不同的U-Boot,因此,在嵌入式系統(tǒng)中建立通用的U-Boot是非常困難的,故U-Boot需針對開發(fā)板量身定做。

      2 開發(fā)平臺

      2.1 BF533簡介

      Blackfin系列DSP是ADI公司與Intel聯(lián)合開發(fā)推出的第一款高性能、低功耗第四代定點(diǎn)DSP產(chǎn)品,融合了Analog Devices/Intel公司的微信號結(jié)構(gòu)(MSA)。它將一個(gè)32位RISC型指令集和雙16位乘法累加(MAC)信號處理功能與通用型微控制器所具有的易用性組合在一起。這種組合使Blackfin處理器能夠在信號處理和控制處理應(yīng)用中發(fā)揮最佳的性能。且Blackfin處理器通過將工業(yè)標(biāo)準(zhǔn)接口與高性能的信號處理內(nèi)核相結(jié)合在一起,用戶可以快速設(shè)計(jì)出節(jié)省成本的解決方案,而且無需昂貴的外部組件。

      本開發(fā)系統(tǒng)采用BF533,BF533是主頻高達(dá)600 MHz、峰值處理能力為1.2 GMI/s的高性能Blackfin處理器。BF533內(nèi)核包含2個(gè)16位MAC、2個(gè)40位ALU、4個(gè)8位視頻ALU以及1個(gè)40位移位器。另外,BF533還包括1個(gè)UART口、1個(gè)SPI口、2個(gè)串行口(SPORT)、4個(gè)通用定時(shí)器(其中3個(gè)具有PWM功能)、1個(gè)實(shí)時(shí)時(shí)鐘、看門狗定時(shí)器以及1個(gè)并行外設(shè)接口。外部存儲器控制器可與SDRAM、SRAM、Flash和ROM實(shí)現(xiàn)無縫連接[2]。

      2.2 系統(tǒng)硬件平臺簡介

      本系統(tǒng)的開發(fā)板硬件系統(tǒng)如圖1所示。

      20070913112424.bmp

      目標(biāo)板以Blackfin嵌入式處理器為核心,數(shù)據(jù)地址線復(fù)用到SDRAM、Flash、USB、Ethernet,并通過FPGA實(shí)現(xiàn)邏輯控制。此外,將UART端口轉(zhuǎn)換為RS232端口引出。其中SDRAM的地址為0x00000000~0x02000000,F(xiàn)lash的地址為0x20000000~0x20300000。

      宿主機(jī)采用Window和Suse10.0雙操作系統(tǒng),采用串行接口和以太網(wǎng)連接宿主機(jī)和目標(biāo)板,程序先在宿主機(jī)上編譯,然后下載至目標(biāo)板上運(yùn)行,目標(biāo)板的終端被重定向到串行接口,由宿主機(jī)輸出。

      2.3 開發(fā)環(huán)境的建立

      2.3.1 在宿主機(jī)上設(shè)置終端

      大部分嵌入式系統(tǒng)在宿主機(jī)大多都采用kermit或minaicom實(shí)現(xiàn)與目標(biāo)板的通信,本系統(tǒng)采用inicom。minicom是Linux下一個(gè)類似于Windows超級終端的友好串口通信程序。在終端輸入bash#minicom-s進(jìn)入minicom設(shè)置畫面,設(shè)置串口波特率、有效數(shù)據(jù)位、停止位以及奇偶校驗(yàn)位分別為57 600、8 bit、1位停止位以及無奇偶校驗(yàn)位等。

      2.3.2安裝交叉編譯器

      交叉編譯是在一個(gè)架構(gòu)下編譯另外一個(gè)架構(gòu)的目標(biāo)文件。要從http://blackfin.網(wǎng)站上下載Blackfin ToolChain,然后安裝并修改環(huán)境變量PATH,使其包含ToolChain的安裝目錄。
      20070913112445.jpg

      3 U-Boot啟動兩階段

      U-Boot代碼一般分為stage1和stage2兩大部分。stage1依賴于cpu體系結(jié)構(gòu)如設(shè)備初始化代碼,常用匯編語言編寫以達(dá)到短小精悍,提高系統(tǒng)運(yùn)行效率的目的。它主要包括cpu/bf533目錄下的start.s。stage2一般采用C語言編寫實(shí)現(xiàn)復(fù)雜功能,這樣代碼則具有更好的可讀性和可移植性,主要包括lib blackfin/board.c文件和common/main.c文件中main_loop函數(shù)。

      stagel從cpu入口函數(shù)cpu/bf533/start.s開始,通常包含以下步驟:

      (1)基本硬件的初始化,為隨后執(zhí)行kernel準(zhǔn)備好基本的硬件環(huán)境。包括:屏蔽所有中斷,引導(dǎo)裝載程序的執(zhí)行過程中不必執(zhí)行任何中斷,中斷屏蔽可通過寫cpu的中斷屏蔽寄存器或狀態(tài)寄存器實(shí)現(xiàn);設(shè)置cpu的速度和時(shí)鐘頻率,初始化pll;RAM初始化,初始化內(nèi)存控制器的各個(gè)寄存器;初始化UART,向串口打印U-Boot的字符信息;關(guān)閉cpu內(nèi)部指令,數(shù)據(jù)cache。

      (2) 為加載U-Boot的stage2準(zhǔn)備RAM空間,通常將stage2置于整個(gè)RAM空間的最頂層1 MB空間。

      (3)拷貝U-Boot的stage2到RAM。判斷是否是Flash運(yùn)行,如果是就將stage2的代碼拷貝到TEXT BASE處。將stage2安排到RAM空間的最頂層1 MB是較推薦的方法。

      (4)設(shè)置堆棧指針sp為C語言代碼執(zhí)行做好準(zhǔn)備。

      (5)跳轉(zhuǎn)到stage2的C語言代碼入口點(diǎn)。

      stage2主要包括lib-blackfin/board.c中board_init_f、board_init_r函數(shù)以及common/main.C中main_loop函數(shù)。通常包含以下步驟:

      (1)初始化此階段需用的硬件設(shè)備,由board_init_f和board_init_r函數(shù)實(shí)現(xiàn)。
      20070913112503.jpg

      (2)內(nèi)存映射檢測。

      (3)加載內(nèi)核并為內(nèi)核設(shè)置啟動參數(shù)。

      (4)調(diào)用內(nèi)核。

      4 U-BOOt的移植

      4.1 U-Boot方法與要點(diǎn)

      移植U-Boot簡便的方法是從U-Boot支持的開發(fā)板中選擇一個(gè)與其目標(biāo)板接近的開發(fā)板進(jìn)行修改。需修改的是與硬件相關(guān)的部分,涉及到兩個(gè)層面:針對CPU的移植,由于U-Boot_1.1.3支持BF533,故只需做第二層面的移植:針對目標(biāo)板硬件的移植。在移植前,需仔細(xì)閱讀U-Boot/readme文件,該文件對目錄結(jié)構(gòu)和如何移植作了簡要介紹。從移植U-Boot的最小要求、U-Boot能夠正常啟動的角度出發(fā),選擇BF533的STAMP板為模板,相關(guān)源代碼在/board/stamp目錄下,結(jié)合U-Boot的啟動流程,主要修改文件如下:

      (1)與目標(biāo)板相關(guān)的代碼部分:在board下創(chuàng)建mybf533目錄,無需從頭開始,參考與目標(biāo)板相似的STAMP板在mybf533目錄下創(chuàng)建mybf533.c、mybf533.h、flash.c、config.mk、Makefie等文件。需要修改/board/mybf533/config.mk:
      20070913112520.jpg

      TFEXT_BASE用于設(shè)置程序編譯鏈接的起始地址即將U-Boot的stage2拷貝到SDRAM的TEXT_BASE處,即SDRAM最頂層一段存儲區(qū)。修改board/mybf533/Makefile:
      20070913112536.jpg
      (2)與CPU相關(guān)的代碼部分:U-Boot_1.1.3/epu文件中含有BF533的目錄,其中包含start.s、cpu.c、cpu.h、interrupt.c、init_sdram.s等。故不需要建立與cpu相關(guān)的文件目錄。

      (3)與頭文件相關(guān)的代碼:在include/configs創(chuàng)建mybf533.h,參考include/configs/stamp.h,如下:
      20070913112557.jpg
      Flash的修改與具體型號和容量有關(guān),修改過程中參考Flash擦除數(shù)據(jù)命令、特定寄存器的寫入地址以及扇區(qū)的大小和位置。

      與SDRAM相關(guān)設(shè)置:
      20070913112615.jpg
      20070913112714.jpg
      注意:最后一行要用Tab鍵開頭表示命令。其中blackfin表示CPU的種類.bf533是cpu bf533對應(yīng)的代碼目錄,mybf533是目標(biāo)板對應(yīng)的目錄。這樣可使用make mybf533_config配置自身的開發(fā)板。

      其他修改視情況而定。如根據(jù)SDRAM大小修改cplb表,根據(jù)需要修改堆棧大小。如drivers/cfi_flash.c中flash_init()函數(shù),cpu/bf533/ints.c中init_IRQ()函數(shù)等。

      修改完畢后就可以采用如以下命令編譯U-Boot:bash$>make clean,bash$>make mrproper,bash$>make mybf533_config,bash$>make。

      編譯完后U-Boot_1.1.3生成U-Boot的二進(jìn)制文件U-Boot.bin(U-Boot.bin只能用于更新)。執(zhí)行bash$>bfin-uclinux-objcopy-I binary-Oihex U-Boot.bin,生成可在Windows下首次燒寫到Flash的十六進(jìn)制文件U-Boot.hex。
      4.2 U-Boot的燒寫

      第一次下載U-Boot到目標(biāo)板或者當(dāng)U-Boot不能正常啟動時(shí)。必須通過JTAG或者ADI ICE將U-Boot下載到目標(biāo)板。在此可將ADI公司的仿真器與Visual DSP++環(huán)境相連,通過Visual DSP++,在TOOLS-->Flash Programmer下執(zhí)行Flash驅(qū)動程序M25P64.dxe,選擇"Erase all"-->Load Flie燒寫U-Boot.hex文件到Flash中。

      移植成功后,打開終端minicom復(fù)位開發(fā)板,若串口能輸出正確的啟動信息.則表明移植基本成功。啟動后,如果在設(shè)定的時(shí)間內(nèi),串口沒有接收到按鍵。U-Boot將自動加載操作系統(tǒng)內(nèi)核和文件系統(tǒng)。若設(shè)定時(shí)間內(nèi)串口接收到按鍵,則U-Boot停止自動加載,進(jìn)入命令行,可看到U-Boot的提示符"mybf533>",查看Flash信息,調(diào)試或手動加載內(nèi)核。

      生成新的U-Boot.bin文件后??赏ㄟ^Ethernet或者串口更新U-Boot。因?yàn)榫W(wǎng)絡(luò)的傳輸速度遠(yuǎn)比串口快,故一般選擇網(wǎng)絡(luò)傳輸。將新生成的U-Boot.bin拷貝到宿主機(jī)根目錄下的tftpboot目錄(前提是已經(jīng)創(chuàng)建tftp sever),在目標(biāo)板出現(xiàn)U-Boot提示符后。按任意鍵進(jìn)入下載模式:
      mybf533>tftp 0x1000000 U-Boot.bin

      0x1000000為SDRAM默認(rèn)的下載地址空間,用于U-Boot的升級、調(diào)試。當(dāng)需要升級或者修改U-Boot,可將新的U-Boot從SDRAM燒寫到。Flash,覆蓋原來的U-Boot,以減少燒寫Flash的次數(shù)。在燒寫以前最好測試一下所下載的U-Boot能否正常運(yùn)行:
      20070913112738.jpg

      如果不正確,應(yīng)重復(fù)執(zhí)行Erase all和Copy命令,直到正確為止。至此,U-Boot移植的步驟已基本完成。

      5 結(jié)束語

      U-Boot是一個(gè)功能強(qiáng)大的Boot loader。前期移植工作是嵌入式系統(tǒng)開發(fā)的首要環(huán)節(jié)。但其移植不可避免的存在一些難以預(yù)料的問題。嵌入式開發(fā)人員應(yīng)該在了解U-Boot的工作機(jī)理、移植條件后,根據(jù)目標(biāo)板和具體情況靈活裁減U-Boot以提高操作系統(tǒng)移植的穩(wěn)定性,縮短移植周期,降低產(chǎn)品成本。

      本文結(jié)合U-Boot的運(yùn)行機(jī)理以及U-Boot移植的基本要求,研究了U-Boot在基于BF533的嵌入式系統(tǒng)上的移植。本文的移植是在不改變U-Boot框架前提下,對嵌入式目標(biāo)板和CPU相關(guān)代碼進(jìn)行修改,實(shí)現(xiàn)了成功移植且移植后的U-Boot能夠在目標(biāo)板上穩(wěn)定運(yùn)行,為后續(xù)開發(fā)奠定了良好的基礎(chǔ)。

      基于Blackfin嵌入式系統(tǒng)的U-boot分析與調(diào)試

      引言

      Boot loader代碼是CPU芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,主要用于完成硬件啟動到操作系統(tǒng)啟動的過渡,從而為操作系統(tǒng)提供基本的運(yùn)行環(huán)境。Boot loader代碼與CPU的內(nèi)核結(jié)構(gòu)、具體型號、應(yīng)用系統(tǒng)配置及操作系統(tǒng)有關(guān),其功能類似于PC機(jī)的BIOS程序。

      Blackfin DSP是美國模擬器件公司與Intel聯(lián)合開發(fā)的第4代DSP產(chǎn)品,是專為通信和互聯(lián)網(wǎng)應(yīng)用而設(shè)計(jì)的通用DSP芯片,適合處理互聯(lián)網(wǎng)中的大量圖像、聲音、文本和數(shù)據(jù)流,以及汽車電子中的可視系統(tǒng)、寬帶無線系統(tǒng)、消費(fèi)類多媒體電子、數(shù)字?jǐn)z像機(jī)、多通道VoIP、安全和監(jiān)督、機(jī)頂盒和視頻電話會議等。 本文對基于Blackfin 561微處理器構(gòu)建的嵌入式開發(fā)板EZKIT561的U-boot第一和第二階段的具體工作流程進(jìn)行了分析,畫出了各階段的流程圖,同時(shí)在U-boot第一階段代碼中加入LED指示程序來跟蹤第一階段的執(zhí)行情況;而在U-boot第二階段,則在代碼的相應(yīng)位置添加了向串口的打印信息,以跟蹤U-boot在此階段的執(zhí)行情況。

             1 Blackfin DSP簡介

      ADI公司推出的Blackfin處理器是專為嵌人式音頻、視頻、通信計(jì)算要求和功耗約束條件而設(shè)計(jì)的新型16~32位嵌入式處理器。Blackfin處理器由ADI和Intel聯(lián)合開發(fā),主要基于微信號架構(gòu)(MSA)。它將一個(gè)32位RISC型指令集和雙16位乘法累加(MAC)信號處理功能與通用型微控制器所具有的易用性組合在一起。這種處理特征使得Blackfin處理器在信號處理和控制處理應(yīng)用中均能發(fā)揮上佳作用,因而在許多場合可免除增設(shè)單獨(dú)異類處理器。

           2 Boot loader及U-boot簡介

      2.1 Boot loader簡介

      Boot loader是用于初始化目標(biāo)板硬件,可給嵌入式操作系統(tǒng)提供板上硬件資源信息,并進(jìn)行裝載、引導(dǎo)嵌人式操作系統(tǒng)運(yùn)行的固件。最終,Boot Loader會把操作系統(tǒng)內(nèi)核映像加載到RAM中,并將系統(tǒng)控制權(quán)傳遞給它。

      大多數(shù)Boot Loader都包含兩種不同的操作模式: "啟動加載"模式和"下載模式"。

      啟動加載(Boot loading)模式也稱"自主"(Autonomous)模式。即Boot Loader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行。這種模式是Boot Loader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,Boot Loader顯然必須工作在這種模式下。

      在下載(Downloading)模式下,目標(biāo)機(jī)上的Boot Loader將通過串口連接或網(wǎng)絡(luò)連接等手段從主機(jī)(Host)下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常先被Boot Loader保存到目標(biāo)機(jī)的RAM,然后再被Boot Loader寫到目標(biāo)機(jī)的FLASH等固態(tài)存儲設(shè)備中。Boot Loader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時(shí)使用;此外,以后的系統(tǒng)更新也會使用Boot Loader的這種模式。工作于這種模式下的Boot Loader通常都會向它的終端用戶提供一個(gè)簡單的命令行接口。

      2.2 U-boot簡介
      U-Boot(全稱U niversal Boot Loader)是遵循GPL條款的開放源碼項(xiàng)目。其源碼目錄和編譯形式與Linux內(nèi)核相似。事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動程序,這一點(diǎn)從U-Boot源碼的注釋中就能體現(xiàn)。目前支持的目標(biāo)操作系統(tǒng)有OpenBSD,NetBSD,F(xiàn)reeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS;這是U-Boot中Universal的一層含義,另外一層含義是U-Boot除了支持PowerPC系列處理器外,還能支持Black-fin、MIPS、x86、ARM、NIOS、XScale等諸多處理器。上述兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌人式操作系統(tǒng)。U-Boot的主要目錄結(jié)構(gòu)如表1所列。

           3 基于Blackfin DSP的U-boot運(yùn)行分析

      大多數(shù)Boot loader都分為stagel和stage2兩大部分,U-boot也是如此。

      3.1 U-boot的stagel階段

      依賴于CPU體系結(jié)構(gòu)的代碼(比如設(shè)備初始化代碼等),通常都放在stage1中,該代碼可用blackfin DSP匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。實(shí)際操作可在位于U-boot 1.1.3\cpu\bf533中的Start.S和Startl.S文件中實(shí)現(xiàn),而且是從Start.S開始運(yùn)行,此階段的程序流程圖如圖1所示。

      070927152338460.jpg

      070927152338821.jpg

      stage1的步驟以執(zhí)行的先后主要包括硬件設(shè)備初始化、為加載Boot Loader的stage2準(zhǔn)備RAM空間、拷貝Boot Loader的stage2到RAM空間、設(shè)置堆棧、跳轉(zhuǎn)到stag2的C入口等。

      3.2 U-boot的stage2階段

      通常stage2可用C語言來實(shí)現(xiàn)更復(fù)雜的功能,該代碼具有更好的可讀性和可移植性。Stage2實(shí)現(xiàn)的主要功能包括初始化本階段要使用到的硬件設(shè)備,檢測系統(tǒng)內(nèi)存映射(memory map),將ker-nel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中,為內(nèi)核設(shè)置啟動參數(shù),以及調(diào)用內(nèi)核等。

      而基于ADSP-BF561 EZKIT-Lite評估板的U-boot在該階段的啟動時(shí),首先在第一階段結(jié)束后,調(diào)用\U-boot 1.1.3\1ib_blackfin\board.c文件中的board_init_f()函數(shù)并執(zhí)行。

      然后再調(diào)用board.c文件中的board_init_r()函數(shù)并按先后順序執(zhí)行,其流程圖如圖2所示。

      070927152338982.jpg

      之后,再在board_init_r函數(shù)的最后調(diào)用\U-boot 1.1.3\common\main.c中的main_loop()函數(shù)。在執(zhí)行過程中,系統(tǒng)會首先對自動啟動內(nèi)核進(jìn)行倒計(jì)時(shí),倒計(jì)時(shí)的時(shí)間由環(huán)境變量bootdelay的設(shè)定值決定。由于先前已經(jīng)對串口進(jìn)行了初始化,所以會在windows超級終端打印"ezkit:>",這樣,mainloop()函數(shù)的執(zhí)行將產(chǎn)生兩條分支:一是等待u-boot的自啟動命令執(zhí)行,即執(zhí)行bootcmd環(huán)境變量所設(shè)定的自動運(yùn)行的命令(比如setenvbootcmd bootm 0x2000 0000),引導(dǎo)flash特定地址中的嵌入式操作系統(tǒng);二是在u-boot的自啟動命令執(zhí)行前按下任意鍵,以進(jìn)入u-boot的命令行。在此狀態(tài)下可以查看和修改環(huán)境變量、下載更新U-boot和內(nèi)核鏡像文件、對flash進(jìn)行擦寫操作或通過命令啟動操作系統(tǒng)(如bootm 0x2000 0000);

            4 基于評估板的U-boot啟動跟蹤調(diào)試

      4.1 第一階段跟蹤調(diào)試

      由于U-boot的啟動過程分為兩個(gè)階段,第一階段在串口初始化之前無法獲得字符串提示信息。這樣,第一階段的運(yùn)行過程似乎就沒辦法掌握.但是,EZKIT561開發(fā)板提供16個(gè)用戶可編程的LED,所以就可以通過這16個(gè)LED來了解u-boot在第一階段的具體執(zhí)行過程,即在U-boot第一階段的幾個(gè)不同的代碼處添加LED指示程序。

      ADSP-BF561有48個(gè)雙向通用可編程I/O引腳。這些可編程引腳具有實(shí)現(xiàn)SPI接口的特殊功能。每一個(gè)可編程引腳均能通過操作一系列的標(biāo)志控制寄存器、標(biāo)志狀態(tài)寄存器和標(biāo)志中斷寄存器來進(jìn)行獨(dú)立控制。由于一共有48個(gè)通用可編程I/O引腳,所以可將以上寄存器分成三組,每組可對16個(gè)通用可編程I/O引腳進(jìn)行操作。

      通過參考EZKIT56 1原理圖可知,LED 5~20與PF 32~47 pins相連,可以跟蹤堆棧配置。設(shè)計(jì)時(shí)可使用以下寄存器進(jìn)行控制。

      (1)FIO2_DIR寄存器

      這是一個(gè)16位寄存器,若將其中的某一位設(shè)置為1,那么相應(yīng)的PF引腳就可作為輸出;反之,則為輸入。其相關(guān)設(shè)置代碼如下:

      070927152339093.jpg

      (2)FIO2_FLAG_D

      這也是一個(gè)16位寄存器,對其寫操作時(shí),可指定相應(yīng)的PF引腳狀態(tài);而當(dāng)進(jìn)行讀操作時(shí),則返回相應(yīng)的PF引腳的值。它的每一位都控制著一個(gè)LED燈。其相關(guān)設(shè)置代碼如下:

      070927152339154.jpg

      w [p0]=r0;
      ssync;

      添加的跟蹤堆棧配置程序的流程圖如圖3所示。修改代碼后即可在U-boot文件夾路徑下依次輸入以下命令:make clean、make mrproper、make ezkit561 config和make,然后再利用bfin-u.clinux-objcopy將生成的U-boot.bin轉(zhuǎn)換為U-boot.hex,最后通過VDSP++開發(fā)環(huán)境中TOOL下的flashprogrammer將u-boot.hex燒寫到flash中,同時(shí)進(jìn)行復(fù)位操作以觀察LED的變化。

      070927152339215.jpg

      本設(shè)計(jì)希望在堆棧配置前使LED 13、LED 14亮,其它LED滅,持續(xù)時(shí)間為1 s;而在堆棧分配之后使LED 11、LED 12亮,其它LED滅,持續(xù)時(shí)間為1 s。其實(shí)際的觀察結(jié)果是,在復(fù)位之后,LED 13、LED 14持續(xù)亮1 s,接著LED 11、LED 12持續(xù)亮1秒,可見其完全達(dá)到了預(yù)期目標(biāo)。

      4.2 第二階段跟蹤調(diào)試

      第二階段是在進(jìn)人C函數(shù)之后,就進(jìn)行串口的初始化。之后,便可通過向串口打印信息來實(shí)時(shí)跟蹤所啟動的執(zhí)行流程,以了解程序目前執(zhí)行的具體部分或運(yùn)行到哪一個(gè)階段出現(xiàn)了問題。

      下面以打印串口初始化完成信息為例。首先在U-boot第二階段找到串口初始化的代碼,即U-boot/lib-blackfin/board.c文件的serial.init()函數(shù),然后在此函數(shù)之后添加printf("serial initializationis ok!\n")以實(shí)現(xiàn)打印。其程序代碼如下:

      070927152339316.jpg

      070927152339397.jpg

      修改代碼后的編譯和下載步驟如前所示,調(diào)試時(shí)使用的串行通信軟件是windows自帶的"超級終端"程序,所選擇的"每秒位數(shù)" (即波特率)為57600,傳輸文件使用的通信協(xié)議為Kermit協(xié)議。配置好超級終端后,按下開發(fā)板上的復(fù)位鍵.終端便可顯示出系統(tǒng)啟動過程的相關(guān)信息。系統(tǒng)復(fù)位后,第一行顯示的是"serial initializa-tion is ok!"。這便是自行添加的打印語句,其主要功能是提示串口初始化已完成。

      由于第二階段可以通過串口打印信息,且在相關(guān)的每一階段均可添加相關(guān)的printf句來實(shí)現(xiàn)打印提示信息,所以跟蹤及調(diào)試都比較容易。

        5 結(jié)束語

      通過分析基于Blackfin 561微處理器構(gòu)建的嵌入式開發(fā)板EZKIT561的U-boot代碼,以期對Boot Loader的啟動過程有一個(gè)比較深入的理解,文章還通過一些調(diào)試方法對其運(yùn)行階段進(jìn)行跟蹤,以便對將來在開發(fā)板上的ucLinux移植和進(jìn)一步的視頻編解碼工作進(jìn)行準(zhǔn)備。

      轉(zhuǎn)載于:https://www.cnblogs.com/intellisys/archive/2009/11/10/1599879.html

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多