新聞中心

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

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

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

        二、移植步驟

        4)準(zhǔn)備進(jìn)入u-boot的第二階段(在u-boot中添加對(duì)我們開發(fā)板上Nor Flash的支持)。
        通常,在嵌入式bootloader中,有兩種方式來引導(dǎo)啟動(dòng)內(nèi)核:從Nor Flash啟動(dòng)和從Nand Flash啟動(dòng)。u-boot中默認(rèn)是從Nor Flash啟動(dòng),再從上一節(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變成我自己定義的呢?

        下面我們一一來解決這些問題,讓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ū)方式。現(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è)到了,命令行前面的名字也由原來的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)閉
        主站蜘蛛池模板: 无棣县| 东港市| 朝阳市| 社旗县| 原平市| 上栗县| 阿克陶县| 阿尔山市| 新泰市| 明水县| 南城县| 舞阳县| 襄樊市| 黄浦区| 闽侯县| 卢龙县| 济南市| 嘉义县| 区。| 噶尔县| 钟祥市| 关岭| 德格县| 蓝田县| 寿光市| 蒙自县| 平远县| 无极县| 宾川县| 成安县| 华阴市| 辰溪县| 哈密市| 济宁市| 壤塘县| 江安县| 左贡县| 三都| 深水埗区| 宿迁市| 固阳县|