天嵌 ARM开发社区

 找回密码
 注册
查看: 4497|回复: 0

关于 WARNING: Caches not enabled

[复制链接]
zyp568 发表于 2012-9-8 18:25:01 | 显示全部楼层 |阅读模式
本帖最后由 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指令都提示“未定义”...

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 03:59 , Processed in 1.062500 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表