Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831156
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2015-07-10 15:30:36


根据自己的单板,修改U-BOOT代码

1. 建一个单板

    cd board/samsung/
    cp smdk2410 smdk2440 -rf
cd ../../include/configs/
cp smdk2410.h smdk2440.h

修改boards.cfg:
仿照
smdk2410                     arm         arm920t     -                   samsung        s3c24x0
添加:
smdk2440                     arm         arm920t     -                   samsung        s3c24x0
        重新编译:
#make distclean           // 清除原来编译生成相关文件
#make smdk2440_config         
#make

2 烧写看结果

    结果肯定是不行的。因为我们并没有对源码做任何的改变。

3 调试:

3.1 阅读代码发现不足:

    UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
    处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
    编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot

   (1)在文件中\board\samsung\smdk2440\Smdk2410.c
        函数: int board_early_init_f(void) 中,取消对MPLL的设置
  1. #if 0

  2.     /* to reduce PLL lock time, adjust the LOCKTIME register */
  3.     writel(0xFFFFFF, &clk_power->locktime);


  4.     /* configure MPLL */
  5.     writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
  6.      &clk_power->mpllcon);
  7.     
  8. #endif
     (2)时钟设置  arch\arm\cpu\arm920t\start.S
  1. #if 0
  2.     /* FCLK:HCLK:PCLK = 1:2:4 */
  3.     /* default FCLK is 120 MHz ! */
  4.     ldr    r0, =CLKDIVN
  5.     mov    r1, #3
  6.     str    r1, [r0]
  7. #else

  8. /* 2. 设置时钟 */
  9.     ldr r0, =0x4c000014
  10.     //    mov r1, #0x03;             // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
  11.     mov r1, #0x05;             // FCLK:HCLK:PCLK=1:4:8
  12.     str r1, [r0]

  13.     /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
  14.     mrc    p15, 0, r1, c1, c0, 0        /* 读出控制寄存器 */
  15.     orr    r1, r1, #0xc0000000            /* 设置为“asynchronous bus mode” */
  16.     mcr    p15, 0, r1, c1, c0, 0        /* 写入控制寄存器 */


  17. #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))

  18.     /* MPLLCON = S3C2440_MPLL_200MHZ */
  19.     ldr r0, =0x4c000004
  20.     ldr r1, =S3C2440_MPLL_400MHZ
  21.     str r1, [r0]

  22.     /* 启动ICACHE */
  23.     mrc p15, 0, r0, c1, c0, 0    @ read control reg
  24.     orr r0, r0, #(1<<12)
  25.     mcr    p15, 0, r0, c1, c0, 0 @ write it back


  26. #endif
     (3)内存初始化  \board\samsung\smdk2440\lowlevel_init.S
  1. #if 0
  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. #else

  16.     .long 0x22011110 //BWSCON
  17.     .long 0x00000700 //BANKCON0
  18.     .long 0x00000700 //BANKCON1
  19.     .long 0x00000700 //BANKCON2
  20.     .long 0x00000700 //BANKCON3
  21.     .long 0x00000700 //BANKCON4
  22.     .long 0x00000700 //BANKCON5
  23.     .long 0x00018005 //BANKCON6
  24.     .long 0x00018005 //BANKCON7
  25.     .long 0x008C04F4 // REFRESH
  26.     .long 0x000000B1 //BANKSIZE
  27.     .long 0x00000030 //MRSRB6
  28.     .long 0x00000030 //MRSRB7

  29. #endif

这一步之后,重新编译,烧写实验,看看什么现象:SDRAM可以吗?
启动将打印一堆乱码:(这可能是波特率没有设置正确,查看串口设置程序)
????????ff??????`x?àx?????à???f?

3.2 乱码,查看串口波特率的设置

    发现在get_HCLK里没有定义CONFIG_S3C2440
深入查找可以看到: 在目录中 arch\arm\cpu\arm920t\s3c24x0\Speed.c
有这样一个宏: CONFIG_S3C2440, 但是却没有定义
  1. ulong get_HCLK(void)
  2. {
  3.     struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

  4. #ifdef CONFIG_S3C2440
  5.     switch (readl(&clk_power->clkdivn) & 0x6) {
  6.     default:
  7.     case 0:
  8.         return get_FCLK();
  9.     case 2:
  10.         return get_FCLK() / 2;
  11.     case 4:
  12.         return (readl(&clk_power->camdivn) & (1 << 9)) ?
  13.             get_FCLK() / 8 : get_FCLK() / 4;
  14.     case 6:
  15.         return (readl(&clk_power->camdivn) & (1 << 8)) ?
  16.             get_FCLK() / 6 : get_FCLK() / 3;
  17.     }
  18. #else
  19.     return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
  20. #endif

  21. }
处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
         #define CONFIG_S3C2440

    重新编译发现这样的错误
s3c2410_nand.c:72: error: dereferencing pointer to incomplete type
s3c2410_nand.c:72: error: dereferencing pointer to incomplete type
s3c2410_nand.c:75: error: dereferencing pointer to incomplete type
s3c2410_nand.c:75: error: dereferencing pointer to incomplete type
s3c2410_nand.c: In function 's3c2410_dev_ready':
s3c2410_nand.c:85: warning: initialization makes pointer from integer without a cast
s3c2410_nand.c:87: error: dereferencing pointer to incomplete type
s3c2410_nand.c: In function 'board_nand_init':
s3c2410_nand.c:129: warning: initialization makes pointer from integer without a cast
s3c2410_nand.c:150: error: dereferencing pointer to incomplete type
s3c2410_nand.c:153: error: dereferencing pointer to incomplete type
s3c2410_nand.c:154: error: dereferencing pointer to incomplete type

这是因为把这个宏
#define CONFIG_S3C2410 去掉了,找不到定义。
在这里可以先规避这个问题,只关注串口打印的问题,在nand文件的目录下面,修改Makefile来使其不编译这个文件。

打开: drivers/mtd/nand/Makefile
可以看到:
COBJS-$(CONFIG_NAND_JZ4740) += jz4740_nand.o
COBJS-$(CONFIG_NAND_KB9202) += kb9202_nand.o
COBJS-$(CONFIG_NAND_KIRKWOOD) += kirkwood_nand.o
COBJS-$(CONFIG_NAND_KMETER1) += kmeter1_nand.o
COBJS-$(CONFIG_NAND_MPC5121_NFC) += mpc5121_nfc.o
COBJS-$(CONFIG_NAND_MXC) += mxc_nand.o
COBJS-$(CONFIG_NAND_MXS) += mxs_nand.o
COBJS-$(CONFIG_NAND_NDFC) += ndfc.o
COBJS-$(CONFIG_NAND_NOMADIK) += nomadik.o
COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
只有当
CONFIG_NAND_S3C2410 = N,的时候,才不会编译s3c2410_nand.c 文件。

在文件: include\configs\Smdk2440.h 中有如下定义:

  1. #ifdef CONFIG_CMD_NAND

  2. #define CONFIG_NAND_S3C2410
  3. #define CONFIG_SYS_S3C2410_NAND_HWECC
  4. #define CONFIG_SYS_MAX_NAND_DEVICE 1
  5. #define CONFIG_SYS_NAND_BASE 0x4E000000

  6. #endif
为了去掉CONFIG_NAND_S3C2410,这里去掉 CONFIG_CMD_NAND 就可以了。
//#define CONFIG_CMD_NAND


注意:
去掉哪个功能,先看该目录下面的Makefie,看看是由那个配置选项宏所决定进行编译的,
然后可以配置文件 include/configs/smdk2440.h 里面取消这个宏就可以了。

这里编译的时候,还会出现一个问题:
/work/system/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info'
make: *** [u-boot] Error 1   


找到配置的宏,进入文件fs/yaffs2/Makefile,查找编译文件yaffscfg.c的配置宏:
$ vi fs/yaffs2/Makefile
    COBJS-$(CONFIG_YAFFS2) := \
            yaffscfg.o yaffs_ecc.o yaffsfs.o yaffs_guts.o yaffs_packedtags1.o \
            yaffs_tagscompat.o yaffs_packedtags2.o yaffs_tagsvalidity.o \
            yaffs_nand.o yaffs_checkptrw.o yaffs_qsort.o yaffs_mtdif.o \
            yaffs_mtdif2.o


在配置文件:\include\configs\smdk2440.h
注销宏定义://#define CONFIG_YAFFS2
重新编译,注意要先:
$ make distclean
然后重新配置,编译:
$ make smdk2440_config
$ make

下载u-boot.
bin文件到开发板,从nor启动,看打印信息:

U-Boot 2012.04.01 (Jul 10 2015 - 15:12:18)

CPUID: 32440001
FCLK:      400 MHz
HCLK:      100 MHz
PCLK:       50 MHz
DRAM:  64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESET the board ###

已经有打印信息了,说明串口也设置对了。时钟也没有问题,只有flash打印错误。下一步修改flash代码。

总结:

1. 仿照现有的相似的单板,建立对应的工程。
2. 配置编译
3. 根据自己的单板硬件,建立时钟,以及串口初始化等。

阅读(741) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~