📄 download.c
字号:
#include <stdio.h>
#include <c6x.h>
#include "download.h"
#define MTVFPGA_PGM 0xa030000c
#define DTVFPGA_PGM 0xa0300010
#define FPAG_DATA 0xa0300014
#define SYS_STATE 0xa0300020
#define I2C_REG 0xa0300004
#define LED_REG 0xa0300008
#define SYSRREG 0xA020000c
#define UART_BASE_ADDR 0xa0300000
#define OFFSET 4
#define RBR 0xa0300000
#define THR 0xa0300000
#define IIER 0xa0300004
#define IIR 0xa0300008
#define FCR 0xa0300008
#define LCR 0xa030000c
#define MCR 0xa0300010
#define LSR 0xa0300014
#define MSR 0xa0300018
#define SCR 0xa030001c
#define DLL 0xa0300000
#define DLM 0xa0300004
unsigned int uFPGAAddress=0x80020000;
unsigned char * file_buffer;
#pragma DATA_SECTION(fpga_buffer,".bss1")
unsigned char * fpga_buffer;
/*******************************************************************************
* Function prototypes
*******************************************************************************/
void DelayMSEC(short msec);
int Timer0Read();
void Timer0Start();
void Timer0Init();
unsigned int GetIOPort(void);
void SetInitBuffer();
//unsigned int count;
int MSPeriod = 1;
#define COLORBAR 0xc7;
#define WORKCOLOR 0x47;
/*******************************************************************************
* IIC Function prototypes
*******************************************************************************/
void StartIIC(void);
void StopIIC(void);
void AckIIC(void);
void WriteIIC(unsigned char data);
void Init7111(void);
void Init7190(void);
unsigned char Val713_1[25] =
{
0xf8,0xc0,0x33,0x00,0x00,0xe9,0x0d,
0xb8,0x01,0x80,0x47,0x40,0x00,0x01,0x2a,
0x00,0x0c,0x38,0x00,0x00
/*
0xf8,0xc0,0x33,0x00,0x00,0xd8,0xff,
0xb8,0x01,0x80,0x47,0x40,0x00,0x01,0x2a,
0x00,0x0c,0xc8,0x00,0x00
*/
};
unsigned char Val713_2[4] = {0x00,0x00,0x00,0x00};
unsigned char Val713_3[0x21] = {
0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x54,0x07,0x83,0xff,0xff,0x00,0x00
// 0x03,0x54,0x07,0x83,0xff,0xff,0x00,0x00
};
unsigned char Val76[0x36] = {
0x11,0x20,0x62,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x08,0x00,0xcb,0x8a,0x09,0x2a,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x44,0x20,0x00,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0x70};
unsigned int ChipID;
unsigned int Temp;
void Download_FPGA(int cmd);
void InitSys()
{
int i;
DelayMSEC(1);
for(i=0;i<0xff;i++)
{
StartIIC();
StopIIC();
DelayMSEC(5);
}
Init7190();
Init7111();
}
void InitIDKM()
{
register int i;
CSR=0x100;
IER=1;
ICR=0xffff;
*(unsigned volatile int *)EMIF_GCR = 0x3300;
*(unsigned volatile int *)EMIF_CE1 = CE1_32;
*(unsigned volatile int *)EMIF_SDCTRL = 0x07126000;
*(unsigned volatile int *)EMIF_CE0 = 0x30;
*(unsigned volatile int *)EMIF_SDRP = 0x61a;
*(unsigned volatile int *)EMIF_SDEXT= 0x54529;
*(unsigned volatile int *)EMIF_CE2 = CE2_32_max;
*(unsigned volatile int *)EMIF_CE3 = CE3_32;
InitSys();
file_buffer = (unsigned char *)0xa0000000;
fpga_buffer = (unsigned char *)uFPGAAddress;
*(unsigned volatile int *)EMIF_CE2 = CE2_32_max & 0xffffff0f;
for ( i=0;i<0x40000;i++,fpga_buffer++,file_buffer++ )
{
(*fpga_buffer)= (*file_buffer);
}
*(unsigned volatile int *)EMIF_CE2 = CE2_32_max;
fpga_buffer = (unsigned char *)uFPGAAddress;
Download_FPGA(0);
}
#pragma CODE_SECTION(Download_FPGA,".text1")
void far Download_FPGA(int cmd)
{
register int i,ii;
unsigned char fpga_data;
do{
*(unsigned volatile int *)MTVFPGA_PGM = 0xfe;
i = *(unsigned volatile int *)LED_REG;
}while((i&0x20) != 0);
do{
*(unsigned volatile int *)MTVFPGA_PGM = 0xff;
i = *(unsigned volatile int *)LED_REG;
}while((i&0x20) == 0);
ii = 0;
do{
fpga_data = *fpga_buffer++;
for(i=0;i<8;i++)
{
if ((fpga_data & 0x80)==0)
{
*(unsigned volatile int *)FPAG_DATA = 0;
}
else
{
*(unsigned volatile int *)FPAG_DATA = 0xff;
}
fpga_data <<= 1;
}
ii++;
}while(ii<0x1A5CB);
fpga_buffer = (unsigned char *)(uFPGAAddress+0x1ffb8);
do
{
*(unsigned volatile int *)DTVFPGA_PGM = 0xfe;
i = *(unsigned volatile int *)LED_REG;
}while((i&0x80) != 0);
do
{
*(unsigned volatile int *)DTVFPGA_PGM = 0xff;
i = *(unsigned volatile int *)LED_REG;
}while((i&0x80) == 0);
ii = 0;
do{
ii++;
fpga_data = *fpga_buffer++;
for(i=0;i<8;i++)
{
if ((fpga_data & 0x80)==0)
{
*(unsigned volatile int *)FPAG_DATA = 0;
}
else
{
*(unsigned volatile int *)FPAG_DATA = 0xff;
}
fpga_data <<= 1;
}
}while(ii<0x1A5CB);
}
#pragma CODE_SECTION(DelayMSEC,".text2")
void DelayMSEC(short msec)
{
/* Assume 150 MHz CPU, timer peirod = 4/150 MHz */
/* int timer_limit = (msec*9375)<<2; */
int timer_limit = (msec*9375);
int time_start;
Timer0Start();
time_start = Timer0Read();
while ((Timer0Read()-time_start) < timer_limit);
}
/*******************************************************************************
* FUNCTION : Timer0Read
*
* ARGUMENTS :
* VOID
*
* DESCRIPTION :
* Read and return the count in timer 0.
*
* OUTPUTS :
* INT <-- Returns the count in timer 0
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Read,".text2")
int Timer0Read()
{
int i;
i = *(unsigned volatile int *)TIMER1_COUNT;
return i;
}
/*******************************************************************************
* FUNCTION : Timer0Start
*
* ARGUMENTS :
* VOID
*
* DESCRIPTION :
* Start timer 0 after initializing it for 32-bit count and no interrupt.
*
* OUTPUTS :
* VOID
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Start,".text2")
void Timer0Start()
{
/* Hold the timer */
*(unsigned volatile int *)TIMER1_CTRL &= 0xff3f;
/* Use CPU CLK/4 */
*(unsigned volatile int *)TIMER1_CTRL |= 0x200;
/* Set for 32 bit counter */
*(unsigned volatile int *)TIMER1_PRD |= 0xffffffff;
/* Start the timer */
*(unsigned volatile int *)TIMER1_CTRL |= 0xC0;
}
/*******************************************************************************
* FUNCTION : Timer0Init
*
* ARGUMENTS :
* VOID
*
* DESCRIPTION :
* Start timer 0 after initializing it for a short period (~13.7 micro seconds)
* with interrupt.
*
* OUTPUTS :
* VOID
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Init,".text2")
void Timer0Init()
{
/* Hold the timer */
*(unsigned volatile int *)TIMER1_CTRL &= 0xff3f;
/* Use CPU CLK/4 */
*(unsigned volatile int *)TIMER1_CTRL |= 0x200;
/* Set for a short period */
*(unsigned volatile int *)TIMER1_PRD = 0x200;
/* Start the timer, enable timer0 int */
*(unsigned volatile int *)TIMER1_CTRL |= 0x3C0;
}
void StartIIC(void)
{
*(unsigned volatile int *)I2C_REG = 0x025; /* "00100101":sda,scl = '1' */
DelayMSEC(1);
*(unsigned volatile int *)I2C_REG = 0x024; /* "00100100":sda= '0',scl = '1' */
DelayMSEC(1);
}
void StopIIC(void)
{
*(unsigned volatile int *)I2C_REG = 0x024; /* "00100101":sda = '0',scl = '1' */
DelayMSEC(1);
*(unsigned volatile int *)I2C_REG = 0x025; /* "00100101":sda,scl = '1' */
DelayMSEC(1);
}
void AckIIC(void)
{
*(unsigned volatile int *)I2C_REG = 0x020; /* "00100101":sda='z',scl = '0' */
*(unsigned volatile int *)I2C_REG = 0x022; /* "00100101":sda='z',scl = '0' */
DelayMSEC(1);
*(unsigned volatile int *)I2C_REG = 0x026; /* "00100101":sda='z',scl = '1' */
DelayMSEC(1);
*(unsigned volatile int *)I2C_REG = 0x022; /* "00100101":sda='z',scl = '0' */
DelayMSEC(1);
*(unsigned volatile int *)I2C_REG = 0x021; /* "00100101":sda='1',scl = '0' */
DelayMSEC(1);
}
void WriteIIC(unsigned char data)
{
unsigned char BitCounter = 8;
unsigned char Temp;
unsigned int reg_val;
reg_val = 0x020;
*(unsigned volatile int *)I2C_REG = 0x20; /*SCL 置低 sda 置低*/
DelayMSEC(1); /*延时*/
do{
Temp = data;
reg_val &= 0x0fffffffb;
*(unsigned volatile int *)I2C_REG = reg_val; /*SCL 置低*/
DelayMSEC(1); /*延时*/
if((Temp&0x80)==0x80)
reg_val |= 0x01; /*如果最高位是1*/
else
reg_val &= 0x0fffffe;
*(unsigned volatile int *)I2C_REG = reg_val; /*设置SDA*/
DelayMSEC(1); /*延时*/
reg_val |= 0x004;
*(unsigned volatile int *)I2C_REG = reg_val; /*SCL 置高*/
DelayMSEC(1); /*延时*/
Temp = data<<1;
data = Temp;
BitCounter --;
}while(BitCounter);
reg_val &= 0x0fffffffb;
*(unsigned volatile int *)I2C_REG = reg_val; /*SCL 置低*/
DelayMSEC(3); /*延时*/
}
void Init7111(void)
{
int i;
StartIIC();
WriteIIC(0x4a);
AckIIC();
WriteIIC(0x01);
AckIIC();
for(i=0;i<0x14;i++){
WriteIIC(Val713_1[i]);
AckIIC();
}
StopIIC();
DelayMSEC(1);
StartIIC();
WriteIIC(0x4a);
AckIIC();
WriteIIC(0x15);
AckIIC();
for(i=0;i<4;i++){
WriteIIC(Val713_2[i]);
AckIIC();
}
StopIIC();
DelayMSEC(1);
StartIIC();
WriteIIC(0x4a);
AckIIC();
WriteIIC(0x40);
AckIIC();
for(i=0;i<0x20;i++){
WriteIIC(Val713_3[i]);
AckIIC();
}
StopIIC();
DelayMSEC(1);
}
#pragma CODE_SECTION(Init7190,".text3")
void Init7190(void)
{
int i;
StartIIC();
WriteIIC(0xd6);
AckIIC();
WriteIIC(0x00);
AckIIC();
for(i=0x0;i<0x36;i++){
WriteIIC(Val76[i]);
AckIIC();
}
StopIIC();
DelayMSEC(5);
}
void SetInitBuffer(unsigned int uAddress)
{
uFPGAAddress=uAddress;
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -