ARM--存储管理器
初入领悟:
1、 bank、L-bank的概念
2、 s3c2440内部管理SDRAM寄存器配置
Frist part:原理分析
S3c2440为32位微处理器,其可访问空间为4G;但其中提供1G外设访问空间,这1G空间有8个bank组成;及平均每个bank有128M的访问空间;其中8bank的特性为:
1、 bank0~bank5支持外接SRAM、ROM等,bank6、bank7支持外接SRAM、ROM与SDRAM等;
2、 bank0~bank6的起始地址是固定
3、 bank7的起始地址可编程设定
4、 bank6、bank7大小可编程确定
5、 每个bank访问周期均可编程设定
6、 外接SDRAM是支持自刷新与省电模式
S3c2440向外引出27根地址线,可实现128M的寻找空间;那他怎么实现1G的空间范围访问呢?这就涉及到了nGCSx片选信号,由控制这几根信号线实现bank的切换,如下图所示:
左边为nor flash下;右边为nand flash;
说到此又想起一概念,就是有关于nor flash与nand flash启动方式;
一、norflash启动
简而言之,既是nor flash启动模式下cpu启动会执行地址0x00000000的指令此指令在使能了nor flash下是就是nor flash的首地址;其中原因为nor flash支持一种名为XIP的执行机制;
二、nandflash启动
nand flash下不支持XIP因此在执行nandflash的程序是,系统将会把nandflash的头4K(最大)启动代码拷贝至系统SRAM中既s3c2440中的steppingstone;
我使用的是GT2440开发板从原理图中可知:
Bank6外接2片H57V2562GTR芯片;
在使用SDRAM时要设置到如下13个寄存器的操作:
各个寄存器值的设置参考开发板每一个bank所接的外设进行设置;
此设置参考示例程序:
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
(.long 汇编中词法,既long数据型)
Second part:程序编写
现在开始编写代码,如我上诉一样启动时CPU将会报前4K程序拷贝至steppingstone中运行;现在编写的代码任务为将steppingstone中的代码拷贝回SDRAM中,并程序从SDRAM中开始执行;
汇编部分:
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl memsetup @ 设置存储控制器
bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中
ldr pc,=on_sdram @ 跳到SDRAM中继续执行
on_sdram:
ldr sp, =0x34000000 @ 设置堆栈
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往WATCHDOG寄存器写0即可
movr1, #0x53000000
movr2, #0x0
strr2, [r1]
movpc, lr @返回
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
mov r1, #0
ldr r2,=SDRAM_BASE
mov r3,#4*1024
1:
ldr r4,[r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
str r4,[r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
cmp r1,r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
bne1b @ 若没有复制完,继续
movpc, lr @ 返回
memsetup:
@ 设置存储控制器以便使用SDRAM等外设
movr1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
addr3, r1, #52 @ 13*4 = 54
1:
ldrr4, [r2], #4 @ 读取设置值,并让r2加4
strr4, [r1], #4 @ 将此值写入寄存器,并让r1加4
cmpr1, r3 @ 判断是否设置完所有13个寄存器
bne1b @ 若没有写成,继续
movpc, lr @ 返回
.align 4 @ARM地址指针对齐伪指令
mem_cfg_val:
@ 存储控制器13个寄存器的设置值
.long 0x22011110 @ BWSCON
.long 0x00000700 @ BANKCON0
.long 0x00000700 @ BANKCON1
.long 0x00000700 @ BANKCON2
.long 0x00000700 @ BANKCON3
.long 0x00000700 @ BANKCON4
.long 0x00000700 @ BANKCON5
.long 0x00018005 @ BANKCON6
.long 0x00018005 @ BANKCON7
.long 0x008C07A3 @ REFRESH
.long 0x000000B1 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7
C函数部分:
- #define GPFCON (*(volatile unsigned long *)0x56000050)
- #define GPFDAT (*(volatile unsigned long *)0x56000054)
- #define GPF4_out (1<<(4*2))
- #define GPF5_out (1<<(5*2))
- #define GPF6_out (1<<(6*2))
- void wait(volatile unsigned long dly)
- {
- for(; dly > 0; dly--);
- }
- int main(void)
- {
- unsigned long i = 0;
- GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4对应的GPF4/5/
- //6三个引脚设为输出
- while(1) {
- wait(30000);
- GPFDAT = (~(i<<4)); // 根据i的值,点亮LED1,2,4
- if(++i == 8)
- i = 0;
- }
- return 0;
- }
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) #define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2)) void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
} int main(void)
{
unsigned long i = 0; GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4对应的GPF4/5/
//6三个引脚设为输出
while(1) {
wait(30000);
GPFDAT = (~(i<<4)); // 根据i的值,点亮LED1,2,4
if(++i == 8)
i = 0;
}
return 0;
}
最后一步:Makefile
sdram.bin : head.S leds.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -oleds.o leds.c
arm-linux-ld -Ttext0x30000000 head.o leds.o -o sdram_elf
arm-linux-objcopy -Obinary -S sdram_elf sdram.bin
arm-linux-objdump -D-m arm sdram_elf > sdram.dis
clean:
rm-f sdram.dis sdram.bin sdram_elf *.o
原理概念纯属个人见解,可能存在一定的不严谨性。
ARM--存储管理器的更多相关文章
- 二、存储管理器--SDRAM
2.1 硬件结构 2.1.1 硬件框图 CPU 通过存储管理器来读取 SDRAM 网卡 等外部设备,CPU不管外部设备是怎么样的,只是读存储管理器中的地址 CPU从0x30000000地址读取数据. ...
- JZ2440存储管理器--SDRAM
为了cpu访问外部设备,ARM提供一个存储管理器部件,提供访问外部设备的所需的信号(对SDRAM.网卡.nor等设备进行初始化,以便存储器管理器配合CPU进行与外设数据通讯). CPU通常读写一 ...
- 微软Azure 存储管理器的简单介绍
Windows Azure存储用户经常希望能够在“管理器”中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我们将对此列表进行更新,使其 ...
- Windows Azure 存储管理器 (2014)
Windows Azure存储用户经常希望能够在"管理器"中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我 ...
- 1-16-2 LVM管理和ssm存储管理器使用&磁盘配额
ssm存储管理器使用&磁盘配额 ssm存储管理器使用 系统存储管理器的使用 系统存储管理器(又称ssm,即system-storage-manager),是RHEL7/CentOS7新增的功能 ...
- 第十五章 LVM管理和ssm存储管理器使用 随堂笔记
第十五章 LVM管理和ssm存储管理器使用 本节所讲内容: 15.1 LVM的工作原理 15.2 创建LVM的基本步骤 15.3 实战-使用SSM工具为公司的邮件服务器创建可动态扩容的存储池 LVM的 ...
- 存储管理器 S3C2440A
CPU通过存储管理器来控制外部设备 SDRAM存储结构 S3C2440A内存控制器 原理图 HY57V561620(L)T 4Banks x 4M x 16Bit Synchronous DRAM S ...
- 1-18-2 LVM管理和ssm存储管理器使用&磁盘配额 (二)
LVM管理和ssm存储管理器使用&磁盘配额 (二) 内容如下: ü LVM快照 ü ssm存储管理器的使用 ü 磁盘配额 第1章 LVM快照 lvm快照:为了保持系统的一致性,我们先做 ...
- 1-18-1 LVM管理和ssm存储管理器使用&磁盘配额(一)
LVM管理和ssm存储管理器使用&磁盘配额(一) LVM逻辑卷的管理 问题:对于生产环境下的服务器来说,如果存储数据的分区磁盘空间不够了怎么办? 因为如果要把一个分区的内容都拷贝到另一个分区上 ...
- 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用
目录 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用 16.1 LVM的工作原理 16.1.1 LVM常用术语 16.1.2 LVM优点 16.2 创建LVM的基本步骤 16.2 ...
随机推荐
- SQL日期(转)
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割 (年.月.日等),然后仅仅用分割出来的年.月.日等放在几个 ...
- Unity3d Shader开发(四)UsePass ,GrabPass ,SubShader Tags
(一)UsePass 命令 使用 来自另一个着色器的命名通道. Syntax 语法 UsePass "Shader/Name" 插入所有来自给定着色器中的给定名字的通道.Shade ...
- 10 Best Responsive HTML5 Frameworks and Tools
http://designinstruct.com/roundups/html5-frameworks/
- Static File Middleware
[ASP.NET Core] Static File Middleware 前言 本篇文章介绍ASP.NET Core里,用来处理静态档案的Middleware,为自己留个纪录也希望能帮助到有需要 ...
- maven 添加Sqlserver的jdbc jar包
maven添加sqlserver的jdbc驱动包 jdbc.jar download url->http://pan.baidu.com/s/1hrEhdti 通过maven命令将jar包安装到 ...
- bug - colorWithPatternImage:
// 在ios5之前, 再通过以下方法设置背景时, 有闪屏bug self.view.backgroundColor = [UIColor colorWithPatternImage:<#(no ...
- iOS开发 AFNetworking 3.0使用遇到的问题
前段时间写了一个iOS开发之AFNetworking 3.0.4使用这篇文章,是基本的用法,昨天在使用的时候又出现了几个问题,特地俩记录下,希望能帮到大家! 问题一 我是做一个获取手机验证码的功能,进 ...
- 仿window阿里旺旺登陆界面,打印机吐纸动画效果-b
偶然的机会发现window的阿里旺旺的登陆效果蛮有意思的,于是就模仿着做了一下打印机吐纸的动画效果看起来很神奇的东西,实现起来却不难,下面我给大家看下主要的源码. - (void)createUI{ ...
- Hibernate与数据库分表
数据库分片(shard)是一种在数据库的某些表变得特别大的时候采用的一种技术. 通过按照一定的维度将表切分,可以使该表在常用的检索中保持较高的效率,而那些不常用的记录则保存在低访问表中.比如:销售记录 ...
- POJ 1236 Network of Schools[连通分量]
题目链接:http://poj.org/problem?id=1236题目大意:给出N台电脑,电脑间单向连通传送文件问题1.网络中最少放几个文件保证所有电脑都能接受到文件问题2.最少向网络中加几条线保 ...