📄 main.c
字号:
/********************************************************************************************
*filename: main.c
*author: ASIC system team,wuer
*create date: 2005-5-23 14:17
*description: This file is used for nand burning only
*modify history:
*misc:
********************************************************************************************/
#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h"
#include <stdio.h>
#include <string.h>
/* 宏READOUT_CHECK如果定义,表示在每次写入一页后都进行读出校验,反之则不进行 */
#define READOUT_CHECK
/************************************************/
#define ERASENUM 0x57 /* 擦除的总块数,需要根据具体烧录内容大小计算得到 */
#define PAGESINBLOCK 0x20 /* 一块中有32页 */
#define BYTESINPAGE 0x200 /* 一页中有512字节 */
#define ERASESIZE PAGESINBLOCK*BYTESINPAGE/* 每次擦除的大小,根据flash资料得到,不可随意变动 */
#define SIZE1 0x1 /* 第1次烧录的文件大小,如果是bootloader则就为1(页) */
#define SIZE2 0x1b00 /* 第2次烧录的文件(kernel code)大小,单位为页 */
U32 DataHead = 0x30000000; /* 临时存放烧录内容的内存地址,用户可改变 */
U32 NandHead = 0x0; /* 需要烧录的Nor Flash中的目标地址,如果是bootloader,肯定是0 */
U32 kernelHead = 0x2000; /* 需要烧录kernel的Nor Flash中的目标地址,取决于用户需要和bootloader的内容 */
/*****************************************************/
void system_init(void);
void pmc_init(void);
void init_nand(void);
void int_serv_emi(void);
int nand_rd_page(U32 page, U32*buffer, U32 do_read);
int nand_erase_block(U32 page);
/*****************************************************/
int main()
{
U32 i = 0;
U32 status = 0;
U32 data = DataHead;
U32 address = NandHead;
system_init();
/* GPIO PH5设置为 "1", Nand Flash写使能 */
/***** erase operation first ******/
for(i = 0; i < ERASENUM; i++)
{
status = nand_erase_block( address >> 9 ); /* 擦除操作 */
if(status != YES)
{
printf("Erase fail!!\n");
return NO;
}
address += ERASESIZE; /* 每次擦除32页(1block = 32pages)*/
}
printf("Erase complished! \n");
status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1); /* 读出实验 */
/***** test or burn bootleader ****/
data = DataHead;
address = NandHead;
for(i = 0; i < SIZE1; i++ ) /* 如果是烧录bootloader。需要设置断点,load二进制文件*/
{
status = nand_rd_page((address >> 9), (U32 *)data, 0);
if(status != YES) /* 写入(SIZE1)页数据 */
{
printf("write bootloader fail!!\n");
return NO;
}
data += 512;
address += 512; /* 每次写入数据量为1页(512bytes)*/
}
printf("Write block1 complished!.\n");
status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1); /* 读出实验 */
/***** burn kernel only ***********/ /* 需要再次设置断点,load OS kernel代码,然后继续执行*/
data = DataHead;
address = kernelHead;
for(i = 0; i < SIZE2; i++ )
{
status = nand_rd_page((address >> 9), (U32 *)data, 0);
if(status != YES)
{
printf("write kernel fail!!\n");
return 0;
}
data += 512; /* 写完一页后,地址累加 */
address += 512;
}
printf("Write kernel complished!.\n");
status = nand_rd_page((0 >> 9), (U32 *)0x30010000, 1); /* 读出实验 */
/******** end now *****************/
while(1);
return YES;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -