📄 boot.c
字号:
/**
* @file boot.c
* @brief nand boot implementation
* Copyright (C) 2006 Anyka (GuangZhou) Software Technology Co., Ltd.
* @author Junhua Zhao
* @date 2006-01-04
* @version 1.0
* @ref AK3221 technical spec.
*/
#include "anyka_types.h"
#include "console.h"
#include "nandflash.h"
#include "boot.h"
T_NAND_CONFIG m_NandConfig;
T_U32 checksum(T_U8 *pData, T_S32 length);
void run(void *funcaddr)
{
bfunc F;
F = (bfunc)(funcaddr);
F();
}
//nand boot for version 1.0
void boot_v10()
{
T_U32 nandflash_start_address = m_NandConfig.FileStart;
T_U32 nandflash_end_address = m_NandConfig.FileEnd;
T_U32 sum;
//load bios
//printf("load bios\n");
if ( !nf_force_read( &nandflash_start_address,
nandflash_end_address,
(T_U8 *)m_NandConfig.FileLdStart,
m_NandConfig.FileLen,
m_NandConfig.MapStart) )
{
printf("\nLoad bios unsuccessfully!");
return;
}
/*
sum = checksum((T_U8 *)m_NandConfig.FileLdStart, m_NandConfig.FileLen);
if(sum != m_NandConfig.CheckBIOSSum)
{
printf("Check BIOS sum failed!\n");
return;
}
*/
//printf("Load bios from nandflash successfuly!\n");
run((T_VOID *)m_NandConfig.FileLdStart);
}
T_U32 checksum(T_U8 *pData, T_S32 length)
{
int i;
T_U32 xor;
if(pData == NULL)
return 0;
xor = 0x00;
for(i = 0; i < length; i++)
xor ^= (*(pData+i));
return xor;
}
void readcfg()
{
T_U8 *config;
T_U32 nandflash_start_address = CONFIG_ADDR;
T_U32 nandflash_end_address = CONFIG_ADDR + 0x0200;
T_U32 sum = 0;
config = (T_U8 *)0x30500000;
/*if(nf_read_page(0, CONFIG_ADDR / (chipInfo.phy_page_size),
CONFIG_ADDR % (chipInfo.phy_page_size),
(T_U8 *)config, Nand_SysInfo.log_page_size, AK_FALSE) == AK_FALSE)*/
if( !nf_force_read( &nandflash_start_address,
nandflash_end_address,
(T_U8 *)config,
Nand_SysInfo.log_page_size,
0) )
{
puts("\nNand flash is bad,can't boot up!");
return;
}
memcpy((UINT8 *)&m_NandConfig, (UINT8 *)config, sizeof(T_NAND_CONFIG));
printf("Version:%d.%d\n",m_NandConfig.MainVer,m_NandConfig.SubVer);
printf("Lenght:%d\n",m_NandConfig.Length);
printf("FileStart:%x\n",m_NandConfig.FileStart);
printf("LoadStart:%x\n",m_NandConfig.FileLdStart);
printf("FileLength:%d\n",m_NandConfig.FileLen);
printf("FileEnd:%x\n",m_NandConfig.FileEnd);
printf("MapStart:%x\n",m_NandConfig.MapStart);
printf("CheckBIOSSum:%x\n", m_NandConfig.CheckBIOSSum);
printf("CheckSum:%x\n",m_NandConfig.CheckStructSum);
sum = (UINT8)checksum((UINT8 *)&m_NandConfig, sizeof(T_NAND_CONFIG) - 1);
if(sum != m_NandConfig.CheckStructSum)
{
printf("Check struct sum failed!\n");
//return;
}
/*
m_NandConfig.MainVer = 1;
m_NandConfig.SubVer = 0;
m_NandConfig.MapStart = CONFIG_ADDR+NFLASH_LOG_PGSIZE;
m_NandConfig.FileStart = 0x20000;
m_NandConfig.FileLen = 0x64000;
m_NandConfig.FileLdStart = (UINT32 *)0x30500000;
m_NandConfig.FileEnd = 0x100000;
*/
}
void boot_main(void)
{
console_init();
puts("\nNand boot start\n");
nf_init();
readcfg();
if ((m_NandConfig.MainVer == 1) && (m_NandConfig.SubVer == 0))//v1.0
{
boot_v10();
}
else
{
puts("\nInvalid version,can't boot up!");
return;
}
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -