移植u-boot-2012.04之建新单板_时钟_SDRAM_UART
(1)新建单板目录,以及配置头文件
tar xjf u-boot-2012.04.01.tar.bz2
cd u-boot-2012.04.01
cd board/samsung/
cp smdk2410 smdk2440 –rf
cd ../..
cd /include/configs/
cp smdk2410.h smdk2440.h
(2) 修改 boards.cfg:
仿照
smdk2410 arm arm920t - samsung s3c24x0
添加:
smdk2440 arm arm920t - samsung s3c24x0
vi命令:
yy:复制当前行到vi缓冲区
p:粘贴缓冲区
make smdk2440_config
make
(3) 烧写看结果,没任何输出,并进行调式修改。
更新 source insight工程
(4)分析u-boot启动过程
从start.S开始分析:
阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置
call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
init_fnc_t *init_sequence[] = {
#if defined(CONFIG_ARCH_CPU_INIT)
arch_cpu_init, /* basic arch cpu dependent setup */
#endif
#if defined(CONFIG_BOARD_EARLY_INIT_F)
board_early_init_f,
#endif
#ifdef CONFIG_OF_CONTROL
fdtdec_check_fdt,
#endif
timer_init, /* initialize timer */
#ifdef CONFIG_FSL_ESDHC
get_clocks,
#endif
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard, /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
init_func_i2c,
#endif
dram_init, /* configure available RAM banks */
NULL,
};
board_early_init_f:
int board_early_init_f(void)
{
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power();
struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
/* 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);
/* some delay between MPLL and UPLL */
pll_delay(4000);
/* configure UPLL */
writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
&clk_power->upllcon);
/* some delay between MPLL and UPLL */
pll_delay(8000);
修改为:
(5)
编译产生新的uboot,重新运行,观察串口输出
通过openjtag调试uboot,查看到底SDRAM初始化是否正确
显然SDRAM是不对的,接下来 我们自己设置时钟,并修改SDRAM初始化代码。
(6)修改时钟,拷贝测试好的裸机SDRAM内容代码过来用:
去掉:
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
改为:
/* 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 /* 写入控制寄存器 */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
/* 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
(7)内存不能正常使用,使用以前的配置设置修改:
cpu_init_crit—》lowlevel_init—》
将如下:
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
(8)上传新文件,重新make,拷贝执行
到此 ,有乱码输出,串口配置有问题,但经过测试,此时内存已经设置成功。
(9)串口设置,解决乱码问题。
init_sequence--》serial_init--》
int serial_init(void)
{
return serial_init_dev(UART_NR);
}
serial_init_dev--》_serial_setbrg:
reg = get_PCLK() / (16 * gd->baudrate) - 1;
get_PCLK:
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440
switch (readl(&clk_power->clkdivn) & 0x6) {
default:
case 0:
return get_FCLK();
case 2:
return get_FCLK() / 2;
case 4:
return (readl(&clk_power->camdivn) & (1 << 9)) ?
get_FCLK() / 8 : get_FCLK() / 4;
case 6:
return (readl(&clk_power->camdivn) & (1 << 8)) ?
get_FCLK() / 6 : get_FCLK() / 3;
}
#else
return (readl(&clk_power->clkdivn) & 2) ? get_FCLK() / 2 : get_FCLK();
#endif
}
乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
#define CONFIG_S3C2440
//#define CONFIG_CMD_NAND
(10)更新文件 编译一下,出现如下错误:
(11)重新编译成功
先烧旧的uboot 重启开发板 q –usb下载
注意:此时uboot只支持从nor flash启动
Enter your selection: q
usb 1 30000000
protect off all
erase 0 7ffff
cp.b 30000000 0 80000
重新上电,输出如下,乱码问题解决
U-Boot 2012.04.01 (Apr 18 2017 - 16:17:08)
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 ###
uboot执行成功:此时 串口、SDRAM、时钟等资源已经初始化成功。uboot正常启动。
上一篇:06-S3C2440学习之移植2012u-boot到S3C2440(移植过程二)支持NAND启动
下一篇:05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
推荐阅读最新更新时间:2024-11-13 11:08
推荐帖子
- 关于LPCXpresso中进行数值运算的问题
- 我现在要算根据加速度传感器的输出计算倾角,需要用到asin()函数这个函数在math.h有定义,但是编译的时候还是出错,望高手指点,非常感谢!c:/nxp/lpcxpresso_3.3/tools/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/thumb2\\libcr_c.a(_asinacos.o):Infunction`_asinacos\':_asinacos.c:(\"/.
- chenzhufly NXP MCU
- W27C512替代品
- w27c512这个芯片停产了,我公司做的产品需要用到这个原器件,软件硬件几年前就定型了,不能更改,现寻找能直接替代的芯片,引脚封装要求能通用,把原有程序烧进去就能直接使用的芯片W27C512替代品
- bjby81 单片机
- BIGTREETECH PI 树莓派3B平替开发板 开箱评测
- 这两年树莓派的价格真是一言难尽,有一个3b+在智能家居控制系统里面用,但平时自己又爱折腾点新花样...又没有新项目报销经费...所以就一直在看有没有国产板子可以替代。首先简单对比一下BIGTREETECHPI和树莓派3b的参数吧。芯片是老朋友全志h616,64位4和A53频率略高于树莓派的BCM2837。616这几年大大小小的产品用的非常多,从电视盒、游戏机到开发板各种领域都在用,开发资料已经非常完善了。40个gpio、蓝牙、无线、4个usb2.0、百兆网卡、micr
- moveing 国产芯片交流
- 关于选折NANDFLASH,还是SPIFLASH?
- 所用STM32F103ZET6,由于,512KFlash,64RAM,已经能够满足系统的需要。所以就不加NORFLASH,和SRAM了,但是由于要存储数据,所以就想到NandFlash,和SPIFlash.而NandFlash容量大,但是引脚多,(NAND128W3A,128M)SPIFlash容量小点,但引脚简单,(M25P64,64M)而我所需要存储的数据特点是,数据量小,但存储时间需长达二年或者更久。两种的型号选好,就是不知道要选哪种,我比较倾向于SPIF
- xingwang stm32/stm8
- 【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测
- 本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法。此博文一共有两个配套的麻雀虽小但五脏俱全的示例程序,其经过浅墨详细注释过的代码都在文中贴出,且文章最后提供了综合示例程序的下载。依然是先看看程序运行截图:一、引言:关于兴趣点(interestpoints)在图像处理和与计算机视觉领域,兴趣点(interestpoints),或称作关键
- 兰博 嵌入式系统
- arm与单片机的区别
- 1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统?有什么好处嘛?1)方便。主要体现在后期的开发,即在操作系统上直接开发应用程序。不像单片机一样一切都要重新写。前期的操作系统移植工作,还是要专业人士来做。2)安全。这是LINUX的一个特点。LINUX的内核与用户空间的内存管理分开,不会因为用户的单个程序错误而引起系统死掉。这在单片机的软件开发中没见到过。3)高效。引入进程的管理调度系统,使系统运行更加高效。在传统的单片机开发中大多是基于中断的前后台技术,对多任
- 祝福 ARM技术
设计资源 培训 开发板 精华推荐
- STEVAL-LLL007V1,用于 LED1202 12 通道低静态电流 LED 驱动器的评估套件
- 蓝桥杯物联网之传感器部分(2*3矩阵键盘模块)
- 使用 Analog Devices 的 LTC4302-1 的参考设计
- Arduino Nano开发板
- 使用 ROHM Semiconductor 的 BU4813 的参考设计
- AD9554/PCBZ,用于 AD9554 四路 PLL、四路输入、多服务线路卡自适应时钟转换器的评估板
- 使用 Semtech 的 LD549 的参考设计
- ASL5015EVBSLAV: MLC ASL5015SHN评估/开发板
- 具有基本抑制功能的 LF50ABPT-TR 5V 低压降稳压器的典型应用
- L7805C 带温度补偿的可调输出电压的典型应用