ARM·Nand Flash的控制
个人觉得这章内容过于复杂,只需要记住如果nand中4096的程序想要被拷贝出来执行,就把这个代码写进去,红色部分是真正的代码,可以复制过去,直接使用,其他就不做了解了。听了一个小时,这个老师讲的也挺乱的,也没有人能记住这么多东西吧。。。
【head.S init.c
main.c
nand.c
Makefile】
代码详解,这里先把一部分代码存放在NAND Flash 地址4096之后,当程序启动后通过NAND Flash控制器将他们读出来、执行。
注意:以前的代码都小于4096,开发板启动后他们被自动复制进“Steppingstone”;
【nand.lds】
SECTIONS {
}
对于这里,我是这样理解的 。head.o init.o nand.o都放在Nand flash0地址处,0x0000 0000是他的链接地址,也就是放在0x0000 0000处运行;mian.o存放在Nand flash 4096地址处,0x3000 0000是他的链接地址,也就是放在0x3000 0000处运行
(可能也就是前一阵子看到的链接地址和加载地址的区别)
当开发板启动时,前4k的代码被考进SRAM,所以我们需要在SRAM内完成初始化和跳转
【head.s】
SECTIONS {
} @******************************************************************************
@ File:head.s
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************
.text
.global _start
_start:
halt_loop:
*对于这一串代码,很多都是前面学过的知识,这里我们只关注配置Nand的红色代码
bl
nand_init
*目标地址,源地址,目标长度
这里我们可以跳转到nand_read中可以看一下
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
#ifdef LARGER_NAND_PAGE
#else
#endif
#ifdef LARGER_NAND_PAGE
#endif
#ifdef LARGER_NAND_PAGE
#else
#endif
【nand.c】
#define LARGER_NAND_PAGE
#define GSTATUS1
(*(volatile unsigned int *)0x560000B0)
#define BUSY
1
#define NAND_SECTOR_SIZE
512
#define NAND_BLOCK_MASK
(NAND_SECTOR_SIZE - 1)
#define NAND_SECTOR_SIZE_LP
2048
#define NAND_BLOCK_MASK_LP
(NAND_SECTOR_SIZE_LP - 1)
typedef unsigned int S3C24X0_REG32;
typedef struct {
} S3C2410_NAND;
typedef struct {
} S3C2440_NAND;
typedef struct {
}t_nand_chip;
static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;
static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
static t_nand_chip nand_chip;
void nand_init(void);
void nand_read(unsigned char *buf, unsigned long start_addr, int size);
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 s3c2410_nand_reset(void);
static void s3c2410_wait_idle(void);
static void s3c2410_nand_select_chip(void);
static void s3c2410_nand_deselect_chip(void);
static void s3c2410_write_cmd(int cmd);
static void s3c2410_write_addr(unsigned int addr);
static unsigned char s3c2410_read_data();
static 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 s3c2410_nand_reset(void)
{
}
static void s3c2410_wait_idle(void)
{
}
static void s3c2410_nand_select_chip(void)
{
}
static void s3c2410_nand_deselect_chip(void)
{
}
static void s3c2410_write_cmd(int cmd)
{
}
static void s3c2410_write_addr(unsigned int addr)
{
}
static unsigned char s3c2410_read_data(void)
{
}
static 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)
{
}
评论