打印

AM335X的MMU和CACHE配置

[复制链接]
7209|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nicholasldf|  楼主 | 2013-10-1 23:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************************
*                                                                                                                                                          *
* \brief  Function to setup MMU. This function Maps three regions (1. DDR     *
*         2. OCMC and 3. Device memory) and enables MMU.                      *
*                                                                             *
*  - 使能MMU,使能非对齐访问,解决数据异常问题                         *
* 1、ARMv7默认支持非对齐地址访问,但有些条件:                                *
*     (1)CP15系统控制寄存器(SCTLR), bit.A = 0, (bit.U = 1, ARMv7已默认置1)  *
*     (2)访问地址必须为Normal memory, 访问Device memory或Strongly memory    *
*     会引发alignment fault的Data Abort。而如果MMU disable的话,所有的memory  *
*     都被当作Strongly memory处理。所以MMU必须enable,                        *
* 2、如果目标处理器选择了ARMv6、ARMv7-A、ARMv7-R,编译器的缺省选项是          *
*   --unaligned_access                                                        *
* 3、如果目标平台是ARMv6或ARMv7-AR,但代码中MMU disable,那应该手动添加编译   *
*   选项--no_unaligned_access,让编译器来生成非对齐访问。                     *
******************************************************************************/
//SECTION大小为1M,DDR3存储器为512M字节
#define START_ADDR_DDR                     (0x80000000)
#define START_ADDR_DEV                     (0x44000000)
#define START_ADDR_OCMC                    (0x40300000)
#define NUM_SECTIONS_DDR                   (512)
#define NUM_SECTIONS_DEV                   (960)
#define NUM_SECTIONS_OCMC                  (1)
//MMU页表
#pragma data_alignment=16384
static volatile unsigned int pageTable[4*1024];
//MMU配置
void MMUConfigAndEnable(void)
{
    /*
    ** Define DDR memory region of AM335x. DDR can be configured as Normal
    ** memory with R/W access in user/privileged modes. The cache attributes
    ** specified here are,
    ** Inner - Write through, No Write Allocate
    ** Outer - Write Back, Write Allocate
    */
    REGION regionDdr = {
                        MMU_PGTYPE_SECTION, START_ADDR_DDR, NUM_SECTIONS_DDR,
                        MMU_MEMTYPE_NORMAL_NON_SHAREABLE(MMU_CACHE_WT_NOWA,
                                                     MMU_CACHE_WT_NOWA),
                        MMU_REGION_NON_SECURE, MMU_AP_PRV_RW_USR_RW,
                        (unsigned int*)pageTable
                       };
    /*
    ** Define OCMC RAM region of AM335x. Same Attributes of DDR region given.
    */
    REGION regionOcmc = {
                         MMU_PGTYPE_SECTION, START_ADDR_OCMC, NUM_SECTIONS_OCMC,
                         MMU_MEMTYPE_NORMAL_NON_SHAREABLE(MMU_CACHE_WT_NOWA,
                                                      MMU_CACHE_WT_NOWA),
                         MMU_REGION_NON_SECURE, MMU_AP_PRV_RW_USR_RW,
                         (unsigned int*)pageTable
                        };

    /*
    ** Define Device Memory Region. The region between OCMC and DDR is
    ** configured as device memory, with R/W access in user/privileged modes.
    ** Also, the region is marked 'Execute Never'.
    */
    REGION regionDev = {
                        MMU_PGTYPE_SECTION, START_ADDR_DEV, NUM_SECTIONS_DEV,
                        MMU_MEMTYPE_STRONG_ORD_SHAREABLE,
                        MMU_REGION_NON_SECURE,
                        MMU_AP_PRV_RW_USR_RW  | MMU_SECTION_EXEC_NEVER,
                        (unsigned int*)pageTable
                       };

    /* Initialize the page table and MMU */
    MMUInit((unsigned int*)pageTable);

    /* Map the defined regions */
    MMUMemRegionMap(&regionDdr);
    MMUMemRegionMap(&regionOcmc);
    MMUMemRegionMap(&regionDev);

    /* Now Safe to enable MMU */
    MMUEnable((unsigned int*)pageTable);
}

相关帖子

沙发
阿南| | 2013-10-2 07:05 | 只看该作者
什么意思

使用特权

评论回复
板凳
tyou| | 2013-10-3 14:49 | 只看该作者
搞不懂这个:
cache只是cpu内部可见。
如果想当成RAM来使用,是否不可行?
或是必须外部有SRAM或NOR FLASH来对应?
但是一般CORTEX A5 Ax之类的,是不是只对外部DRAM可以cacheable?
或是 AMBA AXI总线上的外部存储空间才可以cacheable?

使用特权

评论回复
地板
nicholasldf|  楼主 | 2013-10-5 22:59 | 只看该作者
wlz966   2013-9-9 13:58
楼主,AM335x打开MMU和CACHE后,定时器的寄存器写出错的问题你解决了没有?
现在我碰到的问题是关闭CACHE后,用DMA读SD正确,打开CACHE后读进来就不正确了,不知道怎么回事,楼主能否指点一下,我用的am3359。
谢谢

用帖子形式回复一下wlz966
解决这个问题:  AM335x打开MMU和CACHE后,定时器的寄存器写出错 https://bbs.21ic.com/icview-391096-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

261

帖子

10

粉丝