单片机
返回首页

移植u-boot 1.1.6到TQ2440开发板-第二阶段

2015-09-30 来源:eefocus

经过了第一阶段的修改,目前能够编译出uboot.bin文件,但是这个文件还不能支持TQ2440,因为我们是在smdk2410上移植,代码还是支持smdk2410,因此要开始第二阶段的修改

 

移植u-boot 1.1.6到TQ2440开发板-第二阶段

增加uboot对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 REFCNT    4F4  

 

第二步:时钟设置,S3c2440 的时钟计算公式和 s3c2410 不一样,对于 s3c2440 开发板,将 PCLK 设为
400Mhz ,分频比为 FCLK:HCLK:PCLK=1:4:8,有2种设定方法,我们使用简单的一种。

1、首先屏蔽原来 s3c2410 的时钟设置,修改 u-boot-1.1.6/cpu/arm920t/ 目录下 start.S 文件 148 行如下:

#if 0
 
 
 ldr r0, =CLKDIVN
 mov r1, #3
 str r1, [r0]
#endif

2、修改 u-boot-1.1.6/cpu/arm920t/start.S ,将 stack_setup子程序搬到 relocate 子程序之前,因为所调用的 clock_init 函数需要用到堆栈。


stack_setup:
 ldr r0, _TEXT_BASE  
 sub r0, r0, #CFG_MALLOC_LEN 
 sub r0, r0, #CFG_GBL_DATA_SIZE
#ifdef CONFIG_USE_IRQ
 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
 sub sp, r0, #12  

bl  clock_init

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:    
 adr r0, _start  
 ldr r1, _TEXT_BASE  
 cmp     r0, r1                 
 beq     clear_bss

 ldr r2, _armboot_start
 ldr r3, _bss_start
 sub r2, r3, r2  
 add r2, r0, r2  
3、编写clock_init函数,board/TQ2440 目录下建议一个名为 boot_init.c 的文件,编写 colck_init 函数,同时加上一些声明和延时子函数

#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__('mrc  p15, 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__('mrc  p15, 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 函数

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.o boot_init.o
并在 board/dong2440/u - boot.lds 文件中 35 行添加如下内容:
.text  :
{
cpu/arm920t/start.o   (.text)
board/TQ2440/boot_init.o   (.text)
*(.text)
}
以增加对 boot_init.o 的连接。
其它inclu de/s3c24x0.h ,cpu/arm920t/s3c24x0/speed.c  的修改同上面的方法一样。

 

第三步:make

最后 make 一下,没有错误,加载到内存中运行正常。我的运行结果如下:
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 中修改成自己喜欢的
提示符,操作如下:#define  CFG_PROMPT  '[dong2440]# ' 

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 如何构建一个触摸传感器电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章