新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 移植u-boot 1.1.6到TQ2440開發(fā)板-第二階段

        移植u-boot 1.1.6到TQ2440開發(fā)板-第二階段

        作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        經(jīng)過了第一階段的修改,目前能夠編譯出uboot.bin文件,但是這個(gè)文件還不能支持TQ2440,因?yàn)槲覀兪窃趕mdk2410上移植,代碼還是支持smdk2410,因此要開始第二階段的修改

        本文引用地址:http://www.104case.com/article/201611/322000.htm

        移植u-boot 1.1.6到TQ2440開發(fā)板-第二階段

        增加uboot對(duì)TQ2440的代碼支持

        第一步:修改 SDRAM 配置,修改u-boot-1.1.6/board/TQ2440目錄lowlevel_init.S文件

        第54行

        #define B1_BWSCON(DW16)
        #define B2_BWSCON(DW16)
        #define B3_BWSCON(DW16 + WAIT + UBLB)
        #define B4_BWSCON(DW16)
        #define B5_BWSCON(DW8)
        #define B6_BWSCON(DW32)
        #define B7_BWSCON(DW32)

        第126行

        #define REFCNT4F4

        第二步:時(shí)鐘設(shè)置,S3c2440 的時(shí)鐘計(jì)算公式和 s3c2410 不一樣,對(duì)于 s3c2440 開發(fā)板,將 PCLK 設(shè)為
        400Mhz ,分頻比為 FCLK:HCLK:PCLK=1:4:8,有2種設(shè)定方法,我們使用簡(jiǎn)單的一種。

        1、首先屏蔽原來 s3c2410 的時(shí)鐘設(shè)置,修改 u-boot-1.1.6/cpu/arm920t/ 目錄下 start.S 文件 148 行如下:

        #if 0


        ldrr0, =CLKDIVN
        movr1, #3
        strr1, [r0]
        #endif

        2、修改 u-boot-1.1.6/cpu/arm920t/start.S ,將 stack_setup子程序搬到 relocate 子程序之前,因?yàn)樗{(diào)用的 clock_init 函數(shù)需要用到堆棧。


        stack_setup:
        ldrr0, _TEXT_BASE
        subr0, r0, #CFG_MALLOC_LEN
        subr0, r0, #CFG_GBL_DATA_SIZE
        #ifdef CONFIG_USE_IRQ
        subr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
        #endif
        subsp, r0, #12

        blclock_init

        #ifndef CONFIG_SKIP_RELOCATE_UBOOT
        relocate:
        adrr0, _start
        ldrr1, _TEXT_BASE
        cmpr0, r1
        beqclear_bss

        ldrr2, _armboot_start
        ldrr3, _bss_start
        subr2, r3, r2
        addr2, r0, r2
        3、編寫clock_init函數(shù),board/TQ2440 目錄下建議一個(gè)名為 boot_init.c 的文件,編寫 colck_init 函數(shù),同時(shí)加上一些聲明和延時(shí)子函數(shù)

        #include
        #include
        #define GSTATUS1(*(volatile unsigned int *)0x560000B0)
        static inline void delay (unsigned long loops)
        {
        __asm__ volatile ("1: n"
        "subs %0, %1, #1 n"
        "bne 1b":"=r" (loops):"0" (loops));
        }

        #define S3C2440_MPLL_400MHZ((0x5c<<12)| (0x01<<4)|(0x01))
        #define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
        #define S3C2440_MPLL_100MHZ ((0x5c<<12)|(0x01<<4)|(0x03))
        #define S3C2440_UPLL_96MHZ ((0x38<<12)|(0x02<<4)|(0x01))
        #define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
        #define S3C2440_CLKDIV (0x05) // | (1<<3))
        #define S3C2440_CLKDIV188 0x04
        #define S3C2440_CAMDIVN188 ((0<<8)|(1<<9))

        #define S3C2410_MPLL_200MHZ((0x5c<<12)|(0x04<<4)|(0x00))
        #define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))
        #define S3C2410_CLKDIV 0x03
        void clock_init(void)
        {
        S3C24X0_CLOCK_POWER *clk_power = (S3C24X0_CLOCK_POWER *)0x4C000000;

        if ((GSTATUS1 == 0x32410000)|| (GSTATUS1 == 0x32410002))
        {

        clk_power- >CLKDIVN = S3C2410_CLKDIV;

        __asm__("mrcp15, 0, r1, c1, c0, 0 n"
        "orr r1,r1, #0xc0000000 n"
        11
        "mcr p15, 0, r1, c1, c0, 0 n"
        :::"r1"
        );

        clk_power- >LOCKTIME = 0xFFFFFFFF;

        clk_power- >UPLLCON = S3C2410_UPLL_48MHZ;

        delay (4000);

        clk_power- >MPLLCON = S3C2410_MPLL_200MHZ;

        delay (8000);
        }
        else
        {

        clk_power- >CLKDIVN = S3C2440_CLKDIV;

        __asm__("mrcp15, 0, r1, c1, c0, 0 n"
        "orr r1,r1, #0xc0000000 n"
        "mcr p15, 0, r1, c1, c0, 0 n"
        :::"r1"
        );

        clk_power- >LOCKTIME = 0xFFFFFFFF;

        clk_power- >UPLLCON = S3C2440_UPLL_48MHZ;

        delay (4000);

        clk_power- >MPLLCON = S3C2440_MPLL_400MHZ;

        delay (8000);
        }
        }

        4、修改u-boot-1.1.6/board/TQ2440/TQ2440.c 文件中的 board_init 函數(shù)

        int board_init (void)
        {
        S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

        gpio- >GPACON = 0x007FFFFF;
        gpio- >GPBCON = 0x00055555;
        gpio- >GPBUP = 0x000007FF;
        gpio- >GPCCON = 0xAAAAAAAA;
        gpio- >GPCUP = 0x0000FFFF;
        gpio- >GPDCON = 0xAAAAAAAA;
        gpio- >GPDUP = 0x0000FFFF;
        gpio- >GPECON = 0xAAAAAAAA;
        gpio- >GPEUP = 0x0000FFFF;
        gpio- >GPFCON = 0x000055AA;
        gpio- >GPFUP = 0x000000FF;
        gpio- >GPGCON = 0xFF94FFBA;
        gpio- >GPGUP = 0x0000FFEF;
        gpio- >GPGDAT = gpio- >GPGDAT & (~(1<<4)) | (1<<4);
        gpio- >GPHCON = 0x002AFAAA;
        gpio- >GPHUP = 0x000007FF;

        if ((gpio- >GSTATUS1 == 0x32410000) || (gpio- >GSTATUS1 == 0x32410002))
        {

        gd- >bd- >bi_arch_number = MACH_TYPE_SMDK2410;
        }
        else
        {

        gd- >bd- >bi_arch_number = MACH_TYPE_S3C2440;
        }

        gd- >bd- >bi_boot_params = 0x30000100;
        icache_enable();
        dcache_enable();
        return 0;
        }

        5、修改u-boot-1.1.6/board/TQ2440的Makefile

        COBJS:= TQ2440.o flash.oboot_init.o
        并在 board/dong2440/u - boot.lds 文件中 35 行添加如下內(nèi)容:
        .text:
        {
        cpu/arm920t/start.o(.text)
        board/TQ2440/boot_init.o(.text)
        *(.text)
        }
        以增加對(duì) boot_init.o 的連接。
        其它inclu de/s3c24x0.h ,cpu/arm920t/s3c24x0/speed.c的修改同上面的方法一樣。

        第三步:make

        最后 make 一下,沒有錯(cuò)誤,加載到內(nèi)存中運(yùn)行正常。我的運(yùn)行結(jié)果如下:
        U- Boot 1.1.6 (Sep 4 2010- 13:50:20)
        DRAM: 64 MB
        Flash: 512 kB
        *** Warning - bad CRC, using default environment
        In: serial
        Out: serial
        Err: serial
        SMDK2410 # ?
        ?- alias for help
        autoscr - run script from m emory
        base- print or set address offset
        u - boot 中的提示符“ SMDK2410 #” 可以在/include/configs/dong2440.h 中修改成自己喜歡的
        提示符,操作如下:#defineCFG_PROMPT"[dong2440]# "



        關(guān)鍵詞: 移植u-boot16TQ244

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 公安县| 阿图什市| 东源县| 安仁县| 扎兰屯市| 满洲里市| 汉中市| 定安县| 侯马市| 门源| 上虞市| 香港 | 喀什市| 鄂尔多斯市| 麻江县| 莎车县| 施秉县| 雅安市| 樟树市| 太湖县| 长春市| 大同县| 齐齐哈尔市| 乾安县| 周至县| 电白县| 富锦市| 丹寨县| 常州市| 综艺| 文昌市| 扎兰屯市| 濮阳市| 伊通| 大庆市| 阳朔县| 大埔区| 道真| 平泉县| 新河县| 东台市|