开发板是s3c2440,nand flash型号是K9F2G08U0C,其中的头文件里面包含所有寄存器的地址
已经用点灯方式测试过每个函数都有运行过,反汇编文件里也显示0x30000000有main函数,
可是硬件上就是没有效果,能帮我的话,可以私信我一下 我把源码发给你
head.o函数:
.text
.global _start
_start:
ldrsp, = 4096
bldisable_watch_dog
blmemsetup
blnand_init
ldr r0,=0x30000000
movr1,#4096
movr2,#1024
blnand_read
ldrsp, =0x34000000
ldrlr, =halt_loop
ldrpc,=main
halt_loop:
bhalt_loop
nand.c函数:
#include "s3c2440.h"
#define BUSY 1
void nand_init();
void nand_read(unsigned char *buf, unsigned long start_addr, int size);
sta
tic void s3c2440_nand_reset(void);
static void s3c2440_wait_idle(void);
static void s3c2440_nand_select_chip(void);
static void s3c2440_nand_deselect_chip(void);
static void s3c2440_write_cmd(int cmd);
static void s3c2440_write_addr(unsigned int addr);
static unsigned char s3c2440_read_data(void);
static void s3c2440_nand_reset()
{
s3c2440_nand_select_chip();
s3c2440_write_cmd(0xff);
s3c2440_wait_idle();
s3c2440_nand_deselect_chip();
}
static void s3c2440_wait_idle()
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&NFSTAT;
while (!(*p & BUSY))
for (i = 0; i < 10; i++);
}
static void s3c2440_nand_select_chip(void)
{
int i;
NFCONT &= ~(1 << 1);
for (i = 0; i < 10; i++);
}
static void s3c2440_nand_deselect_chip(void)
{
NFCONT |= (1 << 1);
}
static unsigned char s3c2440_read_data(void)
{
volatile unsigned char *p = (volatile unsigned char *)&NFDATA;
return *p;
}
static void s3c2440_write_cmd(int cmd)
{
volatile unsigned char *p = (volatile unsigned char *)&NFCMD;
*p = cmd;
}
#define NAND_SECTOR_SIZE_LP 4096
#define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)
static void s3c2440_write_addr(unsigned int addr)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&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=0; i<10; i++);
*p = (col >> 8) & 0x0f; /* Column Address A8~A11 */
for(i=0; i<10; i++);
*p = page & 0xff;/* Row Address A12~A19 */
for(i=0; i<10; i++);
*p = (page >> 8) & 0xff;/* Row Address A20~A27 */
for(i=0; i<10; i++);
*p = (page >> 16) & 0x01;/* Row Address A28~A29 */
for(i=0; i<10; i++);
}
void nand_init(void)
{
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
/* 设置时序 */
NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
NFCONT = (1 << 4) | (1 << 1) | (1 << 0);
s3c2440_nand_reset();
}
#define NAND_SECTOR_SIZE 2048
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return; /* 地址或长度不对齐 */
}
/* 选中芯片 */
s3c2440_nand_select_chip();
for (i = start_addr; i < (start_addr + size);) {
/* 发出READ0命令 */
s3c2440_write_cmd(0);
/* Write Address */
s3c2440_write_addr(i);
s3c2440_write_cmd(0x30);
s3c2440_wait_idle();
for (j = 0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = s3c2440_read_data();
buf++;
}
}
/* 取消片选信号 */
s3c2440_nand_deselect_chip();
return;
}