请教高手们:
原FL2440的开发板,晶体为12MHz,修改为16.9344M后,无法启动,不知何因?
先说一下FL2440的bootloader的组成:
飞凌开发板提供的bootloader由uboot和eboot两部分组成,前面的uboot实现自拷备,同时引导eboot。
eboot实现引导NK。
这里需要修改uboot的代码实现更换晶体。但是实践发现无法正常工作。具体我修改步骤如下:
一:option.inc中:
- ;XTAL_SEL SETA 12000000
- XTAL_SEL SETA 16934400
选择16.9344M的晶体
二:option.inc中,
- ;FCLK SETA 400000000
- FCLK SETA 399651840
修改FCLK为399.65M
三:option.inc中,添加399.65M的分频参数,这里是在16.9344M的分支选项中添加。
- [ FCLK = 399651840
- M_MDIV EQU 110 ;Fin=16.9344MHz
- M_PDIV EQU 3
- [ CPU_SEL = 32440001
- M_SDIV EQU 1 ; 2440A
- |
- M_SDIV EQU 0 ; 2440X
- ]
- ]
四:option.h中,
- //#define FIN (12000000)
- #define FIN (16934400)
我觉得该改的都改了,可是为什么就是起不来呢?
在最开始在AXD下调试bootloader时,需要初始化SDRAM,FL2440默认是通过AXD运行一会儿
2440Init.axf,达到初始化SDRAM的目的,然后再导入bootloader。这样就能正常运行导入
的bootloader了。这种方法在12M的板子上是没有问题的,但是我换用16.9344M之后,用同
样的2440Init.axf,再导入上面修改后生成的bootloader映像,却不能正常运行。
后来我没有用那个2440Init.axf了,而是找了个2440init.ini的脚本文件,相关代码如下:
- com ==================
- com Filename: 2440Anorom.ini
- com 2003. 5. xx 1st draft.
- com 2004. 3. 4 edited for S3C2440A
- com ==================
- com For S3C2440A
- com SDRAM_Little_32, 64MB
- com FCLK:101.25MHz UPLL:48MHz
- com SDRAM refresh: 64ms(8Kcycle) -> 7.8us
- swat $vector_catch 0x00
- swat $semihosting_enabled 0x00
- swat psr %IFt_SVC
- com swat psr %IF_SVC32
- com [disable Watch-Dog reset]
- swat *0x53000000 0
- com << Clock setting >>
- com [PLL lock time setting maximum]
- swat *0x4c000000 ((0xfff<<12)+(0xfff<<0))
- com FCLK:HCLK:PCLK=1:3:6.
- swat *0x4c000014 ((0<<2)+(3<<1)+(1))
- com [FCLK PMS setting:294.9140MHz -> 0x7f,2,2]
- swat *0x4c000004 ((0x61<<12)+(0x1<<4)+(0x2<<0))
- com [UCLK PMS setting:48MHz -> 0x78,2,3]
- swat *0x4c000008 ((0x40<<12)+(0x4<<4)+(0x2<<0))
- com << Memory setting >>
- com [Bank6/7: 32-bit bus width]
- swat *0x48000000 0x22000000
- com [Bank0-5: Access cycle: 14-clocks, others:0-clock]
- swat *0x48000004 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- swat *0x48000008 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- swat *0x4800000c ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- swat *0x48000010 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- swat *0x48000014 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- swat *0x48000018 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
- com [Bank6/7: SDRAM, Trcd:2clock, CA:9-bit]
- swat *0x4800001c ((3<<15)+(0<<2)+1)
- swat *0x48000020 ((3<<15)+(0<<2)+1)
- com [SDRAM refresh enable, Trp=2clk, Trc=5clk, Refresh:1654]
- swat *0x48000024 ((1<<23)+(0<<22)+(0<<20)+(1<<18)+1654)
- com [SCKE_EN enable, SCLK_EN enable, Bank6/7 memory map: 64MB/64MB]
- swat *0x48000028 (0x1+(1<<5)+(1<<4))
- com [Bank6/7 CL: 3-clocks]
- swat *0x4800002c 0x30
- swat *0x48000030 0x30
在运行AXD之后, 先通过OB命令执行上面的脚本,给SDRAM初始化,同时初始化看
门狗等,这时汇编下的代码可以跑过去了,在汇编下设置寄存器操作LED灯正常。
程序跳到C语言之后,打印串口信息为乱码。但是仔细看了下FCLK,HCLK,PCLK,
配置的是正确的呀?
而且在AXD下通过观察CLKDIVN以及MPLLCON的值,和汇编中设置的是完全匹配的。
单步在C语言中跟踪,跟踪的函数代码如下:
- static void cal_cpu_bus_clk(void)
- {
- U32 val;
- U8 m, p, s;
-
- val = rMPLLCON;
- m = (val>>12)&0xff;
- p = (val>>4)&0x3f;
- s = val&3;
- //(m+8)*FIN*2 不要超出32位数!
- FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<
-
- val = rCLKDIVN;
- m = (val>>1)&3;
- p = val&1;
- val = rCAMDIVN;
- s = val>>8;
-
- switch (m) {
- case 0:
- HCLK = FCLK;
- break;
- case 1:
- HCLK = FCLK>>1;
- break;
- case 2:
- if(s&2)
- HCLK = FCLK>>3;
- else
- HCLK = FCLK>>2;
- break;
- case 3:
- if(s&1)
- HCLK = FCLK/6;
- else
- HCLK = FCLK/3;
- break;
- }
-
- if(p)
- PCLK = HCLK>>1;
- else
- PCLK = HCLK;
-
- if(s&0x10)
- cpu_freq = HCLK;
- else
- cpu_freq = FCLK;
-
- val = rUPLLCON;
- m = (val>>12)&0xff;
- p = (val>>4)&0x3f;
- s = val&3;
- UPLL = ((m+8)*FIN)/((p+2)*(1<
- if(UPLL==96*MEGA)
- rCLKDIVN |= 8; //UCLK=UPLL/2
- UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
- }
发现读出来的rMPLLCON的值时而是正确的,时而又是错误的。
一旦读出的是错误的,在后面的打印信息中将会出现异常。
为什么同一个程序,时而读的是对的,时而读的又是错的呢?
难道换个晶体,还要对SDRAM进行重配置不成?
期待高手指点,感激不尽。