📄 5502_iiceepromboot.c
字号:
/******************************************************************************/
/* Copyright 2004 by SEED Electronic Technology LTD. */
/* All rights reserved. SEED Electronic Technology LTD. */
/* Restricted rights to use, duplicate or disclose this code are */
/* granted through contract. */
/* */
/* */
/******************************************************************************/
/*----------------------------------------------------------------------------*/
/* DESCRIPTION: */
/* */
/* This is an example of writting boot table into EEPROM of C5502 */
/*----------------------------------------------------------------------------*/
/* MODULE NAME... IIC and EEPROM */
/* FILENAME...... 5502_IICEEPROMBOOT.c */
/* DATE CREATED.. Mon 8/20/2004 */
/* COMPONENT..... */
/* PREREQUISITS.. */
/*----------------------------------------------------------------------------*/
#include <csl.h>
#include <csl_pll.h>
#include <csl_i2c.h>
#include <stdio.h>
#include "E2PROM_Function.h"
#undef E2PROM_ADDR // Define slave IIC device address
#define E2PROM_ADDR 0x50
/*----------------------------------------------------------------------------*/
// Config IIC: Use IIC to interface CODEC control interface
/*----------------------------------------------------------------------------*/
I2C_Setup Setup = {
0, // 7 bit address mode
0x0000, // own address
60, // clkout value (Mhz) 150
400, // a number between 10 and 400
0, // 8 bits/byte to be received or transmitted
0, // DLB mode off
0 // FREE mode on
};
/*----------------------------------------------------------------------------*/
// Config transimitted data bytes
/*----------------------------------------------------------------------------*/
Uint16 StartAdd; // 写引导表的EEPROM的起始地址
Uint16 Low_Word;
Uint16 High_Word;
Uint16 Section_count;
Uint16 * Section_add;
unsigned long int i;
/* Entry point address,register configuration count,section parameter */
#define Entry_Point 0x000017c4 // 32位进入点地址
#define REG_COFIG_COUNT 0x00000001 // 配置寄存器配置计数器
#define DELAY_CONFIG 0xFFFFFFF0 // 延时0xFFF0
#define BIGSECT_COUNT 0x000008E0 // 程序段的字节数
#define BIGSECT_ADDRESS 0x00001000 // 程序段的起始字节地址
/*-----------------------------------------------------------------------------*/
// FUNCTION: MAIN
/*-----------------------------------------------------------------------------*/
void main(void)
{
int Return;
// Initialize CSL library - This is REQUIRED !!!
CSL_init();
// The main frequency of system is 240MHz,if input 20MHz Multi=0xc, else Multi=0x8
PLL_setFreq(1, 0xc, 0, 1, 3, 3, 0);
// Initialize IIC, Using parameters in MyI2c_Config structure
MyI2C_setup(&Setup);
StartAdd = 0x0;
/*-------------------------- write boot table --------------------------------*/
/*************** 写32位进入点地址 ***************************/
High_Word = (Entry_Point & 0xFFFF0000)>>16;
Return = MyI2C_WriteSigWord( StartAdd, High_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Low_Word = Entry_Point & 0x0000FFFF;
Return = MyI2C_WriteSigWord( StartAdd, Low_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
/*************** 写32位寄存器配置计数器 **********************/
High_Word = (REG_COFIG_COUNT & 0xFFFF0000)>>16;
Return = MyI2C_WriteSigWord( StartAdd, High_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Low_Word = REG_COFIG_COUNT & 0x0000FFFF;
Return = MyI2C_WriteSigWord( StartAdd, Low_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
/*************** 写延时寄存器 **************************************/
High_Word = (DELAY_CONFIG & 0xFFFF0000)>>16;
Return = MyI2C_WriteSigWord( StartAdd, High_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Low_Word = DELAY_CONFIG & 0x0000FFFF;
Return = MyI2C_WriteSigWord( StartAdd, Low_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
/*************** 写程序段 ***********************************/
/* Configure section byte count */
High_Word = (BIGSECT_COUNT & 0xFFFF0000)>>16;
Return = MyI2C_WriteSigWord( StartAdd, High_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Low_Word = BIGSECT_COUNT & 0x0000FFFF;
Return = MyI2C_WriteSigWord( StartAdd, Low_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
/* Configure section start address */
High_Word = (BIGSECT_ADDRESS & 0xFFFF0000)>>16;
Return = MyI2C_WriteSigWord( StartAdd, High_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Low_Word = BIGSECT_ADDRESS & 0x0000FFFF;
Return = MyI2C_WriteSigWord( StartAdd, Low_Word, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
/* Copy data to this section */
Section_count = BIGSECT_COUNT>>1;
Section_add = (Uint16 *)(BIGSECT_ADDRESS>>1);
for(i=0; i<Section_count; i++)
{
Return = MyI2C_WriteSigWord( StartAdd, *Section_add++, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
}
/* Write 32-bit zero byte count to end the boot table */
Return = MyI2C_WriteSigWord( StartAdd, 0x0000, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
StartAdd += 2;
Return = MyI2C_WriteSigWord( StartAdd, 0x0000, 1, E2PROM_ADDR, 1, 30000);
while(Return!=0);
/****************************************************************************/
/* Note: */
/* The process of write boot table will take about seven minutes */
/* approximately. */
/****************************************************************************/
}
/******************************************************************************/
// No more
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -