• 二,移植uboot-支持JZ2440 NOR启动


    文档时间:2018-08-09

    交叉编译器:arm-linux-gcc-4.3.2

    Ubuntu版本:16.04

    uboot版本:2013.10

    1、创建jz2440单板

    由于uboot-2013-10没有对2440单板的支持,所以需要我们自己创建,由于jz2440与smdk2410有相似之处,所以我们以smdk2410单板为模板进行2440单板的创建

    cd work/u-boot/u-boot-2013.10/        //进入到u-boot目录
    cp board/samsung/smdk2410 board/samsung/jz2440 -rf        //把smdk2410目录下的所有文件拷贝到jz2440目录下
    ls board/samsung/jz2440/    //查看jz2440目录下的内容

    如果创建成功的话,会有如下显示:

    将smdk2410.c改为jz2440.c

    mv board/samsung/jz2440/smdk2410.c  board/samsung/jz2440/jz2440.c 

    修改board/samsung/jz2440目录下的Makefile文件,将smdk2410.o改为jz2440.o,见下图:

    (PS:简单修改在Ubuntu里,用vim或者gedit,其他修改则在Windows下,用SI(source insight)) 

    在include/configs目录下添加单板配套的.h文件,命名为jz2440.h(仿照smdk2410.h)

    cp include/configs/smdk2410.h include/configs/jz2440. 

    然后把修改的文件上传到Windows中,添加到SI工程中,以便后面修改。

    输入make jz2440_config进行编译,出现如下错误:

    说明在uboot中没有jz2440单板对应的配置项,参考smdk2410

    输入命令 grep smdk2410 * -nR 得到如下结果

     

    打开boards.cfg,仿照smdk2410增加jz2440配置项,如下,红色部分为增加代码:

    Active  arm         arm920t        s3c24x0     samsung         -                   smdk2410                             -                                                                                                                                 David Müller <d.mueller@elsoft.ch>
    Active  arm         arm920t        s3c24x0     samsung         -                   jz2440                               -                                                                                                                                 David Müller <d.mueller@elsoft.ch>

    继续执行make jz24440_config,成功,输入 make 生成u-boot.bin

    将生成的u-boot.bin烧写到jz2440开发板上,串口无输出,分析并修改start.S

    2,修改start.S让串口有输出

    从上到下一路分析到设置时钟分频处,发现默认FCLK为120M,而我们所用开发板时钟为400M,参考以前裸机程序修改代码,红色为添加代码,蓝色为删去代码:

    /* FCLK:HCLK:PCLK = 1:2:4 */
        /* default FCLK is 120 MHz ! */
        ldr    r0, =CLKDIVN
        mov    r1, #3
        str    r1, [r0]
    
    #define JZ2440_400MHZ    (92<<12)|(1<<4)|(1<<0)
        //设置MPLL,FCLK:HCLK:PCLK=400M:100M:50M
        //LOCKTIME(0x4C000000) = 0xFFFFFFFF
        ldr r0, =0x4C000000
        ldr r1, =0xFFFFFFFF
        str r1, [r0]
        
        //CLKDIVN(0x4C000014)=0x5,tFCLK:tHCLK:tPCLK=1:4:8
        ldr r0, =0x4C000014
        ldr r1, =0x5
        str r1, [r0]
        
        //设置CPU工作于异步模式
        mrc p15,0,r0,c1,c0,0
        orr r0,r0,#0xC0000000        //R1_nF:OR:R1_iA
        mcr p15,0,r0,c1,c0,0
        
        //设置MPLLCON(0x4C000004)=(92<<12)|(1<<4)|(1<<0)
        //m=MDIV+8=92+8=100
        //p=PDIV+2=1+2=3
        //s=SDIV=1
        //FCLK=2*m*Fin/(p*2^s)=2*100*12/(3*2^1)=400M
        ldr r0, =0x4C000004
        ldr r1, =JZ2440_400MHZ
        str r1, [r0]

    接着往下分析,到bl cpu_init_crit 处,在 cpu_init_crit 里跳入 lowlevel_init,打开lowlevel_init.S(/board/samsung/jz2440) 文件,分析得知,该文件里实现的是对bank的设置,

    修改代码,使其能够支持SDRAM:红色为修改后的代码

     1 SMRDATA:
     2     .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
     3     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
     4     .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
     5     .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
     6     .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
     7     .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
     8     .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
     9     .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    10     .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    11     .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    12     .word 0x32
    13     .word 0x30
    14     .word 0x30
    15 
    16 改为:
    17 SMRDATA:  
    18    .word 0x22000000        //BWSCON
    19     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    20     .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    21     .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    22     .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    23     .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    24     .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    25     .word 0x00018005        //BANKCON6
    26     .word 0x00018005           //BANKCON7
    27     .word 0x008C04F4        //REFRESH
    28     .word 0x000000B1        //BANKSIZE
    29     .word 0x30                //MRSRB6
    30     .word 0x30                //MRSRB7

    接着分析start.S,到 bl _main ,搜索文档发现 _main 的入口在 arch/arm/lib/crt0.S 文件中定义:如下图:

    分析 crt0.S 文件 一路往下看,发现会跳到一个c函数中:

    进入到 board_init_f() 函数中 (/arch/arm/lib目录下),进行分析:

    从名字可以看出,init_sequence里存放的应该是一些初始化函数,进入到 init_sequence 中,包含以下函数:

    然后进入 board_early_init_f()函数中(/board/samsung/jz2440/jz2440.c里),分析发现,此函数主要功能是设置时钟,初始化io口,由于前面我们在 start.S 中已经设置了时钟,

    这里把时钟设置相关的代码屏蔽:如下,红色部分为修改的代码: 

        /* 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);

     接着分析 crt0.S ,发现后面就是代码重定位和跳转到第二阶段,与我们当前要解决的问题没什么关联,暂且不管

    到这里,代码基本上已经修改完毕,输入以下命令编译:

    1 make jz2440_config
    2 make

    编译成功,生成u-boot.bin,烧写到板子上,串口有输出,但是是乱码:

    说明SDRAM设置成功,但是串口波特率未设置成功,归根结底是时钟获取不正确。

    3、修改代码使串口正常输出

    输入命令 grep "get_HCLK" * -nR 进行搜索,然后通过搜索结果进入到arch/arm/cpu/arm920t/s3c24xx/ 目录下,

    打开 speed.c 文件,定位到get_HCLK 函数

    很明显,由于没有配置 CONFIG_S3C2440,因此不能获得正确的时钟,使用的是CONFIG_S3C2410配置下的时钟,

    搜索CONFIG_S3C2410 找到位于 jz2440.h 中,打开include/configs/jz2440.h 修改代码,红色部分为修改后的代码:

    //#define CONFIG_S3C2410        /* specifically a SAMSUNG S3C2410 SoC */
    #define CONFIG_S3C2440

    然后编译测试,make 时出现一些错误:

    通过命令 find -name s3c2410_nand.c 找到所在位置

    打开 s3c2410_nand.c 文件,定位到59行:

    发现 nand 结构由 s3c2410_nand 所定义,该结构体内容如下:

    从上图中可以看出,要想使用 s3c2410_nand 必须配置CONFIG_S3C2410,而在 jz2440.h 中,我们已经将CONFIG_S3C2410 屏蔽,新增的是 CONFIG_S3C2440 

    由于本章我们用不到 nand 相关的东西,所以暂且将此文件设置成不编译

    进入到 drivers/mtd/nand 目录下,打开 Makefile 文件:

    要想不编译 s3c2410_nand.c 必须去掉CONFIG_NAND_S3C2410 这个宏

    搜索 CONFIG_NAND_S3C2410 ,发现位于 jz2440.h 文件中,打开 jz2440.h 文件,定位到 CONFIG_NAND_S3C2410

    如上图所示,只需将CONFIG_CMD_NAND 屏蔽即可,定位到  CONFIG_CMD_NAND , 修改代码:

    #define CONFIG_CMD_ELF
    //#define CONFIG_CMD_NAND
    #define CONFIG_CMD_PING

    修改完之后,编译,出现如下错误:

    输入命令 find -name yaffs_uboot_glue.c 得到如下结果:

    ./fs/yaffs2/yaffs_uboot_glue.c

    进入到目录 fs/yaffs2 下,打开 Makefile 文件:

    我们不想让出错的文件参与编译,因此需要屏蔽 CONFIG_YAFFS2 这个宏,打开 jz2440.h 文件,定位到 CONFIG_YAFFS2 这个宏,修改代码:

    #define CONFIG_MTD_PARTITIONS
    //#define CONFIG_YAFFS2
    #define CONFIG_RBTREE

    修改完成后,编译,重新烧写u-boot.bin

    出现上图所示界面,表示NOR启动成功。

  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/zhyy-mango/p/9446946.html
Copyright © 2020-2023  润新知