完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
环境: 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 enabledn"); } 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指令都提示“未定义”... |
|
相关推荐
2个回答
|
|
老师,我也碰到这个问题啊
U-Boot 2012.07 (Sep 17 2012 - 12:52:02) for SMDK6410 CPU: S3C6410@667MHz Fclk = 667MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode) Board: SMDK6410 DRAM: 256 MiB WARNING: Caches not enabled Flash: *** no nor flash *** NAND: 2048 MiB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: CS8900-0 Hit any key to stop autoboot: 0 SMDK6410 # print Unknown command 'print' - try 'help' |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2172 浏览 6 评论
1978 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4537 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 05:39 , Processed in 0.531681 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号