Nand Flash 裸机程序
硬件平台 :JZ2440
实现功能:初始化 Nand Flash 和 sdram,并将代码从 Nand Flash 拷贝到 sdram。
start.s --> 上电初始化 nand 与sdram
nand.c --> Nand Flash 初始化函数
sdram.c --> sdram 初始化函数
leds.c --> led 闪烁
start.s 源码:
.text
.global _start
_start:
ldr sp,=
bl disable_watch_dog
bl sdram_init
bl nand_init
ldr r0,=0x30000000
mov r1,#
mov r2,#
bl nand_read
ldr sp,=0x34000000
ldr lr,=loop1
ldr pc,=0x30000000
loop1:
b loop1
nand.c 源码:
#define BUSY 1 #define NAND_SECTOR_SIZE_LP 2048
#define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1) typedef struct
{
int NFCONF;
int NFCONT;
int NFCMD;
int NFADDR;
int NFDATA;
int NFMECCD0;
int NFMECCD1;
int NFSECCD;
int NFSTAT;
int NFESTAT0;
int NFESTAT1;
int NFMECC0;
int NFMECC1;
int NFSECC;
int NFSBLK;
int NFEBLK;
} S3C2440_NAND; static S3C2440_NAND *s3c2440nand = (S3C2440_NAND *)0x4e000000; /* 供外部调用的函数 */
void nand_init(void);
void nand_read(unsigned char *buf, unsigned long start_addr, int size); /* S3C2440的NAND Flash处理函数 */
static void nand_reset(void);
static void wait_idle(void);
static void nand_select_chip(void);
static void nand_deselect_chip(void);
static void write_cmd(int cmd);
static void write_addr(unsigned int addr);
static unsigned char read_data(void); /* 复位 */
static void nand_reset(void)
{
nand_select_chip();
write_cmd(0xff); // 复位命令
wait_idle();
nand_deselect_chip();
} /* 等待NAND Flash就绪 */
static void wait_idle(void)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;
while(!(*p & BUSY))
for(i=; i<; i++);
} /* 发出片选信号 */
static void nand_select_chip(void)
{
int i;
s3c2440nand->NFCONT &= ~(<<);
for(i=; i<; i++);
} /* 取消片选信号 */
static void nand_deselect_chip(void)
{
s3c2440nand->NFCONT |= (<<);
} /* 发出命令 */
static void write_cmd(int cmd)
{
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;
*p = cmd;
} /* 发出地址 */
static void write_addr(unsigned int addr)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
int col, page; col = addr & NAND_BLOCK_MASK_LP;
page = addr / NAND_SECTOR_SIZE_LP; *p = col & 0xff; /* Column Address A0~A7 */
for(i=; i<; i++);
*p = (col >> ) & 0x0f; /* Column Address A8~A11 */
for(i=; i<; i++);
*p = page & 0xff; /* Row Address A12~A19 */
for(i=; i<; i++);
*p = (page >> ) & 0xff; /* Row Address A20~A27 */
for(i=; i<; i++);
*p = (page >> ) & 0x03; /* Row Address A28~A29 */
for(i=; i<; i++);
} /* 读取数据 */
static unsigned char read_data(void)
{
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;
return *p;
} /* 初始化NAND Flash */
void nand_init(void)
{
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0 /* 设置时序 */
s3c2440nand->NFCONF = (TACLS<<)|(TWRPH0<<)|(TWRPH1<<);
/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
s3c2440nand->NFCONT = (<<)|(<<)|(<<);
/* 复位NAND Flash */
nand_reset();
} /* 读函数 */
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK_LP) || (size & NAND_BLOCK_MASK_LP))
{
return ; /* 地址或长度不对齐 */
}
/* 选中芯片 */
nand_select_chip();
for(i=start_addr; i < (start_addr + size);)
{
/* 发出READ0命令 */
write_cmd();
/* Write Address */
write_addr(i);
write_cmd(0x30);
wait_idle();
for(j=; j < NAND_SECTOR_SIZE_LP; j++, i++) //一页2k
{
*buf = read_data();
buf++;
}
}
/* 取消片选信号 */
nand_deselect_chip();
return ;
}
sdram.c 源码:
void disable_watch_dog(void)
{
(*(unsigned long *)0x53000000)=;
} void sdram_init(void)
{
unsigned long p[]={ 0x22011110,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00000700,
0x00018005,
0x00018005,
0x008c07a3,
0x000000b1,
0x00000030,
0x00000030 };
unsigned long *sdram_base=(unsigned long *)0x48000000;
int i=;
for(;i<;i++) sdram_base[i]=p[i];
}
leds.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 > ; dly--);
} int main(void)
{
unsigned long i = ; GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1-3对应的GPF4/5/6三个引脚设为输出 while(){
wait();
GPFDAT = (~(i<<)); // 根据i的值,点亮LED1-3
if(++i == )
i = ;
} return ;
}
链接脚本 nand.lds:
SECTIONS
{
first 0x00000000 :{start.o sdram.o nand.o}
seconed 0x30000000 :AT() {leds.o}
}
编译的Makefile:
objs:=start.o sdram.o nand.o leds.o nand.bin:$(objs)
arm-linux-ld -Tnand.lds -o nand_elf $^
arm-linux-objcopy -O binary -S nand_elf $@
arm-linux-objdump -D -m arm nand_elf > nand.dis
%.o:%.c
arm-linux-gcc -o $@ -c $<
%.o:%.S
arm-linux-gcc -o $@ -c $< clean:
rm *.o *.bin *.dis nand_elf
Nand Flash 裸机程序的更多相关文章
- S5PV210 NAND Flash
NAND Flash 关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Flash的 ...
- u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A) 转载自:http://www.cnblogs.com/idle_man/archive/2010/12/23/19153 ...
- NOR flash和NAND flash区别,RAM 和ROM区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- NOR flash和NAND flash区别,RAM 和ROM区别d
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别
SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别 RAM / ROM 存储器 ROM和RAM指的都是半导体存储器,R ...
- nor flash 和nand flash 的区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- Nand Flash与Nor
转:http://www.360doc.com/content/11/1215/15/1299815_172458274.shtml Flash经常在一些地方被提到,一直没认真去理解它们的区别,因此, ...
- 十八、Nand Flash驱动和Nor Flash驱动
在读者学习本章之前,最好了解Nand Flash读写过程和操作,可以参考:Nand Flash裸机操作. 一开始想在本章写eMMC框架和设备驱动,但是没有找到关于eMMC设备驱动具体写法,所以本章仍继 ...
- S3C2440从NAND Flash启动和NOR FLASH启动的问题
1.为什么NAND FLASH不能直接运行程序 NAND FLASH本身是连接到了控制器上而不是系统总线上.CPU运行机制为:CPU启动后是要取指令执行的,如果是SROM.NOR FLASH ...
随机推荐
- mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法
发现问题 切换到mac平台后,突然想写点程序运行在mac下,想到mac自带java,会方便好多.不过在这过程中遇到了麻烦: 总是提示 “错误: 找不到或无法加载主类” 工程结构 查了好久,终于找到原型 ...
- Eclipse+Maven创建webapp项目<二>
Eclipse+Maven创建webapp项目<二> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...
- 奇淫怪巧之在Delphi中调用不申明函数
前一阵子,研究了一段时间的Win32Asm,研究到后来发现Win32的ASM实际上还是和C版的介绍的一样.甚至还封装了一个简版的类似VCL库结构框架的32ASM结构库,不过搞着搞着就没兴趣了,也没继续 ...
- 【转】VMware Tools installation cannot be started manually while Easy Install is in progress.
我HOST 是WIN7也遇到了这样的问题 我这样做的:进入系统以后在你VM的下面会有几个图标:关于1,CD DVD 2,disk 3,floppy 4,网络连接... 选择floppy--settin ...
- A股ROE连续3年超过15%的股票排名
R连续3年,12个季度的滚动ROE,都超过15%的股票排名,个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多ROE连续3年超过15%的股 ...
- Nuxt.js项目实战
感悟 经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后很积极的给 ...
- 【Docker】容器操作(转)
来自:https://www.cnblogs.com/zydev/p/5803461.html 列出主机上的容器 列出正在运行的容器: docker ps 列出所有容器: docker ps - ...
- php info
http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/08/12/1797753.html php pdo 相关 http://blog.cs ...
- python的数据结构之栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...
- Docker 修改国内镜像地址
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://86d2a50b.m.daocloud.io 该脚本可以 ...