| 
 | 
 
 本帖最后由 zyp568 于 2012-9-8 18:32 编辑  
 
环境:   TQ2440 + arm-linux-gcc-4.3.2 + ubuntu12.04 
uboot版本:2012.07 
移植uboot,串口信息里,有一条警告WARNING: Caches not enabled,分析了一下,觉得这好像是一条误报。求支援啊。 
 
按照信息搜索了源码,发现有如下定义: 
/* 
* Default implementation of enable_caches() 
* Real implementation should be in platform code 
*/ 
void __enable_caches(void) 
{ 
        puts("WARNING: Caches not enabled\n"); 
} 
void enable_caches(void) 
         __attribute__((weak, alias("__enable_caches"))); 
enable_caches是个弱函数,再从注释的意思看,应该是要在平台相关代码里重新定义。 
PS: 
       搜索工程,却找不到重新定义的地方。尝试在board中的TQ2440.c里自行定义该函数: 
       void enable_caches(void) 
       {} 
       重新编译,启动uboot后,所有命令都失效了,全提示未定义命令,help。。。救命都不行了。难道要在cpu.c里重定义? 
 
从启动过程看, 
board_init_r()在start.S启动代码里被有条件调用: 
#ifdef CONFIG_NAND_SPL 
... 
#else 
调用 board_init_r() 
#endif 
对于我修改的代码,没有定义CONFIG_NAND_SPL,调用条件是成立的。 
enable_caches()在board_init_r()被无条件调用。 
那就是说必然输出该条警告信息了。 
 
但是,在board_init_r()中调用enable_caches()之后,接着调用了board_init(): 
int board_init(void) 
{ 
         gd->bd->bi_arch_number = MACH_TYPE_S3C2440; 
         gd->bd->bi_boot_params = 0x30000100; 
          icache_enable(); 
         dcache_enable(); 
          /************************************************/ 
        display_cp15_c1c2c3(); 
        /************************************************/ 
        return 0; 
} 
其中icache_enable();和dcache_enable();,在没有定义CONFIG_SYS_DCACHE_OFF和CONFIG_SYS_ICACHE_OFF的情况下,即可开启icache、dcache和MMU。这两个宏我都没有定义。 
添加display_cp15_c1c2c3()函数,输出cp15相关值到串口: 
c1 : 0xc000107f,可以看出MMU和两个cache都已经开启了。 
c2 : 0x33ff0000,即board_init_f()函数中设定的TLB表地址。 
c3 : 0xffffffff,即不检查读写权限(页表描述符中AP设了也白设)。 
 
综上,board_init_r()中调用enable_caches()完全就是在浪费体力嘛,还整出一条警告来让我纠结。 
修改代码,直接把该函数从board_init_r()中屏蔽掉。 
启动uboot,该警告信息没有了,试了几个命令也可以正常使用。 
 
查看MMU地址映射表: 
TQ2440 # md 0x33FF0000 
33ff0000: 00000c12 00100c12 00200c12 00300c12    .......... ...0. 
33ff0010: 00400c12 00500c12 00600c12 00700c12    ..@...P...`...p. 
33ff0020: 00800c12 00900c12 00a00c12 00b00c12    ................ 
33ff0030: 00c00c12 00d00c12 00e00c12 00f00c12    ................ 
33ff0040: 01000c12 01100c12 01200c12 01300c12    .......... ...0. 
33ff0050: 01400c12 01500c12 01600c12 01700c12    ..@...P...`...p. 
33ff0060: 01800c12 01900c12 01a00c12 01b00c12    ................ 
33ff0070: 01c00c12 01d00c12 01e00c12 01f00c12    ................ 
33ff0080: 02000c12 02100c12 02200c12 02300c12    .......... ...0. 
33ff0090: 02400c12 02500c12 02600c12 02700c12    ..@...P...`...p. 
33ff00a0: 02800c12 02900c12 02a00c12 02b00c12    ................ 
33ff00b0: 02c00c12 02d00c12 02e00c12 02f00c12    ................ 
33ff00c0: 03000c12 03100c12 03200c12 03300c12    .......... ...0. 
33ff00d0: 03400c12 03500c12 03600c12 03700c12    ..@...P...`...p. 
33ff00e0: 03800c12 03900c12 03a00c12 03b00c12    ................ 
33ff00f0: 03c00c12 03d00c12 03e00c12 03f00c12    ................ 
 
数字末尾都是0x00c12,对应到一级描述符中: 
Bit[1:0] = 0x10 ,即为段描述符。 
AP[1:0] = 0x11 ,特权级和用户级都可以读写。 
域[3:0] = 0x0000 ,位于域0。 
用户定义位[0] = 1 ,用户定义位为1。 
C、B位都为0,不知道S3C2440在禁止MMU时,是否支持开启cache和buffer。MMU已经开启,这两位就没意义了。 
至此,应该可以确定,屏蔽掉board_init_r()中的enable_caches()调用,应该没有问题吧? 
 
PS: 
上面PS里的那个问题,还是没找到是啥原因,我尝试在函数里加写打印信息,是能够正确打印的,但就是所有uboot指令都提示“未定义”...  
 
 |   
 
 
 
 |