zoukankan      html  css  js  c++  java
  • S3C2440移植uboot之新建单板_时钟_SDRAM_串口

    上一节S3C2440移植uboot之启动过程概述我们我们分析了uboot启动流程,这节将开始新建一块单板支持S3C2440。

    1.新建单板

    1.1 将2410的单板文件夹拷贝成2440:

    cd /work/system/u-boot-2012.04.01/board/samsung
    cp smdk2410 smdk2440 -rf
    

    在这里插入图片描述

    1.2 将2410的头文件拷贝成2440

    cd ../../include/configs/
    cp smdk2410.h smdk2440.h
    

    在这里插入图片描述
    修改2440文件夹下的smdk2410.c和Makefile文件
    在这里插入图片描述
    在这里插入图片描述

    2.修改boards.cfg,使uboot支持2440单板:

    仿照
    smdk2410                     arm         arm920t     -                   samsung        s3c24x0
    添加:
    smdk2440                     arm         arm920t     -                   samsung        s3c24x0
    

    在这里插入图片描述
      使用make smdk2440_config命令(命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文件来配置uboot)
      同样的,在windows下把u-boot-2012.04.01.tar_2u-boot-2012.04.01oardsamsung下的smdk2410拷贝成smdk2440,把u-boot-2012.04.01.tar_2u-boot-2012.04.01includeconfigs smdk2410.h复制为smdk2440.h。在source insight中添加2440相关的文件,去掉2410部分。

    3.修改uboot系统时钟

      从start.s开始分析启动过程,阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置 在这里插入图片描述在这里插入图片描述在这里插入图片描述
      打开u-boot-2012.04.01.tar_2u-boot-
    2012.04.01oardsamsungsmdk2440smdk2440.c
    注释掉以下部分,把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
    在这里插入图片描述

    4.烧写修改后的uboot

      烧写测试时,由于新的uboot较大,可以使用nor上的旧uboot,通过DNW烧写新的uboot到nor上面.
      由于我们的分区不够大,所以使用命令烧写
    在这里插入图片描述
    在这里插入图片描述

    usb 1 30000000            //使用usb下载到SDRAM上,1表示一直下载,直到完成
                             //然后打开DNW,传输新的uboot.bin给usb
    
    protect off all           //关闭nor的写保护
    
    erase  0   +7FFFF      //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行
    
    cp.b  30000000  0  80000         //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K)
    

    在这里插入图片描述
      烧写完成后,重启,通过JTAG调试的读地址命令, 判断是否与新uboot文件一致使用JTAG调试时,发现向0x30000000地址上写值出错
    在这里插入图片描述
      拷贝之前写bootloader的初始化时钟的代码

    #define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))
    /* 2. 设置时钟 */
    	ldr r0, =0x4c000014
    	//	mov r1, #0x03;			  // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
    	mov r1, #0x05;			  // FCLK:HCLK:PCLK=1:4:8
    	str r1, [r0]
    
    	/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
    	mrc	p15, 0, r1, c1, c0, 0		/* 读出控制寄存器 */ 
    	orr	r1, r1, #0xc0000000			/* 设置为“asynchronous bus mode” */
    	mcr	p15, 0, r1, c1, c0, 0		/* 写入控制寄存器 */
    
    	/* MPLLCON = S3C2440_MPLL_200MHZ */
    	ldr r0, =0x4c000004
    	ldr r1, =S3C2440_MPLL_400MHZ
    	str r1, [r0]
    	/* 启动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
    
    

      修改start.s如下
    在这里插入图片描述
      修改cpu初始化代码
      修改前

    lowlevel_init:
    	/* memory control configuration */
    	/* make r0 relative the current location so that it */
    	/* reads SMRDATA out of FLASH rather than memory ! */
    	ldr     r0, =SMRDATA
    	ldr	r1, _TEXT_BASE
    	sub	r0, r0, r1
    	ldr	r1, =BWSCON	/* Bus Width Status Controller */
    	add     r2, r0, #13*4
    0:
    	ldr     r3, [r0], #4
    	str     r3, [r1], #4
    	cmp     r2, r0
    	bne     0b
    
    	/* everything is fine now */
    	mov	pc, lr
    
    	.ltorg
    /* the literal pools origin */
    
    SMRDATA:
        .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
        .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
        .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
        .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
        .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
        .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
        .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
        .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
        .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
        .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
        .word 0x32
        .word 0x30
        .word 0x30
    
    

      修改后

    SMRDATA:
    	.long 0x22011110	 //BWSCON
    	.long 0x00000700	 //BANKCON0
    	.long 0x00000700	 //BANKCON1
    	.long 0x00000700	 //BANKCON2
    	.long 0x00000700	 //BANKCON3  
    	.long 0x00000700	 //BANKCON4
    	.long 0x00000700	 //BANKCON5
    	.long 0x00018005	 //BANKCON6
    	.long 0x00018005	 //BANKCON7
    	.long 0x008C04F4	 // REFRESH
    	.long 0x000000B1	 //BANKSIZE
    	.long 0x00000030	 //MRSRB6
    	.long 0x00000030	 //MRSRB7
    

      上传修改的u-boot-2012.04.01archarmcpuarm920t start.s和u-boot-2012.04.01oardsamsungsmdk2440 s3c2440.c,lowlevel_init.S到ubuntu重新编译、

    5.烧写uboot,发现串口已有数据,但是乱码

      测试设置的内存是否成功
    在这里插入图片描述
      读写内容一致,内存初始化成功。

    5.1进入archarmcpuarm920ts3c24x0Speed.c下的get_HCLK ()函数:

    在这里插入图片描述
      由于我们没有配置CONFIG_S3C2440宏,所以uboot获取HCLK时钟设置波特率时,用的是CONFIG_S3C2410宏的方法
    搜索CONFIG_S3C2410宏,找到位于include/configs/smdk2440.h
    然后将smdk2440.h的CONFIG_S3C2410宏 改为: CONFIG_S3C2440宏

    5.2编译测试

      make时,发现以下几个error:
    在这里插入图片描述
      进入drivers/mtd/nand/s3c2410_nand.c 的72行:
      其中nand是一个s3c2410_nand结构体:
    在这里插入图片描述
      该结构体如下所示:
    在这里插入图片描述
      从上图可以看出,只有定义了CONFIG_S3C2410宏,才能得到该结构体,而我们6.1小节里,使用的是CONFIG_S3C2440宏。
      且上面的s3c2410_nand结构体和s3c2440_nand结构体的差别也很大,修改s3c2410_nand.c会很麻烦

    5.3所以就直接去掉该文件,不让编译器编译即可,步骤如下所示:

    (1)直接进入s3c2410_nand.c的目录,打开Makefile:
    在这里插入图片描述

      如上图所示,需要去掉CONFIG_NAND_S3C2410宏定义才行
    (2)搜索CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h:
    在这里插入图片描述
      如上图所示,我们直接来屏蔽CONFIG_CMD_NAND宏即可,因为该宏下的#ifdef,都是与2410相关的

    (3)屏蔽include/configs/smdk2440.h下的CONFIG_CMD_NAND宏定义
    在这里插入图片描述
       然后重新make会出现 "nand_info" 错误(为什么韦老师编译就没有出现错误?)

    fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp':
    /home/book/Par_Uboot/mk_uboot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info'
    Makefile:472: recipe for target 'u-boot' failed
    make: *** [u-boot] Error 1
    

      这个时候再将smdk2440.h中的#define CONFIG_YAFFS2注释掉,然后先make distclean 再重新上传配置和编译

    /*
    * File system
    */
    #define CONFIG_CMD_FAT
    #define CONFIG_CMD_EXT2
    #define CONFIG_CMD_UBI
    #define CONFIG_CMD_UBIFS
    #define CONFIG_CMD_MTDPARTS
    #define CONFIG_MTD_DEVICE
    #define CONFIG_MTD_PARTITIONS
    //#define CONFIG_YAFFS2
    #define CONFIG_RBTREE
    

      重新烧写进norflash,打印如下图所示:
      发现无乱码了,表示nor启动成功,其中Flash: *** failed ***表示不支持norflash,因为我们只实现了重定位,并没有对nor实现写擦除等命令。
    在这里插入图片描述
    关键函数位置:

    配置时钟 cpu_init_crit:   u-boot-2012.04.01archarmcpuarm920tstart.s
    board_early_init_f,	relocate_code(addr_sp, id, addr):
    u-boot-2012.04.01oardsamsungsmdk2440 
    SMRDATA  u-boot-2012.04.01oardsamsungsmdk2440lowlevel_init.S
    _serial_setbrg:  u-boot-2012.04.01driversserialserial_s3c24x0.c
    serial_init:  u-boot-2012.04.01archarmliboard.c
    //#define CONFIG_YAFFS2 #define CONFIG_S3C2440	u-boot-2012.04.01includeconfigssmdk2440.h
    

      下一节S3C2440移植uboot之支持NAND启动我们将修改uboot支持NAND启动。

    有任何问题,均可通过公告中的二维码联系我

  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/dongxb/p/14198451.html
Copyright © 2011-2022 走看看