新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux之我行——u-boot-2009.08在2440上的移植詳解(一)

        嵌入式Linux之我行——u-boot-2009.08在2440上的移植詳解(一)

        作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
        一、移植環(huán)境
        • 機:VMWare--Fedora 9
        • 開發(fā)板:Mini2440--64MB Nand,Kernel:2.6.30.4
        • 編譯器:arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz" target="_blank">arm-linux-gcc-4.3.2.tgz
        • u-boot:u-boot-2009.08.tar.bz2

        二、移植步驟

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

        本次移植的功能特點包括:

        • 支持Nand Flash讀寫
        • 支持從Nor/Nand Flash啟動
        • 支持CS8900或者DM9000網(wǎng)卡
        • 支持Yaffs文件系統(tǒng)
        • 支持USB下載(還未實現(xiàn))

        1.了解u-boot主要的目錄結(jié)構(gòu)和啟動流程,如下圖。

        u-boot的stage1代碼通常放在cpu/xxxx/start.S文件中,他用匯編語言寫成;
        u-boot的stage2代碼通常放在lib_xxxx/board.c文件中,他用C語言寫成。
        各個部分的流程圖如下:
        2. 建立自己的開發(fā)板項目并測試編譯。
        目前u-boot對很多CPU直接支持,可以查看board目錄的一些子目錄,如:board/samsung/目錄下就是對三星一些ARM處理器的支持,有smdk2400、smdk2410和smdk6400,但沒有2440,所以我們就在這里建立自己的開發(fā)板項目。
        1)因2440和2410的資源差不多,主頻和外設(shè)有點差別,所以我們就在board/samsung/下建立自己開發(fā)板的項目,取名叫my2440

        #tar -jxvf u-boot-2009.08.tar.bz2//解壓源碼
        #cd u-boot-2009.08/board/samsung///進入目錄
        #mkdir my2440//創(chuàng)建my2440文件夾

        2)因2440和2410的資源差不多,所以就以2410項目的代碼作為模板,以后再修改

        #cp -rf smdk2410

        start_code:

        mrsr0,cpsr
        bicr0,r0,#0x1f
        orrr0,r0,#0xd3
        msrcpsr,r0

        bl coloured_LED_init//此處兩行是對AT91RM9200DK開發(fā)板上的LED進行初始化的
        bl red_LED_on

        由此可以看到,start_code處才是u-boot啟動代碼的真正開始處。以上就是u-boot的stage1入口的過程。

        2)my2440開發(fā)板u-boot的stage1階段的硬件設(shè)備初始化。
        由于在u-boot啟動代碼處有兩行是AT91RM9200DK的LED初始代碼,但我們my2440上的LED資源與該開發(fā)板的不一致,所以我們要刪除或屏蔽該處代碼,再加上my2440的LED驅(qū)動代碼(注:添加my2440 LED功能只是用于表示u-boot運行的狀態(tài),給調(diào)試帶來方便,可將該段代碼放到任何你想調(diào)試的地方),代碼如下:

        #ifdefined(CONFIG_S3C2440) //區(qū)別與其他開發(fā)板

        //根據(jù)mini2440原理圖可知LED分別由S3C2440的PB5、6、7、8口來控制,以下是PB端口寄存器基地址(查2440的DataSheet得知)
        #defineGPBCON 0x56000010
        #defineGPBDAT 0x56000014
        #defineGPBUP 0x56000018

        //以下對寄存器的操作參照S3C2440的DataSheet進行操作
        ldr r0,=GPBUP
        ldr r1,=0x7FF//即:二進制11111111111,關(guān)閉PB口上拉
        str r1,[r0]

        ldr r0,=GPBCON//配置PB5、6、7、8為輸出口,對應(yīng)PBCON寄存器的第10-17位
        ldr r1,=0x154FD//即:二進制010101010011111101
        str r1,[r0]

        ldr r0,=GPBDAT
        ldr r1,=0x1C0//即:二進制111000000,PB5設(shè)為低電平,6、7、8為高電平
        str r1,[r0]

        #endif

        //此段代碼使u-boot啟動后,點亮開發(fā)板上的LED1,LED2、LED3、LED4不亮

        在include/configs/my2440.h頭文件中添加CONFIG_S3C2440宏

        #geditinclude/configs/my2440.h

        #defineCONFIG_ARM920T1
        #defineCONFIG_S3C24101
        #defineCONFIG_SMDK24101
        #defineCONFIG_S3C24401

        現(xiàn)在編譯u-boot,在根目錄下會生成一個u-boot.bin文件。然后我們利用mini2440原有的supervivi把u-boot.bin下載到RAM中運行測試(注意:我們使用supervivi進行下載時已經(jīng)對CPU、RAM進行了初始化,所以我們在u-boot中要屏蔽掉對CPU、RAM的初始化),如下:

        /*#ifndef CONFIG_SKIP_LOWLEVEL_INIT//在start.S文件中屏蔽u-boot對CPU、RAM的初始化
        blcpu_init_crit
        #endif*/

        #make my2440_config

        #make

        下載運行后可以看到開發(fā)板上的LED燈第一了亮了,其他三個熄滅,測試結(jié)果符合上面的要求。終端運行結(jié)果如下:

        3)在u-boot中添加對S3C2440一些寄存器的支持、添加中斷禁止部分和時鐘設(shè)置部分。
        由于2410和2440的寄存器及地址大部分是一致的,所以這里就直接在2410的基礎(chǔ)上再加上對2440的支持即可,代碼如下:

        #geditcpu/arm920t/start.S

        #ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)
        /*turn off the watchdog*/

        #ifdefined(CONFIG_S3C2400)
        # define pWTCON0x15300000
        # define INTMSK0x14400008/*Interupt-Controller base addresses*/
        # define CLKDIVN0x14800014/*clock divisor register*/
        #else//下面2410和2440的寄存器地址是一致的
        # define pWTCON0x53000000
        # define INTMSK0x4A000008/*Interupt-Controller base addresses*/
        # define INTSUBMSK0x4A00001C
        # define CLKDIVN0x4C000014/*clock divisor register*/
        #endif

        ldr r0,=pWTCON
        mov r1,#0x0
        str r1,[r0]

        /*
        *maskall IRQs by setting all bitsinthe INTMR-default
        */
        mov r1,#0xffffffff
        ldr r0,=INTMSK
        strr1,[r0]
        #ifdefined(CONFIG_S3C2410)
        ldr r1,=0x3ff
        ldr r0,=INTSUBMSK
        str r1,[r0]
        #endif
        #ifdefined(CONFIG_S3C2440)//添加s3c2440的中斷禁止部分
        ldr r1,=0x7fff//根據(jù)2440芯片手冊,INTSUBMSK寄存器有15位可用

        ldr r0,=INTSUBMSK
        str r1,[r0]
        #endif

        #ifdefined(CONFIG_S3C2440)//添加s3c2440的時鐘部分

        #defineMPLLCON0x4C000004//系統(tǒng)主頻配置寄存器基地址

        #define UPLLCON0x4C000008//USB時鐘頻率配置寄存器基地址
        ldr r0,=CLKDIVN//設(shè)置分頻系數(shù)FCLK:HCLK:PCLK = 1:4:8
        mov r1,#5
        str r1,[r0]

        ldr r0, =MPLLCON//設(shè)置系統(tǒng)主頻為405MHz

        ldr r1, =0x7F021//這個值參考芯片手冊“PLL VALUE SELECTION TABLE”部分

        str r1, [r0]

        ldr r0, =UPLLCON//設(shè)置USB時鐘頻率為48MHz

        ldr r1, =0x38022//這個值參考芯片手冊“PLL VALUE SELECTION TABLE”部分

        str r1, [r0]

        #else//其他開發(fā)板的時鐘部分,這里就不用管了,我們現(xiàn)在是做2440的

        /*FCLK:HCLK:PCLK=1:2:4*/
        /*default FCLK is 120 MHz!*/

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

        # endif
        #endif/*CONFIG_S3C2400||CONFIG_S3C2410||CONFIG_S3C2440*/

        S3C2440的時鐘部分除了在start.S中添加外,還要分別在board/samsung/my2440/my2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代碼,如下:

        #geditboard/samsung/my2440/my2440.c//設(shè)置主頻和USB時鐘頻率參數(shù)與start.S中的一致

        #defineFCLK_SPEED2//設(shè)置默認(rèn)等于2,即下面紅色代碼部分有效

        #ifFCLK_SPEED==0
        #defineM_MDIV0xC3
        #defineM_PDIV0x4
        #defineM_SDIV0x1
        #elifFCLK_SPEED==1
        #defineM_MDIV0xA1
        #defineM_PDIV0x3
        #defineM_SDIV0x1
        #elifFCLK_SPEED==2
        #defineM_MDIV0x7F//這三個值根據(jù)S3C2440芯片手冊“PLL VALUE SELECTION TABLE”部分進行設(shè)置
        #defineM_PDIV0x2
        #defineM_SDIV0x1
        #endif

        #defineUSB_CLOCK2//設(shè)置默認(rèn)等于2,即下面紅色代碼部分有效

        #ifUSB_CLOCK==0
        #defineU_M_MDIV0xA1
        #defineU_M_PDIV0x3
        #defineU_M_SDIV0x1
        #elifUSB_CLOCK==1
        #defineU_M_MDIV0x48
        #defineU_M_PDIV0x3
        #defineU_M_SDIV0x2
        #elifUSB_CLOCK==2
        #defineU_M_MDIV0x38//這三個值根據(jù)S3C2440芯片手冊“PLL VALUE SELECTION TABLE”部分進行設(shè)置
        #defineU_M_PDIV0x2
        #defineU_M_SDIV0x2
        #endif

        #geditcpu/arm920t/s3c24x0/speed.c//根據(jù)設(shè)置的分頻系數(shù)FCLK:HCLK:PCLK = 1:4:8修改獲取時鐘頻率的函數(shù)

        staticulong get_PLLCLK(intpllreg)
        {
        S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();
        ulong r,m,p,s;

        if(pllreg==MPLL)
        r=clk_power->MPLLCON;
        elseif(pllreg==UPLL)
        r=clk_power->UPLLCON;
        else
        hang();

        m=((r&0xFF000)>>12)+8;
        p=((r&0x003F0)>>4)+2;
        s=r&0x3;

        #ifdefined(CONFIG_S3C2440)
        if(pllreg==MPLL)
        {//參考S3C2440芯片手冊上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ*m*2)/(p<<s));
        }
        #endif

        return((CONFIG_SYS_CLK_FREQ*m)/(p<<s));
        }


        ulong get_HCLK(void)
        {
        S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

        #ifdefined(CONFIG_S3C2440)
        return(get_FCLK()/4);
        #endif

        return((clk_power->CLKDIVN&0x2)?get_FCLK()/2:get_FCLK());
        }

        好了!修改完畢后我們再重新編譯u-boot,然后再下載到RAM中運行測試。結(jié)果終端有輸出信息并且出現(xiàn)類似Shell的命令行,這說明這一部分移植完成。示意圖如下:




        關(guān)鍵詞: Linuxu-boot244

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 龙海市| 梅河口市| 准格尔旗| 平罗县| 平果县| 卓资县| 襄城县| 大安市| 江北区| 和林格尔县| 凉城县| 南丰县| 平乐县| 天全县| 泾川县| 台中市| 昭觉县| 滦南县| 香港 | 伊川县| 杭锦后旗| 句容市| 星座| 军事| 峨眉山市| 梁山县| 股票| 宜城市| 图片| 南康市| 富川| 禹城市| 天气| 阿拉善左旗| 共和县| 武清区| 正镶白旗| 于都县| 延津县| 团风县| 恩平市|