|
本帖最后由 WM_CH 于 2019-7-16 18:05 编辑
这段代码是获取ddr大小的,前边对membase的写读写操作和最后对memskip的写操作有什么关系呢?
- /*
- DMB
- 数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作
- 都执行完毕后,才提交(commit)在它后面的存储器访问操作。
- DSB
- 数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作
- 都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)
- ISB
- 指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执
- 行完毕之后,才执行它后面的指令。
- */
- unsigned int get_ddr_size(void)
- {
- #define TO_UINT32(_p) (*(volatile unsigned int *)(_p))
- volatile unsigned char *memskip;
- volatile unsigned char *membase = (unsigned char *)MEM_BASE_DDR;
- unsigned int orgin = TO_UINT32(membase);
- unsigned int rd_origin = 0, rd_verify = 0;
- unsigned int tmp = 0;
- if (ddr_size)
- return ddr_size;
- //没看懂
- for (memskip = membase + SZ_16M;
- memskip <= membase + get_max_ddr_size();
- memskip += SZ_16M) {
- TO_UINT32(membase) = 0xA9A9A9A9;
- tmp = TO_UINT32(membase);
- TO_UINT32(membase) = tmp;
- dsb();
- rd_origin = TO_UINT32(memskip);
- TO_UINT32(membase) = 0x53535352;
- tmp = TO_UINT32(membase);
- TO_UINT32(membase) = tmp;
- dsb();
- rd_verify = TO_UINT32(memskip);
- if (rd_origin != rd_verify) {
- ddr_size = (unsigned int)(memskip - membase);
- break;
- }
- if (_HI3798CV100A == get_chipid()
- || _HI3798CV100 == get_chipid()
- || _HI3796CV100 == get_chipid()) {
- if ((unsigned int)(memskip - membase) >= (SZ_2G - SZ_16M)) {
- ddr_size = SZ_2G;
- break;
- }
- }
- if ((unsigned int)(memskip - membase) >= (SZ_3G + SZ_512M)) {
- ddr_size = SZ_3G + SZ_750M;
- break;
- }
- }
- /* restore membase value. */
- TO_UINT32(membase) = orgin;
- return ddr_size;
- }
复制代码
重点就是这段:
TO_UINT32(membase) = 0xA9A9A9A9;
tmp = TO_UINT32(membase);
TO_UINT32(membase) = tmp;
dsb();
rd_origin = TO_UINT32(memskip);
没明白这段
大哥们指点一下小弟,谢谢
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|