⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.c

📁 启动代码
💻 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 + -