<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)境

          二、移植步驟

          4)準(zhǔn)備進(jìn)入u-boot的第二階段(在u-boot中添加對(duì)我們開發(fā)板上Nor Flash的支持)。
          通常,在嵌入式bootloader中,有兩種方式來(lái)引導(dǎo)啟動(dòng)內(nèi)核:從Nor Flash啟動(dòng)和從Nand Flash啟動(dòng)。u-boot中默認(rèn)是從Nor Flash啟動(dòng),再?gòu)纳弦还?jié)這個(gè)運(yùn)行結(jié)果圖中看,還發(fā)現(xiàn)幾個(gè)問題:第一,我開發(fā)板的Nor Flash是2M的,而這里顯示的是512kB;第二,出現(xiàn)Warning - bad CRC, using default environment的警告信息。不是u-boot默認(rèn)是從Nor Flash啟動(dòng)的嗎?為什么會(huì)有這些錯(cuò)誤信息呢?這是因?yàn)槲覀冞€沒有添加對(duì)我們自己的Nor Flash的支持,u-boot默認(rèn)的是其他型號(hào)的Nor Flash,而我們的Nor Flash的型號(hào)是SST39VF1601。另外怎樣將命令行提示符前面的SMDK2410變成我自己定義的呢?

          下面我們一一來(lái)解決這些問題,讓u-boot完全對(duì)我們Nor Flash的支持。首先我們修改頭文件代碼如下:

          #gedit include/configs/my2440.h //修改命令行前的名字和Nor Flash參數(shù)部分的定義

          #define CONFIG_SYS_PROMPT "[MY2440]#" //將命令行前的名字改成[MY2440]

          /*-----------------------------------------------------------------------
          * FLASH and environment organization
          */
          #if 0//注釋掉下面兩個(gè)類型的Nor Flash設(shè)置,因?yàn)椴皇俏覀兯褂玫男吞?hào)
          #define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
          #define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
          #endif

          #defineCONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */

          #ifdef CONFIG_AMD_LV800
          #definePHYS_FLASH_SIZE 0x00100000 /* 1MB */
          #defineCONFIG_SYS_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
          #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x0F0000)/* addr of environment */
          #endif
          #ifdef CONFIG_AMD_LV400
          #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
          #define CONFIG_SYS_MAX_FLASH_SECT (11)/* max number of sectors on one chip */
          #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)/* addr of environment */
          #endif
          #defineCONFIG_SST_39VF1601 1//添加mini2440開發(fā)板Nor Flash設(shè)置
          #definePHYS_FLASH_SIZE 0x200000//我們開發(fā)板的Nor Flash是2M
          #defineCONFIG_SYS_MAX_FLASH_SECT (512)//根據(jù)SST39VF1601的芯片手冊(cè)描述,對(duì)其進(jìn)行操作有兩種方式:塊方式和扇區(qū)方式?,F(xiàn)采用扇區(qū)方式(sector),1 sector = 2Kword = 4Kbyte,所以2M的Nor Flash共有512個(gè)sector
          #defineCONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x040000)//暫設(shè)置環(huán)境變量的首地址為0x040000(即:256Kb)

          然后添加對(duì)我們mini2440開發(fā)板上2M的Nor Flash(型號(hào)為SST39VF1601)的支持。在u-boot中對(duì)Nor Flash的操作分別有初始化、擦除和寫入,所以我們主要修改與硬件密切相關(guān)的三個(gè)函數(shù)flash_init、flash_erase、write_hword,修改代碼如下:

          #gedit board/samsung/my2440/flash.c

          //修改定義部分如下:

          //#define MAIN_SECT_SIZE 0x10000
          #define MAIN_SECT_SIZE 0x1000//定義為4k,剛好是一個(gè)扇區(qū)的大小

          //#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
          //#define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))
          #define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE +(0x00005555 << 1))) //這兩個(gè)參數(shù)看SST39VF1601手冊(cè)
          #define MEM_FLASH_ADDR2 (*(volatileu16 *)(CONFIG_SYS_FLASH_BASE +(0x00002AAA << 1)))

          //修改flash_init函數(shù)如下:
          #elif defined(CONFIG_AMD_LV800)
          (AMD_MANUFACT & FLASH_VENDMASK)|
          (AMD_ID_LV800B & FLASH_TYPEMASK);
          #elifdefined(CONFIG_SST_39VF1601)//在CONFIG_AMD_LV800后面添加CONFIG_SST_39VF1601
          (SST_MANUFACT & FLASH_VENDMASK)|
          (SST_ID_xF1601 & FLASH_TYPEMASK);

          for(j = 0; j < flash_info[i].sector_count; j++){
          //if (j <= 3) {
          // /* 1st one is 16 KB */
          // if (j == 0) {
          // flash_info[i].start[j] = flashbase + 0;
          // }

          // /* 2nd and 3rd are both 8 KB */
          // if ((j == 1) || (j == 2)) {
          // flash_info[i].start[j] = flashbase + 0x4000 + (j - 1) * 0x2000;
          // }

          // /* 4th 32 KB */
          // if (j == 3) {
          // flash_info[i].start[j] = flashbase + 0x8000;
          // }
          //} else {
          // flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
          //}

          flash_info[i].start[j]= flashbase + j * MAIN_SECT_SIZE;
          }

          //修改flash_print_info函數(shù)如下:

          case(AMD_MANUFACT & FLASH_VENDMASK):
          printf("AMD: ");
          break;
          case(SST_MANUFACT & FLASH_VENDMASK)://添加SST39VF1601的
          printf("SST:");
          break;

          case(AMD_ID_LV800B & FLASH_TYPEMASK):
          printf("1x Amd29LV800BB (8Mbit)n");
          break;
          case(SST_ID_xF1601 & FLASH_TYPEMASK)://添加SST39VF1601的
          printf("1x SST39VF1610 (16Mbit)n");
          break;

          //修改flash_erase函數(shù)如下:
          //if ((info->flash_id & FLASH_VENDMASK) !=
          // (AMD_MANUFACT & FLASH_VENDMASK)) {
          // return ERR_UNKNOWN_FLASH_VENDOR;
          //}
          if((info->flash_id & FLASH_VENDMASK)!=
          (SST_MANUFACT & FLASH_VENDMASK)){
          return ERR_UNKNOWN_FLASH_VENDOR;
          }

          ///* wait until flash is ready */
          //chip = 0;
          //do {
          // result = *addr;
          // /* check timeout */
          // if (get_timer_masked () >
          // CONFIG_SYS_FLASH_ERASE_TOUT) {
          // MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
          // chip = TMO;
          // break;
          // }

          // if (!chip
          // && (result & 0xFFFF) & BIT_ERASE_DONE)
          // chip = READY;

          // if (!chip
          // && (result & 0xFFFF) & BIT_PROGRAM_ERROR)
          // chip = ERR;
          //} while (!chip);

          //MEM_FLASH_ADDR1 = CMD_READ_ARRAY;

          //if (chip == ERR) {
          // rc = ERR_PROG_ERROR;
          // goto outahere;
          //}

          //if (chip == TMO) {
          // rc = ERR_TIMOUT;
          // goto outahere;
          //}
          while(1)
          {
          if((*addr & 0x40)!=(*addr & 0x40))
          continue;

          if(*addr & 0x80)
          {
          rc = ERR_OK;
          break;
          }
          }

          //修改write_hword函數(shù)如下:
          MEM_FLASH_ADDR1 = CMD_UNLOCK1;
          MEM_FLASH_ADDR2 = CMD_UNLOCK2;
          //MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
          MEM_FLASH_ADDR1 = CMD_PROGRAM;
          //*addr = CMD_PROGRAM;
          *addr = data;

          ///* wait until flash is ready */
          //chip = 0;
          //do {
          // result = *addr;
          // /* check timeout */
          // if (get_timer_masked () > CONFIG_SYS_FLASH_ERASE_TOUT) {
          // chip = ERR | TMO;
          // break;
          // }

          // if (!chip && ((result & 0x80) == (data & 0x80)))
          // chip = READY;

          // if (!chip && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) {
          // result = *addr;

          // if ((result & 0x80) == (data & 0x80))
          // chip = READY;
          // else
          // chip = ERR;
          // }
          //} while (!chip);

          //*addr = CMD_READ_ARRAY;

          //if (chip == ERR || *addr != data)
          // rc = ERR_PROG_ERROR;
          while(1)
          {
          if((*addr & 0x40)!=(*addr & 0x40))
          continue;

          if((*addr & 0x80)==(data & 0x80))
          {
          rc = ERR_OK;
          break;
          }
          }

          修改完后重新編譯u-boot,下載到RAM中運(yùn)行結(jié)果如下圖:

          從運(yùn)行結(jié)果圖看,Nor Flash的大小可以正確檢測(cè)到了,命令行前面的名字也由原來(lái)的SMDK2410改成我自己定義的[MY2440]了,但是還會(huì)出現(xiàn)bad CRC的警告信息,其實(shí)這并不是什么問題,只是還沒有將環(huán)境變量設(shè)置到Nor Flash中,我們執(zhí)行一下u-boot的:saveenv命令就可以了。如下圖:

          再重新下載u-boot.bin文件到RAM中運(yùn)行,可以觀察到不會(huì)出現(xiàn)警告信息了,這時(shí)候u-boot已經(jīng)對(duì)我們開發(fā)板上的Nor Flash完全支持了。如下:



          關(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); })();