s3c2440 uart 初始化
我写了一个简单的启动程序,从Nand Flash启动,然后将代码从Nand Flash搬到RAM中去执行,在RAM中进行UART初始化。可是最终运行时串口没有输出。
UART初始化:
int serial_init(void)
{
volatile struct mini2440_uart *uart = (volatile struct mini2440_uart *)MINI2440_UART0_BASE;
unsigned long reg = 0, pclk;
#ifdef UART_FIFO
/* FIFO enable, Tx/Rx FIFO clear */
uart->ufcon = 0x07;
#else
uart->ufcon = 0x0;
#endif
uart->umcon = 0x0;
/* Normal,No parity,1 stop,8 bit */
uart->ulcon = 0x03;
/*
* tx=level,rx=edge,disable timeout int.,enable rx error int.,
* normal,interrupt or polling
*/
uart->ucon = 0x0245;
pclk = get_pclk();
if (!pclk)
return -1;
/* value is calculated so : (int)(PCLK/(16*baudrate)) -1 */
reg = (int)(pclk / (16*BAUDRATE)) - 1;
uart->ubrdiv = reg;
pll_delay(100);
pll_delay(0x1000000);
leds(1);
PUTC('H');PUTC('e');PUTC('l');PUTC('l');PUTC('o');
//PUTS("serial init ok!!!\r\n");
leds(2);
return (0);
}
主程序:
start_code:
/*
* set the cpu to SVC32 mode
*/
mrsr0, cpsr
bicr0, r0, #0x1f
orrr0, r0, #0xd3
msrcpsr, r0
#define pWTCON0x53000000
#define INTMSK0x4a000008
#define INTSUBMSK0x4a00001c
/* turn off watchdog */
ldrr0, =pWTCON
movr1, #0x0
strr1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
movr1, #0xffffffff
ldrr0, =INTMSK
strr1, [r0]
ldrr1, =0x7ff
ldrr0, =INTSUBMSK
strr1, [r0]
ldrr0, =0x56000010/* GPBCON */
ldrr1, =0x00015400/* GPB 5,6,7,8 output */
strr1, [r0]
ldrr0, =0x56000014/* GPBDAT */
movr1, #0
mvnr1, r1, lsl #5
strr1, [r0]
bl cpu_init_crit
#define RELOC_ADDR0x30000000
#define RELOC_OFF0x30000000
adrlr, here
ldrr0, =RELOC_OFF
addlr, lr, r0
ldrr0, =RELOC_ADDR
brelocate_code
here:
ldrsp, =CONFIG_SYS_INIT_SP_ADDR
bicsp, sp, #7/* 8-byte alignment */
bl debug
blserial_init
adrr0, current
current:
blafter_relocate
我用LED灯调试,程序是执行到最后的,可是串口却无法输出。
我把代码改成从SDRAM中执行,其中也将代码搬运到SDRAM中较后的地方执行,串口却正常输出。
恳请大虾指点迷津。
完整代码下载:
http://pan.baidu.com/share/link?shareid=478415&uk=788634284 arm?uart?c C ARM
------解决方案--------------------
nand flash 驱动测试过吗?
[解决办法]
搬到SDRAM可以执行,搬到DDR不能执行,楼主是怎么确认DDR已经初始化好了的?
[解决办法]
片内的SDRAM是由芯片内部的firmware初始化了不需要你写代码,片外的SDRAM是要你自己写初始化代码的
[解决办法]
你的PUTC是怎么实现的,如果是printf,要到对应System.map 去查
加上
//int (*printf)(const char *, ...) = (int (*)(const char *, ...))0xc7e11d78;
//printf(xxxxxxxxxxxx);
#define printf(...) (((int (*)(const char *, ...))0xc7e11d78)(__VA_ARGS__))