在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > u-boot-2012.04.01流程以及移植說明

            u-boot-2012.04.01流程以及移植說明

            作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
            結(jié)合:移植最新uboot的總結(jié)
            參考:u-boot2012.04.01移植到mini2440
            u-boot-2012.04.01流程以及移植說明
            從新制作一個(gè)單板:
            復(fù)制u-boot-2012.04.01/board/samsung目錄下的:smdk2410文件夾為smdk2440
            復(fù)制u-boot-2012.04.01/include/configs目錄下的:smdk2410.h文件為smdk2440.h
            在u-boot-2012.04.01/boards.cfg文件下復(fù)制65行,修改boards.cfg:
            仿照
            smdk2410 arm arm920t - samsung s3c24x0
            添加:
            smdk2440 arm arm920t - samsung s3c24x0
            然后重新配置一下:make smdk2440_config
            然后重新編譯一下:make
            1、設(shè)置管理模式:
            //
            // set the cpu to SVC32 mode
            //
            mrs r0, cpsr
            bic r0, r0, #0x1f
            orr r0, r0, #0xd3
            msr cpsr, r0
            2、關(guān)看門狗:
            // turn off the watchdog //
            # if defined(CONFIG_S3C2400)
            # define pWTCON 0x15300000
            # define INTMSK 0x14400008 // Interrupt-Controller base addresses //
            # define CLKDIVN 0x14800014 // clock divisor register //
            #else
            # define pWTCON 0x53000000
            # define INTMSK 0x4A000008 // Interrupt-Controller base addresses //
            # define INTSUBMSK 0x4A00001C
            # define CLKDIVN 0x4C000014 // clock divisor register //
            # endif
            ldr r0, =pWTCON
            mov r1, #0x0
            str r1, [r0]
            3、屏蔽中斷:
            //
            // mask all IRQs by setting all bits in the INTMR - default
            //
            mov r1, #0xffffffff
            ldr r0, =INTMSK
            str r1, [r0]
            # if defined(CONFIG_S3C2410)
            ldr r1, =0x3ff
            ldr r0, =INTSUBMSK
            str r1, [r0]
            # endif
            4、設(shè)置時(shí)鐘:
            //先屏蔽系統(tǒng)原有的時(shí)鐘設(shè)置-修改board_init_f:
            init_sequence
            board_early_init_f
            // to reduce PLL lock time, adjust the LOCKTIME register //
            //writel(0xFFFFFF, &clk_power->locktime);
            // configure MPLL //
            //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
            // &clk_power->mpllcon);
            #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
            #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
            // 設(shè)置時(shí)鐘 //
            ldr r0, =0x4c000014
            mov r1, #0x05
            str r1, [r0]
            // 如果HDIVN非0,CPU的總線模式應(yīng)該從“fast bus mode”變?yōu)?ldquo;asynchronous bus mode” //
            mrc p15, 0, r1, c1, c0, 0 // 讀出控制寄存器 //
            orr r1, r1, #0xc0000000 // 設(shè)置為“asynchronous bus mode” //
            mcr p15, 0, r1, c1, c0, 0 // 寫入控制寄存器 //
            ldr r0, =0x4c000004
            ldr r1, =S3C2440_MPLL_400MHZ
            str r1, [r0]
            // 啟動(dòng)ICACHE //
            mrc p15, 0, r0, c1, c0, 0 @ read control reg
            orr r0, r0, #(1<<12)
            mcr p15, 0, r0, c1, c0, 0 @ write it back
            5、設(shè)置SDRAM:
            bl cpu_init_crit
            ...........
            bl lowlevel_init
            修改lowlevel_init中為:
            .long 0x22011110 //BWSCON
            .long 0x00000700 //BANKCON0
            .long 0x00000700 //BANKCON1
            .long 0x00000700 //BANKCON2
            .long 0x00000700 //BANKCON3
            .long 0x00000740 //BANKCON4
            .long 0x00000700 //BANKCON5
            .long 0x00018005 //BANKCON6
            .long 0x00018005 //BANKCON7
            .long 00x008C04F4 //REFRESH
            .long 00x000000B1 //BANKSIZE
            .long 00x00000030 //MRSRB6
            .long 00x00000030 //MRSRB7
            6、初始化nand flash、重定位、清楚BSS段:
            bl nand_init_ll
            參考"畢業(yè)班第1課"的start.S, init.c(nand flash初始化、讀寫等操作)來(lái)修改代碼
            把init.c放入board/samsung/smdk2440目錄,修改init.c文件主要是加上static,
            修改u-boot鏈接地址CONFIG_SYS_TEXT_BASE為0x33f00000,u-boot.bin文件太大,0x33f80000不夠放
            //修改u-boot-2012.04.01u-boot-2012.04.01boardsamsungsmdk2440Makefile:
            COBJS := smdk2410.o init.o //COBJS表示C文件生成的.o文件
            //修改鏈接腳本,把start.S, init.c, lowlevel.S等文件放在最前面
            //(u-boot-2012.04.01u-boot-2012.04.01archarmcpuu-boot.lds):
            增加:board/samsung/smdk2440/libsmdk2440.o (.text)
            {
            __image_copy_start = .;
            CPUDIR/start.o (.text)
            board/samsung/smdk2440/libsmdk2440.o (.text)
            *(.text)
            }
            bl copy_code_to_sdram_ll //重定位
            bl clear_bss_ll //清除BSS
            注意:詳細(xì)代碼參考下面修改處。
            7、u-boot啟動(dòng)第二階段:給內(nèi)核傳遞參數(shù)
            call_board_init_f:
            ldr r0,=0x00000000
            bl board_init_f
            ldr r1, _TEXT_BASE
            bl board_init_r
            ..........
            修改board_init_f:
            //addr -= gd->mon_len;
            //addr &= ~(4096 - 1);
            addr = CONFIG_SYS_TEXT_BASE;
            //addr = _TEXT_BASE;不用函數(shù)計(jì)算得到的地址,強(qiáng)制設(shè)置u-boot的鏈接地址為0x33f00000
            修改board_init_f, 把relocate_code去掉
            //修改include/common.h文件中board_init_f的返回值是unsigned int
            返回:return (unsigned int)id;
            給board_init_r函數(shù)使用,并設(shè)置board_init_r函數(shù)第二個(gè)參數(shù):目的地址為_TEXT_BASE,即CONFIG_SYS_TEXT_BASE
            u-boot啟動(dòng)時(shí)SP指向SDRAM的剛開始低地址位置,在代碼重定位以后要從新設(shè)置棧指針SP,更改棧指針SP:
            在匯編start.S里添加:
            .globl base_sp
            base_sp:
            .long 0
            在函數(shù)board_init_f里調(diào)用時(shí)加上extern long base_sp;聲明即可當(dāng)做變量使用,最后把:
            base_sp = addr_sp;即可
            修改后:
            ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
            bic sp, sp, #7 // 8-byte alignment for ABI compliance //
            bl nand_init_ll
            mov r0, #0
            //ldr r1, =_start
            ldr r1, _TEXT_BASE
            //ldr r2, =__bss_start
            //sub r2, r2, r1
            ldr r2, _bss_start_ofs
            bl copy_code_to_sdram_ll //重定位
            bl clear_bss_ll //清除BSS
            ldr pc, =call_board_init_f //跳到SDRAM中運(yùn)行call_board_init_f
            // Set stackpointer in internal RAM to call board_init_f //
            call_board_init_f:
            ldr r0,=0x00000000
            bl board_init_f
            //unsigned int的值存在r0里, 正好給board_init_r
            ldr r1, _TEXT_BASE
            ldr sp, base_sp //重新設(shè)置棧
            // 調(diào)用第2階段的代碼
            bl board_init_r
            注意:上面三段代碼為另外手動(dòng)添加,因?yàn)閡-boot源碼中的:
            #ifdef CONFIG_NAND_SPL
            ldr r0, _nand_boot_ofs
            mov pc, r0
            _nand_boot_ofs:
            .word nand_boot
            #else
            ldr r0, _board_init_r_ofs
            adr r1, _start
            add lr, r0, r1
            add lr, lr, r9
            mov r0, r5
            mov r1, r6
            mov pc, lr
            _board_init_r_ofs:
            .word board_init_r - _start
            #endif
            這段代碼就是為了實(shí)現(xiàn)調(diào)用board_init_r的功能,故省略這一步直接跳過去運(yùn)行。
            8、跳到SDRAM中運(yùn)行call_board_init_f
            ldr pc, =call_board_init_f
            9、亂碼,查看串口波特率的設(shè)置,發(fā)現(xiàn)在get_HCLK里沒有定義CONFIG_S3C2440
            ①更改get_HCLK里沒有定義CONFIG_S3C2440
            board_init_f
            init_sequence
            serial_init
            serial_init_dev
            _serial_setbrg
            get_PCLK
            get_HCLK
            處理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
            #define CONFIG_S3C2440
            在smdk2440.h
            #ifdef CONFIG_CMD_NAND
            #define CONFIG_NAND_S3C2410
            解決辦法:暫時(shí)去掉如下行
            //#define CONFIG_CMD_NAND
            再次編譯,出現(xiàn)錯(cuò)誤:
            fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp:
            /home/share/jz2440/source/u-boot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info
            解決方法:將#define CONFIG_YAFFS2注釋掉
            10、去除編譯條件pie,在(u-boot-2012.04.01/u-boot-2012.04.01/arch/arm/config.mk)
            # LDFLAGS_u-boot += -pie
            11、修改代碼支持Nor Flash
            在board_init_r函數(shù)中:
            flash_size = flash_init();
            if (flash_size > 0) {
            # ifdef CONFIG_SYS_FLASH_CHECKSUM
            char *s = getenv("flashchecksum");
            print_size(flash_size, "");
            //
            // Compute and print flash CRC if flashchecksum is set to y
            //
            // NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
            //
            if (s && (*s == y)) {
            printf(" CRC: X", crc32(0,
            (const unsigned char *) CONFIG_SYS_FLASH_BASE,
            flash_size));
            }
            putc(n);
            # else // !CONFIG_SYS_FLASH_CHECKSUM //
            print_size(flash_size, "n");
            # endif // CONFIG_SYS_FLASH_CHECKSUM //
            }
            else {
            puts(failed);
            hang();
            }
            #endif
            上面代碼在nand flash啟動(dòng)時(shí)nor flash是沒有辦法訪問的,flash_init之后沒有找到nor flash,故打印失敗,程序卡死在hang();
            修改:當(dāng)程序找不到nor flash的時(shí)候繼續(xù)運(yùn)行:
            //puts(failed);
            //hang();
            分析:flash_init函數(shù),可以打開下面函數(shù)中的調(diào)試開關(guān):
            if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))
            flash_get_size(cfi_flash_bank_addr(i), i);
            #define DEBUG 1
            #define debug 1
            調(diào)試開關(guān)打開以后可以根據(jù)打印信息搜索:可知在數(shù)組jedec_table中缺少nor flash對(duì)應(yīng)的數(shù)組,對(duì)應(yīng)添加一項(xiàng):
            static const struct amd_flash_info jedec_table[] = {
            // JZ2440v2使用的MT29LV160DB */
            {
            .mfr_id = (u16)MX_MANUFACT, // 廠家ID
            .dev_id = 0X2249, // 設(shè)備ID
            .name = "MXIC MT29LV160DB",
            .uaddr = { // NOR flash看到解鎖地址
            [1] = MTD_UADDR_0x0555_0x02AA // x16
            },
            .DevSize = SIZE_2MiB, // 總大小
            .CmdSet = P_ID_AMD_STD,
            .NumEraseRegions= 4,
            .regions = {
            ERASEINFO(16*1024, 1),
            ERASEINFO(8*1024, 2),
            ERASEINFO(32*1024, 1),
            ERASEINFO(64*1024, 31),
            }
            },
            編譯后測(cè)試,發(fā)現(xiàn)提示flash扇區(qū)太多,可以搜索后修改CONFIG_SYS_MAX_FLASH_SECT為:128
            12、修改代碼支持Nand Flash
            u-boot已經(jīng)可以Nand啟動(dòng),但是并不表示u-boot啟動(dòng)以后可以對(duì)Nand Flash進(jìn)行讀寫操作。
            修改:
            include/configs/smdk2440.h: #define CONFIG_CMD_NAND
            把drivers/mtd/nand/s3c2410_nand.c復(fù)制為s3c2440_nand.c,
            同時(shí)修改Makefile文件,增加:
            COBJS-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
            //#define CONFIG_S3C2410 // specifically a SAMSUNG S3C2410 SoC //
            #define CONFIG_S3C2440 // specifically a SAMSUNG S3C2410 SoC //
            #ifdef CONFIG_CMD_NAND
            #ifdef CONFIG_S3C2410
            #define CONFIG_NAND_S3C2410
            #define CONFIG_SYS_S3C2410_NAND_HWECC
            #else
            #define CONFIG_NAND_S3C2440
            #define CONFIG_SYS_S3C2440_NAND_HWECC
            #endif
            #define CONFIG_SYS_MAX_NAND_DEVICE 1
            #define CONFIG_SYS_NAND_BASE 0x4E000000
            #endif
            分析源碼:
            bl board_init_r
            nand_init(); // go init the NAND //
            nand_init_chip(i);
            if (board_nand_init(nand)) //調(diào)用nand_init初始化nand flash
            修改:
            a、刪除:
            #ifdef CONFIG_S3C2410_NAND_HWECC
            #endif
            之間關(guān)于ECC的代碼。
            b、board_nand_init:
            struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();
            writel(readl(&clk_power->clkcon) | (1 << 4), &clk_power->clkcon);//使能nand flash控制器
            ...........
            #if 0
            cfg = S3C2410_NFCONF_EN;
            cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
            cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
            cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
            #endif
            // 初始化時(shí)序 //
            cfg = ((tacls-1)<<12)|((twrph0-1)<<8)|((twrph1-1)<<4);
            writel(cfg, &nand_reg->nfconf);
            // 使能NAND Flash控制器, 初始化ECC, 禁止片選 //
            writel((1<<4)|(1<<1)|(1<<0), &nand_reg->nfcont);
            ...........
            nand->select_chip = s3c2440_nand_select;
            // hwcontrol always must be implemented //
            nand->cmd_ctrl = s3c2440_hwcontrol;
            nand->dev_ready = s3c2440_dev_ready;
            c、s3c2440_hwcontrol:
            // ctrl : 表示做什么, 選中芯片/取消選中, 發(fā)命令還是發(fā)地址
            //
            // dat : 命令值或地址值
            static void s3c2440_hwcontrol(struct mtd_info *mtd, int dat, unsigned int ctrl)
            {
            struct s3c2440_nand *nand = s3c2440_get_base_nand();
            if (ctrl & NAND_CLE)
            {
            // 發(fā)命令 //
            writeb(dat, &nand->nfcmd);
            }
            else if(ctrl & NAND_ALE)
            {
            // 發(fā)地址 //
            writeb(dat, &nand->nfaddr);
            }
            }
            d、增加函數(shù)s3c2440_nand_select:
            static void s3c2440_nand_select(struct mtd_info *mtd, int chipnr)
            {
            struct s3c2440_nand *nand = s3c2440_get_base_nand();
            switch (chipnr) {
            case -1: // 取消選中 //
            nand->nfcont |= (1<<1);
            break;
            case 0: // 選中 //
            nand->nfcont &= ~(1<<1);
            break;
            default:
            BUG();
            }
            }
            e、s3c2440_dev_ready:
            struct s3c2440_nand *nand = s3c2440_get_base_nand();
            f、修改所有的s3c2410_nand為s3c2440_nand;
            注意USB燒寫方法:
            1、因?yàn)闆]有裁剪的u-boot達(dá)到500K,但是我們自帶的u-boot燒寫分區(qū)沒有這么大,所以不能使用u-boot來(lái)燒寫u-boot,只能使用u-boot里的指令來(lái)燒寫:
            燒寫到nand flash:
            usb 1 30000000
            用DNW發(fā)送文件過去
            nand erase 0 80000
            nand write 30000000 0 80000
            把開關(guān)撥到nand重啟有輸出,說明現(xiàn)在支持了nand啟動(dòng)
            燒寫到nor flash:
            usb 1 30000000 //1表示一直等待
            用DNW發(fā)送文件過去
            protect off all //解除norflash寫保護(hù)
            erase 0 7FFFF //擦除從0到0x7FFFF共0x80000個(gè)字節(jié)
            cp.b 30000000 0 80000 //從內(nèi)存0x30000000開始燒寫程序到norflash的0地址去,燒寫0X80000個(gè)字節(jié)
            2、新燒寫到nor flash的u-boot不支持USB燒寫,可以使用以下命令,用WINS自帶的超級(jí)終端下載燒寫,ymodem模式:
            loady 32000000 //此時(shí)運(yùn)行的是老的u-boot,棧指針在0x30000000,故不能下載到0x30000000
            protect off all
            erase 0 7ffff
            cp.b 32000000 0 80000
            reset
            3、修改好網(wǎng)卡后可以用tftp下載內(nèi)核:
            set ipaddr 192.168.48.100
            set ethaddr 00:0c:29:4d:e4:f4
            到這里先要在xp打開tptp服務(wù)器,服務(wù)器ip為192.168.48.103
            set serverip 192.168.48.103
            tftp 30000000 uImage
            bootm 30000000
            4、用tftp下載u-boot到nor flash,同樣可以用tftp下載u-boot到nand flash:
            set ipaddr 192.168.48.100
            set ethaddr 00:0c:29:4d:e4:f4
            到這里先要在xp打開tptp服務(wù)器,服務(wù)器ip為192.168.48.103
            set serverip 192.168.48.103
            tftp 30000000 u-boot.bin
            protect off all //解除norflash寫保護(hù)
            erase 0 3FFFF //新裁剪的u-boot只有200k,擦除從0到0x3FFFF共0x40000個(gè)字節(jié)
            cp.b 30000000 0 40000
            reset
            5、燒寫內(nèi)核:
            內(nèi)核打印出來(lái)的分區(qū)信息
            地址: 大小:
            0x00000000-0x00040000 : "bootloader"
            0x00040000-0x00060000 : "params"
            0x00060000-0x00260000 : "kernel"
            0x00260000-0x10000000 : "root"
            nand erase 60000 200000
            nand write 30000000 60000 200000
            tftp 30000000 uImage
            nand erase.part kernel
            nand write 30000000 kernel
            或:tftp 30000000 uImage;nand erase.part kernel;nand write 30000000 kernel
            6、燒寫200K的u-boot
            燒寫到nand flash:
            tftp 30000000 u-boot.bin
            nand erase 0 40000
            nand write 30000000 0 40000
            或:tftp 30000000 u-boot.bin;nand erase 0 40000;nand write 30000000 0 40000
            把開關(guān)撥到nand重啟有輸出,說明現(xiàn)在支持了nand啟動(dòng)
            注意:nor flash啟動(dòng)的u-boot既可以燒寫nor flash本身也可以燒寫nand flash,但是如果是nand flash啟動(dòng)的話就沒辦法操作nor flash,因?yàn)閚and flash啟動(dòng)的時(shí)候0地址對(duì)應(yīng)片內(nèi)內(nèi)存,無(wú)法訪問nor flash;
            使用tftp工具下載時(shí),文件不能在中文路徑下,否則下載的時(shí)候找不到文件導(dǎo)致下載失敗。
            燒寫文件時(shí)文件實(shí)際的大小可以在文件下載完成后看到,或則用:$filesize,老版本的要帶括號(hào),即$(filesize)
            命令行設(shè)置bootcmd:set bootcmd nand read 30000000 kernel;bootm 30000000
            13、修改代碼支持DM9000網(wǎng)卡:
            DM9000源碼在drivers/net目錄下面,查看其Makefile文件,可以知道只有配置CONFIG_DRIVER_DM9000才能支持DM9000
            在配置文件:/include/configs/smdk2440.h文件內(nèi)找到CONFIG_CS8900,去掉,添加CONFIG_DRIVER_DM9000
            在編譯,根據(jù)錯(cuò)誤找找原因,發(fā)現(xiàn)沒有定義DM9000_DATA,查找DM9000_DATA參考別的源碼定義:
            #define CONFIG_DRIVER_DM9000
            #define CONFIG_DM9000_BASE 0x20000000
            #define DM9000_IO CONFIG_DM9000_BASE
            #define DM9000_DATA CONFIG_DM9000_BASE + 4
            設(shè)置內(nèi)存控制器位寬等發(fā)送數(shù)據(jù)時(shí)序參數(shù):
            .long 0x22011110 //BWSCON
            .long 0x00000700 //BANKCON0
            .long 0x00000700 //BANKCON1
            .long 0x00000700 //BANKCON2
            .long 0x00000700 //BANKCON3
            .long 0x00000740 //BANKCON4 ,修改這里
            編譯燒寫:根據(jù)提示找到board.c里面的初始化函數(shù)調(diào)用的依然是CS8900初始化函數(shù):
            eth_initialize(gd->bd);
            if (board_eth_init != __def_eth_init)
            #ifdef CONFIG_CMD_NET
            int board_eth_init(bd_t *bis)
            {
            int rc = 0;
            #ifdef CONFIG_CS8900
            rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
            #endif
            return rc;
            }
            #endif
            故增加:
            #ifdef CONFIG_DRIVER_DM9000
            rc = dm9000_initialize(bis);
            #endif
            在編譯燒寫測(cè)試,設(shè)置ipaddr,ethaddr參數(shù),設(shè)置完成以后ping,但此時(shí)設(shè)置參數(shù)不要保存,因?yàn)閰?shù)的保存地址沒有設(shè)置,測(cè)試可以用TFTP工具來(lái)下載內(nèi)核
            14、易用性修改/裁剪系統(tǒng):
            搜索u-boot啟動(dòng)信息中的CRC報(bào)警:“using default environment”即可找到在common/Env_common.c中有默認(rèn)環(huán)境變量數(shù)組:default_environment[],其中bootargs=CONFIG_BOOTARGS、bootcmd=CONFIG_BOOTCOMMAND為傳給內(nèi)核的啟動(dòng)參數(shù),要手動(dòng)在在配置文件:/include/configs/smdk2440.h文件中定義一下:
            #define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3" //表示文件系統(tǒng)在3分區(qū)
            #define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000" //規(guī)劃好分區(qū),知道內(nèi)核存在nand flash哪里之后才可以設(shè)置,u-boot根據(jù)這條命令啟動(dòng)內(nèi)核
            bootdelay:倒數(shù)計(jì)時(shí)時(shí)間長(zhǎng)度。
            ethaddr:可以在這設(shè)置
            ipaddr:可以在這設(shè)置
            #define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
            裁剪:
            修改配置文件:/include/configs/smdk2440.h
            從頭看那些是不需要的。
            屏蔽:CONFIG_USB_OHCI-----CONFIG_DOS_PARTITION
            CONFIG_CMD_DATE
            CONFIG_CMD_DHCP
            CONFIG_RTC...
            BOOTP
            CONFIG_CMD_USB
            file system都不要
            編譯u-boot文件變成200k,從新劃分區(qū),可以參照來(lái)的u-boot的分區(qū),老的分區(qū)可以啟動(dòng)內(nèi)核查看內(nèi)核啟動(dòng)信息或則:
            mtd //u-boot中使用mtd命令可以查看u-boot分區(qū)
            想知道需要定義哪些宏可以搜索"saveenv",知道在/common/Env_nand.c中可以查看其Makefile就知道要定義哪個(gè)宏了。
            #if 0
            //nor flash環(huán)境變量設(shè)置
            #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
            #define CONFIG_ENV_IS_IN_FLASH
            #define CONFIG_ENV_SIZE 0x10000
            #define CONFIG_ENV_OVERWRITE
            #else
            //nand flash環(huán)境變量設(shè)置
            #define CONFIG_ENV_IS_IN_NAND
            #define CONFIG_ENV_OFFSET 0x00040000
            #define CONFIG_ENV_SIZE 0x20000
            #define CONFIG_ENV_RANGE CONFIG_ENV_SIZE
            #endif
            增加mtd命令:
            搜索“mtdparts”,參考示例定義下面的宏分區(qū)
            cmd_mtdparts.c里,可以根據(jù)common的Makefile判斷需要定義哪個(gè)宏開關(guān),同時(shí)要手工添加執(zhí)行mtdparts_init,如下:
            #define CONFIG_CMD_MTDPARTS
            #define CONFIG_MTD_DEVICE
            #define MTDIDS_DEFAULT "nand0=jz2440-0" // 那一個(gè)設(shè)備 //
            #define MTDPARTS_DEFAULT "mtdparts=jz2440-0:256k(u-boot),"
            "128k(params),"
            "2m(kernel),"
            "-(rootfs)"
            在board.c里面:
            main_loop前面初始化:run_command("mtdparts default", 0); //要執(zhí)行:mtdparts default
            mtdparts_init();
            15、燒寫JFFS2:
            tftp 30000000 fs_mini_mdev.jffs2
            nand erase.part rootfs
            nand write.jffs2 30000000 0x00260000 5b89a8 //0x00260000是往哪燒寫,5b89a8是文件實(shí)際的大小,
            //這兩個(gè)參數(shù)不能用rootfs代替,因?yàn)閷?shí)際大小肯定比rootfs分區(qū)小,
            //直接用rootfs分區(qū)會(huì)把不相干的東西都燒寫進(jìn)去。
            或:tftp 30000000 fs_mini_mdev.jffs2;nand erase.part rootfs;nand write.jffs2 30000000 0x00260000 5b89a8
            set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
            set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 //增加串口波特率設(shè)置
            boot
            16、燒寫YAFFS:
            燒寫后發(fā)現(xiàn)出錯(cuò)(nand write.yaffs 30000000 260000 889bc0):
            NAND write: device 0 offset 0x260000, size 0x889bc0
            Unknown nand command suffix .yaffs.
            由于nand命令對(duì)應(yīng)cmd_nand.c文件,可知出錯(cuò)語(yǔ)句處宏CONFIG_CMD_NAND_YAFFS沒有定義
            修改配置文件:/include/configs/smdk2440.h增加:
            #define CONFIG_CMD_NAND_YAFFS
            再燒寫u-boot.bin來(lái)啟動(dòng)內(nèi)核發(fā)現(xiàn)啟動(dòng)不起來(lái),提示:
            VFS: Mounted root (yaffs2 filesystem).
            Freeing init memory: 140K
            Warning: unable to open an initial console.
            Kernel panic - not syncing: No init found. Try passing init= option to kernel.
            掛載成功但是缺少文件,可以用:
            nand dump 260000
            指令查看燒寫數(shù)據(jù),和fs_mini_mdev.yaffs2里的二進(jìn)制文件作比較,看看源文件和燒寫地址數(shù)據(jù)是否一致。
            修改:drivers/mtd/nand/Nand_util.c
            nand_write_skip_bad函數(shù):
            a、
            rval = nand->write_oob(nand, offset, &ops);
            if(rval) //原為:if(!rval)
            break;
            b、
            ops.mode = MTD_OOB_RAW;
            c、
            在driversmtdnandNand_util.c文件中把:
            if (!need_skip && !(flags & WITH_DROP_FFS)) {
            改為
            if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {
            d、燒寫:
            更新nor flash里的UBOOT:
            tftp 30000000 u-boot.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000
            reset
            燒寫YAFFS:
            tftp 30000000 fs_mini_mdev.yaffs2
            nand erase.part rootfs
            nand write.yaffs 30000000 260000 889bc0 //0x00260000是往哪燒寫,889bc0是文件實(shí)際的大小,
            //這兩個(gè)參數(shù)不能用rootfs代替,因?yàn)閷?shí)際大小肯定比rootfs分區(qū)小,
            //直接用rootfs分區(qū)會(huì)把不相干的東西都燒寫進(jìn)去。
            或:tftp 30000000 fs_mini_mdev.yaffs2;nand erase.part rootfs;nand write.yaffs 30000000 260000 889bc0
            set bootargs console=ttySAC0 root=/dev/mtdblock3
            //yaffs文件系統(tǒng)不用指定rootfstype=yaffs,它會(huì)自動(dòng)去找,去匹配。
            set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 //增加串口波特率設(shè)置
            //set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=yaffs
            //set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs //增加串口波特率設(shè)置
            boot
            17、制作補(bǔ)丁:
            make distclean
            rm u-boot.dis
            cd ..
            mv u-boot-2012.04.01 u-boot-2012.04.01_100ask
            tar xjf u-boot-2012.04.01.tar.bz2
            diff --help
            diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask_colin.patch
            diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch
            怎么用這個(gè)補(bǔ)丁:
            cd u-boot-2012.04.01
            patch -p1 < ../u-boot-2012.04.01_100ask_colin.patch
            make smdk2440_config
            make
            最重要的一點(diǎn):
            修改NFS.C里面的#define NFS_TIMEOUT (10*2000UL)



            關(guān)鍵詞: u-boot流程移植說

            評(píng)論


            相關(guān)推薦

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

            關(guān)閉