06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART

发布者:冰山火影1977最新更新时间:2022-05-29 来源: eefocus关键字:S3C2440  UART 手机看文章 扫描二维码
随时随地手机看文章

移植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正常启动。

关键字:S3C2440  UART 引用地址:06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART

上一篇:06-S3C2440学习之移植2012u-boot到S3C2440(移植过程二)支持NAND启动
下一篇:05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动

推荐阅读最新更新时间:2024-11-13 11:08

uboot在s3c2440上的移植(3)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。 目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。 首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下: #gedit in
[单片机]
uboot在<font color='red'>s3c2440</font>上的<font color='red'>移植</font>(3)
stm32的HAL库uart的注意点
(一)、uart / usart 要注意的 API使用方法。   1.__HAL_UART_GET_FLAG 是获取 SR 寄存器标志位状态   2.__HAL_UART_CLEAR_FLAG 是清除 SR 寄存器标志位状态,不同于读改写的清零方式,这是直接清零。   3.__HAL_UART_CLEAR_xxFLAG ,xx为PE FE NE ORE IDLE 共5个, 清除方式都是一样的,要先读取SR,再读取DR才能清除对应的标志位   4.UART_Receive_IT或许有bug,tmp = (uint16_t*) huart- pRxBuffPtr;需要pRxBuffPtr十六位对齐,但是pRxBuffPtr类型是uin
[单片机]
stm32的HAL库<font color='red'>uart</font>的注意点
s3c2440裸机-内存控制器1-内存控制器的原理
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。 2.
[单片机]
s3c2440学习笔记——重定位和链接脚本
————————————————————————————————————— 今天温习了韦老师有关代码重定位的视频,小结一下所得。 什么是重定位? 通俗地讲,就是将代码复制一份到其他地方。 以我的jz2440为例,假设开发板为nor启动(板载nor flash有2M大小且地址是从0x0000_0000开始),则我所烧录的bin文件会从nor flash的0地址开始执行。nor flash有个特性——不可直接进行写操作,因此如果我的代码里包含了一些全局变量(通常放在data或rodata段),那么我是无法改变它们的。这时候就可以通过重定位来进行操作,即我把这些全局变量复制一份到SDRAM(即内存),那么我可以通过访问内存来进行相关读写
[单片机]
S3C2440外部中断详解
要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。 在具体执行中断之前,要初始化好要用的中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式,如我们想把端口F0设置成外部中断,而其他引脚功能不变,则GPFCON=(GPFCON & ~0x3) | 0x2。配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT2
[单片机]
<font color='red'>S3C2440</font>外部中断详解
基于s3c2440的madplay移植
在mini2440移植声卡后,赶紧找了移植madplay的资料,看上去挺简单的,于是接着移植madplay。 一、 环境和软件介绍 1、主机环境:虚拟机下Fedora9 2、交叉编译器:arm-linux-gcc-4.3.2 3、软件包:zlib-1.2.3、libid3tag-0.15.1b.tar.gz、libmad-0.15.1b.tar.gz、madplay-0.15.2b.tar.gz 4、 把以上软件包解压到/opt/studyarm/madplay-make目录下,分别改名为zlib、libid3tag、libmad、madplay。并在madplay-make目录下新建include和lib目录用于存放编译后
[单片机]
s3c2440中GPIO上拉电阻的初步认识
  GPIO做输出使用时要加上拉电阻,因为默认的是漏极开路,高阻态,无法输出高电平。   GPIO做输入时要根据外围电路选择是否设置上拉电阻: 在外接电路能提供高低电平时可不加上拉电阻,比如作为第二功能的ADC输入,或作为地址总线时;而且作为ADC输入时若加上上拉电阻,还会影响ADC的测量。 当外接电路不能提供高和低电平时加上拉电阻,比如作为按键输入时,如不加上拉电阻,只能输入低电平,无法输入高电平。
[单片机]
S3C2440触摸屏驱动代码分析
实验环境: 主机:Fedora14 开发板:Tq2440 移植linux内核版本:linux-2.6.30.4 最近学习了一下S3C2440的触摸屏驱动代码,也算是对前期一段时间的复习,让自己回忆起一些关于驱动的知识,关于S3C2440的触摸屏驱动代码主要是基于输入子系统的实现,在转载的文章 嵌入式Linux之我行 S3C2440上触摸屏驱动实例开发讲解 一文中详细的介绍了基本的实现。具体的实现我就在介绍,这篇文章已经写得非常的详细。我主要是采用流程图的方式简要的介绍了一下驱动代码的实现过程。 驱动的初始化过程: 驱动的实现过程: 以上的流程图就大致实现了触摸屏的驱动。
[单片机]
<font color='red'>S3C2440</font>触摸屏驱动代码分析

推荐帖子

关于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技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved