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-02-24 07:55

利用FPGA实现UART的设计
引 言 随着计算机技术的发展和广泛应用,尤其是在工业控制领域的应用越来越广泛,计算机通信显的尤为重要。串行通信虽然使设备之间的连线大为减少,但随之带来串/并转换和位计数等问题,这使串行通信技术比并行通信技术更为复杂。串/并转换可用软件实现,也可用硬件实现。用软件实现串行传送大多采用循环移位指令将一个字节由高位到低位(或低位到高位)一位一位依次传送,这种方法虽然简单但速度慢,而且大量占用CPU的时间,影响系统的性能。更为方便的实现方法是用硬件,目前微处理器串行接口常用的LSI 芯片是UART(通用异步收发器)、USART(通用同步异步收发器)和ACIA(异步通信接口适配器)等。不论是哪一种芯片,它们的一种基本功能是实现串/并转换。
[嵌入式]
关于UART通信端口上射频干扰的研究
  有客户报告其中心位于840MHz左右的RF干扰影响配置成UART的串行通信端口,该接口位于包含一个AD6903(LeMansLCR+)数字式基带处理器的调制解调器和一台主处理机之间。   出现的问题是连接到AD6903GPIO_1引脚的UARTRX信号中出现噪声,每当射频(RF)干扰源出现时,信号平均电压就会远离其期望值。平均电压的偏移幅度取决于RF源的功率和频率。   图2显示当射频功率放大器接通时,进入AD6903的GPIO_1引脚上的UARTRX信号受到影响的情况。在图2中,进入AD6903的UARTRX用粉红色表示,来自主处理机的UARTTX信号用紫色表示,功率放大器使能用黄色表示,而AD6903VEXT电源用绿色表示。
[网络通信]
STM32手册上的SPI/I2S及USART/UART识读话题
我们在做STMCU开发的前期往往需要作芯片的选型,一般先会看选型手册和数据手册。其中有两个地方经常让人一下子难解其意。一个是关于USART/UART的地方,另一个是关于SPI/I2S的地方。 先不妨以STM32F407为例。下面是STMCU选型手册和数据手册相关信息的截图。 从选型手册上看到,STM32F407 的SPI 标了3个,I2S标了2个。这里往往会被误解为3个SPI接口再额外加2个I2S接口。其实不然,我们可以进一步查看数据手册,数据手册里将SPI/I2S写在一起了。这里正确理解应该是说最多3个SPI接口,其中有2个SPI接口与I2S复用,SPI功能与I2S功能是互斥的,即如果作SPI就不
[单片机]
STM32手册上的SPI/I2S及USART/<font color='red'>UART</font>识读话题
MSP430F249 IIC write and Uart send
//******************************************************************************/ #include msp430.h //注意:两次发送间隔必须要有延时,否则不能再次发送,串口发送格式: unsigned char PTxData ; // Pointer to TX data unsigned char pHead; unsigned char pTail; unsigned char TXByteCtr; const unsigned char TxData = // Table of data to tra
[单片机]
S3C2440 块设备驱动程序的编写驱动之用内存模拟硬盘(二十一)
参考内核自带的块设备驱动程序: drivers/block/xd.c drivers/block/z2ram.c 1、本节需要的结构体如下: 1.1 gendisk磁盘结构体: struct gendisk { int major; //设备主设备号,等于register_blkdev()函数里的major int first_minor; //起始次设备号,等于0,则表示此设备号从0开始 int minors; //分区(次设备)数量,当使用alloc_disk()时,就会自动设备该成员 char disk_name ;//块设备名称,等于register_blkdev()函数里的name st
[单片机]
<font color='red'>S3C2440</font> 块设备驱动程序的编写驱动之用内存模拟硬盘(二十一)
STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题
1. 开发环境 开发平台:官方开发板STM32F030R8-Nucleo 开发软件:Keil uVision5.24 开发库:STM32Cube_FW_F0_V1.9.0 2. 实验现象 根据官方例程,将UART1的配置更改为UART2,然后使用杜邦线接到PA2、PA3引脚,可串口就是无法收发数据。之后查看原理图发现,官方的Demo板,默认就没有将PA2、PA3扩展到外部引脚上,而是将这个USART2串口连接到了ST-Link的串口上,这样,ST-Link既可以下载程序,也可以当做开发板的USART2使用。截取部分具体电路图如下: 其中SB14、SB13、SB63和SB62都是零欧姆电阻,问题就在这里了,SB14、
[单片机]
STM32F030R8-Nucleo使用PA2、PA3 <font color='red'>UART</font>2不能使用的问题
S3C2440 如果串口驱动有问题,怎么调(二十二)
有很多人问我,为什么不录串口驱动? 实际上串口裸板很简单,但是串口驱动还是挺复杂的; 另外基本上所有芯片的内核源码中基本上都会有串口驱动。 所以我认为对于串口,我们只要会APP编程即可,不需要去写它的驱动程序。 现在有2个问题: 1.怎么写串口APP? 2.如果串口驱动有问题,怎么调? 第1个问题挺简单,百度搜搜就可以找到源码。 但是向我提问的人还是非常非常多, 我干脆写一个示例代码好了:serial_test.c 这个程序会一边往串口中写入数据0x5A,一边从串口中读出数据并打印出来。 serail_test.c代码如下: #include stdio.h #include string.h #include
[单片机]
<font color='red'>S3C2440</font> 如果串口驱动有问题,怎么调(二十二)
s3c2440中断程序(烧录到NORFlash,运行在SDRAM中)
现在正在看韦东山的《嵌入式Linux应用开发完全手册》,看到了中断部分。书上是将程序烧录到NANDFlash中,由于当mini2440板子从NANDFlash启动的时候,会自动将其中的前4KB程序拷贝到CPU内部的SRAM(4KB大小)中,并且将该SRAM的起始地址映射为0x0。所以当中断发生的时候,PC指针指向0x0+offset(如:IRQ就是0x18),可以找到中断服务程序的入口。 但是有4KB的限制,加上U-BOOT一般都烧录到NORFlash中,再将程序搬移到SDRAM中再运行的,恰好手底下有JLINK设备,所以决定写一个烧录到NORFlash,运行在SDRAM中的中断测试程序。 先说一下整体思路:将系统启动时寻找的八个
[单片机]

推荐帖子

晶振驱动问题
各位大大,本人菜鸟,想问一下,我现在想用一个32.768K的有源晶振驱动MOS,请问能直接驱动吗,如果不能,能帮忙提供一个驱动原理图吗~晶振驱动问题有源晶振驱动CMOS,应该没有什么问题有源晶振可以直接驱动数字电路有源晶振的输出是已经经过整形的TTL方波或正弦波(具体看晶振类型),输出能力是足够强的,驱动同电平规格的MOS电路没问题。MOS管的话,则要看具体电路了。楼主没有说清到底驱动什么,也没有讲具体应用,故只能这么解答一下。 驱动MOS管产生PWM,请问需要加一个驱动隔离吗
考拉zzh 模拟电子
“背板问题”分解来了,且看我们如何捉妖
作者:一博科技高速先生自媒体成员周伟通过上文的查板,我们虽然可以定性到一些问题,但可能还是没法彻底打消一些人的疑虑,同样是插业务板和交换板,为什么其他的槽没有问题?难道不是背板的问题吗?这真是一个拷问灵魂的问题。我们当然是有办法来解决这个问题的,那就是仿真和测试。我们的老铁也一直有上面的疑问,他们手上有大量的交换和业务板,且在之前的老系统里面运行没什么故障,所以就只打算修改背板来解决这个信号质量不好的问题,于是他们只给我们寄了安装上业务卡插槽的连接器的背板过来让我们进行测试。有总比
yvonneGan PCB设计
如何集成第三方软件的帮助文档到 WinCE 本身的帮助里去呢
我们开发了一个软件在WinCE上,运行很好。老板要求把我们自己的帮助文档集成到WinCE的帮助文档里,也就是通过start-help能访问。我用的是windowsmobile6,ceos5.2.那位高人能点拨一下呢,先谢了。如何集成第三方软件的帮助文档到WinCE本身的帮助里去呢不会,关注下。。。
guoguoguo WindowsCE
【TI首届低功耗设计大赛】让开发板说话
板子回来了,这几天焊上了,今天发声了,但也有缺点就是发声的功放耗电在,用USB带会发出的声音不太好听,我用手机充电器的电源带,还可以.以下是编译通过截图:原程序如下: 复制代码 intCS_S=4; intSCLK_S=10; intMOSI_S=9; intINT_S=14; voidsetup() { pinMode(CS_S,OUTPUT);//setsthedigitalpinasout
ddllxxrr 微控制器 MCU
【低功耗】FPGA在便携式产品中应用的低功耗实现方法
随着90nm和65nm半导体工艺节点的到来,使得低功耗小尺寸和高度集成的医疗设备得以出现。对医疗设备制造商而言,其主要挑战是如何选择正确的半导体器件来满足便携式医疗电子产品的功率、性能和价格需求。具备大量的内部RAM和高DSP处理能力的低成本Spartan-3ADSP器件则十分适于实现这些需求。赛灵思的Spartan-3ADSPFPGA器件通过使用高度并行架构提供了巨大的计算能力和硬件可配置能力,从而允许开发人员在构造这些便携式医疗设备时能为不同医疗成像设备的升级和通信算法提供
hangsky FPGA/CPLD
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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