Mini2440 SDRAM、NAND、MMU

发布者:独行于世最新更新时间:2022-10-20 来源: csdn关键字:Mini2440  SDRAM  NAND  MMU 手机看文章 扫描二维码
随时随地手机看文章

1. SDRAM

当加电默认从NAND启动时,先将4K代码复制到Steppingstone内RAM执行,在执行Steppingstone代码时,会将剩余的代码复制到SDRAM执行,但是使用SDRAM必须先对其有关SDRAM的寄存器进行初始化,以便能使用SDRAM


主要包括寄存器: BWSCON、BANKCON0~7、REFRESH、BANKSIZE、MRSRB6~7


这些寄存器要根据相应的单板进行设置,如下为Mini2440默认设置


 0x22011110,     //BWSCON

 0x00000700,     //BANKCON0

 0x00000700,     //BANKCON1

 0x00000700,     //BANKCON2

 0x00000700,     //BANKCON3  

 0x00000700,     //BANKCON4

 0x00000700,     //BANKCON5

 0x00018005,     //BANKCON6

 0x00018005,     //BANKCON7

 0x008C07A3,     //REFRESH

 0x000000B1,     //BANKSIZE

 0x00000030,     //MRSRB6

 0x00000030,     //MRSRB7

    0x22011110  ;       @ BWSCON     //对不同的128M块进行设置

    0x00000700  ;   @ BANKCON0  //块0的设置,以下类同

    。。。

    0x00018005     ; @ BANKCON6  //主要考虑内存的列地址的位数,下一个类同

    。。。

    0x008C07A3    ; @ REFRESH       //这个值要注意晶振频率导致的差异,Mini440初始晶振=12mhz

    0x000000B1     ; @ BANKSIZE    //内存块选取的设置

    0x00000030     ; @ MRSRB6       //对SDRAM时间参数进行设置


   对块初始化为例,如下


#define MEM_CTL_BASE 0x48000000


void memsetup(void)

{

unsigned long const mem_cfg_val[] = {0x22011110,

0x00000700,

0x00000700,

0x00000700,

0x00000700,

0x00000700,

0x00000700,

0x00018005,

0x008c07a3,

0x000000b1,

0x00000030,

0x00000030,

};

int i;

volatile unsigned long* p = (volatile unsigned long*)MEM_CTL_BASE;

for(i = 0; i<13; i++ )

{

p[i] = mem_cfg_val[i];

}

}


这里将存储控制器所有的块以及特殊寄存器的设置都放到数组里,然后对他们一一初始化


2. MMU(内存管理单元)

     一般主要设置页表和内存的地址映射问题,先看一段启动的汇编代码


 AREA head,CODE,READONLY

ENTRY

CODE32

start

ldr sp,=4096

bl disable_watch_dog

bl memsetup

bl copy_2th_to_sdram

bl create_page_table

bl mmu_init

ldr sp,=0xb4000000

ldr pc,=0xb0004000

halt_loop

b halt_loop

END


这里可以看到主要有create_page_table 和mmu_init两部分进行MMU的设置,主要是地址的映射


下面看create_page_table虚拟地址的映射


void create_page_table(void)

{

unsigned long virtaddr,physaddr;

unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;

#define MMU_FULL_ACESS  (3<<10)

#define MMU_DOMAIN      (0<<5)

#define MMU_SPECIAL     (1<<4)

#define MMU_CACHEABLE   (1<<3)

#define MMU_BUFFERABLE  (1<<2)

#define MMU_SECTION     (2<<0)

#define MMU_SECDESC     (MMU_FULL_ACESS | MMU_DOMAIN | MMU_SPECIAL | MMU_SECTION)

#define MMU_SECTION_WB  (MMU_SECDESC | MMU_CACHEABLE | MMU_BUFFERABLE)

 

virtaddr = 0;

physaddr = 0;

  //这个应该为mmu_tlb_base&fff00000

*(mmu_tlb_base + (virtaddr>>20)) = (physaddr&0xfff00000)|MMU_SECTION_WB;

 

 

virtaddr = 0xa0000000;

physaddr = 0x56000000;

*(mmu_tlb_base + (virtaddr>>20)) = (physaddr&0xfff00000)|MMU_SECTION;

 

 

virtaddr = 0xb0000000;

physaddr = 0x30000000;

while(virtaddr < 0xb4000000)

{

*(mmu_tlb_base + (virtaddr>>20)) = (physaddr&0xfff00000)|MMU_SECTION_WB;

physaddr += 0x100000;

virtaddr += 0x100000;

}

}



这个主要是虚拟地址的映射


virtaddr = 0xb0000000;     //虚拟地址,即连接后的地址

 physaddr = 0x30000000; //物理地址,实际程序在内存的运行地址

 while(virtaddr < 0xb4000000)

 {

  *(mmu_tlb_base + (virtaddr>>20)) = (physaddr&0xfff00000)|MMU_SECTION_WB;

  physaddr += 0x100000;

  virtaddr += 0x100000;

 }


这里是一级页表也就是采用段的方式,将页表的内存放到虚拟地址去,怎么放呢?


首先怎么得到页表?(physaddr&0xfff00000)段基址  MMU_SECTION_WB设置段的访问权限


那么如何放到虚拟地址呢?首先他一般是需要TLB寄存器的值和MVA的值组成,MVA即是virtaddr,TLB即是mmu_tlb_base,各位怎么放置请看手册


对于为何physaddr、virtaddr都是加0x100000? 这里段默认是只能访问1M的空间,而0x100000正好是1M


对于如何实现MMU呢?


void mmu_init(void)

{

__asm{

mov r0,#0

mcr p15,0,r0,c7,c7,0  //使无效Icache和Dcache

mcr p15,0,r0,c7,c10,0 

mcr p15,0,r0,c8,c7,0  //使无效指令,数据TLB

mov r4,#0

mcr p15,0,r4,c2,c0,0 //设置页表寄存器

mov r0,#0

mcr p15,0,r0,c3,c0,0 //域访问控制寄存器,不进行权限检查

mrc p15,0,r0,c1,c0,0 //读取控制寄存器

bic r0,r0,#0x3000    //清除V、I位

bic r0,r0,#0x300     //清除R、S位

bic r0,r0,#0x0087    //清除B、C、A、M位

orr r0,r0,#0x0002    //对齐检查

orr r0,r0,#0x0004    //开启Dcache

orr r0,r0,#0x1000    //开启Icache

orr r0,r0,#0x0001    //使能MMU

mcr p15,0,r0,c1,c0,0 //写入寄存器

}

}


请看右侧的注释    


3.NAND设置

请先看如下设置图示

关键字:Mini2440  SDRAM  NAND  MMU 引用地址:Mini2440 SDRAM、NAND、MMU

上一篇:Mini2440 裸机实验之LED程序、按键、中断
下一篇:mini2440 LCD驱动

推荐阅读最新更新时间:2024-11-09 13:05

消息称三星电子本季度 NAND 闪存产能环比提升 30%,年内维持约 50% 规模上限
4 月 16 日消息,据韩媒《朝鲜日报》报道,三星电子本季度在韩国平泽和中国西安 NAND 生产线的晶圆投片量相较上季度提升约 30%。不过三星方面对进一步的增产持谨慎态度,以免影响到 NAND 价格的涨势。 在马力全开的情况下,三星电子 NAND 闪存生产线季度晶圆投片量可超 200 万片。 而目前三星内部对二至四季度的晶圆投片量均设下了 120 万片的红线,这意味着整体产能利用率维持在 50% 左右。 报道预计三星电子将在本月末的一季度财报电话会议上重申针对 NAND 进行减产的立场。在上次财报会议上,三星电子表示主要客户仍存在 NAND 库存积压问题,因此将延续高强度减产态势。 另据行业分析机构 Omdia 的最新数据,铠侠
[半导体设计/制造]
2.1MMU的知识
2.1MMU的知识 Loop.c的代码是: Loop.c的代码是: 最后两个程序的运行结果: 我们看到两个程序里的地址是一样的。这是怎么回事呢!? 这就是我们今天的重点:MMU内存管理单元。 MMU的作用:两个 上面是虚拟地址和物理地址的转化。 在上面的两个程序中,输出的都是虚拟地址,MMU会将虚拟地址转化为对应的物理地址。上面的两个虚拟地址是相同的。为什么转化后会变成不同的物理地址呢?这是因为我们的MMU对于不同的进程,他是有不同的转化和映射关系的。如上图。 深入剖析地址转化 段式转化分析 4.细页转化: 配置与使用MMU 在
[单片机]
2.1<font color='red'>MMU</font>的知识
西数计划在年底前量产162层NAND 目标到2024年超过200层
西部数据计划开始大规模生产162层的BiCS6 3D NAND,这可能在今年年底前就用于PCIe 5规范的SSD。该公司还在研发用于数据中心存储的200层以上的NAND,PLC,以及将多个3D NAND晶圆粘合在一起以增加层数的方法。 西部数据与合作伙伴Kioxia一起,刚刚让我们看到了他们未来几年NAND发展的路线图。该公司计划很快推出其第六代BiCS,它将具有162层的TLC和QLC结构。 考虑到美光等竞争对手已经有176层NAND一段时间了,这听起来可能不是那么令人印象深刻,但西数声称他们将通过使用一种新材料来缩小存储单元的尺寸,从而使芯片尺寸更小。这将使他们能够制造出更便宜的存储设备,而且性能同样出色。BiCS6
[手机便携]
基于Linux-2.6.32.2在mini2440驱动分析一:串口驱动
串口驱动文件位于: linux-2.6.32.2/drivers/serial/s3c2440.c,省去非重点部分分析。 #include linux/module.h #include linux/ioport.h #include linux/io.h #include linux/platform_device.h #include linux/init.h #include linux/serial_core.h #include linux/serial.h #include asm/irq.h #include mach/hardware.h #include plat/regs-serial
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(3)
增加Nor Flash支持和增加DM9000支持 增加Nor Flash支持 参考网址:http://blog.csdn.net/l_backkom/article/details/6252410和《Mini2440之U-boot使用及移植详细手册2010-4-16》 修改该后串口输出如下: 显示2MiB。 relocaddr被修改成了0x33FB0000,和CONFIG_SYS_TEXT_BASE是一致的。reloc off为0,这个应该是copy前后的偏移。 @2014-03-31实验了一下在Nor下面saveenv,结果是失败,一直停留在Writing to Flash...上面,调试发现在u-boo
[单片机]
Windows下u-boot-2011.03在<font color='red'>Mini2440</font>移植详解(3)
玩转mini2440开发板之【在Ubuntu 14.04下编译安装tslib 1.4版本】
今天在研究mini2440的QT程序时,发现缺少tslib,于是想办法安装。 一开始想直接去tslib官网上下载最新版本的,但是编译时发现无法通过,于是只好按照大多数网友的做法,取了一个最成熟最稳定的版本(1.4版)来使用。步骤记录如下: 1、准备工作 首先执行以下命令,确认tslib所需的各个库都已正常安装。 # apt-get install autoconf # apt-get install automake # apt-get install libtool 2、下载源码 这里我使用的是CSDN网友上传的版本,经测试在我本人的开发环境下(64位Ubuntu 14.04)是可用的,大家自行下载即可(http
[单片机]
消息称三星DRAM及NAND计划Q3涨价15-20%
由于人工智能(AI)需求激增,存储半导体方面竞争进一步加剧,预计三星电子下半年业绩将有所改善。 据韩国《每日经济新闻》,三星电子近期已向包括戴尔科技、慧与 HPE 在内的主要客户通报了涨价计划,准备在第三季度将其主要存储半导体、服务器 DRAM 和企业级 NAND 闪存报价提高 15-20%,而三星 Q2 已将其企业级 NAND 闪存涨价 20% 以上。 三星电子负责半导体业务的设备解决方案部门(DS)今天在京畿道华城工厂召开了全球战略会议,就这一计划进行了通报。 根据市场研究公司 D-RAM Exchange 的数据,今年第一季度全球企业级 NAND 闪存销售额达到 37.58 亿美元(IT之家备注:当前约 273.43 亿元人
[半导体设计/制造]
友善之臂Mini2440之嵌入式Linux下Nor Flash驱动程序设计
前面已经详细讲述了MTD子系统原理知识,这一节讲述嵌入式Linux下对NorFlash的驱动程序设计。在MTD设备层上有MTD字符设备和MTD块设备。 1、MTD字符设备层的源码文件为/mtd/mtdchar.c。该源码文件为MTD原始设备提供了一个字符设备访问接口,使得上层应用程序可以以字符设备的方式来访问MTD原始设备。mtdchar.c主要定义了一个字符设备访问文件操作函数和向内核注册了一个字符设备,MTD字符设备的主设备号为90,源码如下: #define MTD_CHAR_MAJOR 90 #define MTD_BLOCK_MAJOR 31 static const struct file_operatio
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved