📄 download.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "c6211dsk.h"
#include "public.h"
#include "Drv__led.h"
#define FLASH_ADDRS 0x90000000
#define SDRAM_ADDRS 0x0a0000000
#define SIZE 0x100
void config_emif(void)
{
*(unsigned volatile int *)EMIF_GCR = 0x00000018;
*(unsigned volatile int *)EMIF_CE1 = 0xFFFFFF13;
*(unsigned volatile int *)EMIF_CE0 = 0xFFFFFF13;
*(unsigned volatile int *)EMIF_CE2 = 0xFFFFFF33;
*(unsigned volatile int *)EMIF_CE3 = 0xFFFFFF13;
*(unsigned volatile int *)EMIF_SDCTRL = 0x07117000;
*(unsigned volatile int *)EMIF_SDRP = 0x0000061A;
*(unsigned volatile int *)EMIF_SDEXT = 0x00054519;
}
void HardwareInit( )
{
config_emif();
}
/*-------------------------------------------------*/
/* Operate on flash AND timer */
/*-------------------------------------------------*/
int timer0_read()
{
int i;
i = *(unsigned volatile int *)TIMER0_COUNT;
return i;
}
void timer0_start()
{
*(unsigned volatile int *)TIMER0_CTRL &= 0xff3f;
*(unsigned volatile int *)TIMER0_CTRL |= 0x200;
*(unsigned volatile int *)TIMER0_PRD |= 0xffffffff;
*(unsigned volatile int *)TIMER0_CTRL |= 0xC0;
}
void delay_msec(short msec)
{
int timer_limit = msec*37500; /*** timer_limit=msec/(4*Tcpu)=msec*150000/4 ***/
int time_start;
timer0_start();
time_start = timer0_read();
while ((timer0_read()-time_start) < timer_limit);
}
/*---------------------polling data---------------------*/
BOOL poll_data(US * prog_ptr, UC prog_data)
{
UC data;
BOOL fail = FALSE;
do {
data = (UC) * prog_ptr;
if (data != prog_data) /* is D7 != Data? */
{
if ((data & 0x20) == 0x20) /*is D5 = 1 ? */
{
data = (UC) * prog_ptr;
if (data != prog_data) /* is D7 = Data? */
fail = TRUE;
else
return TRUE; /* PASS*/
}
}
else
return TRUE; /*PASS */
} while (!fail);
return FALSE; /* FAIL*/
}
BOOL poll_wdata( US * prog_ptr, US prog_data )
{
US data;
data = *prog_ptr;
if( data == prog_data )
return TRUE;
return FALSE;
}
/*-----------------------erase flash------------------*/
BOOL erase_flash( US * flash_ptr )
{
BOOL pass = TRUE;
US * ctrl_addr1 = (US *) (flash_ptr + (0x555));
US * ctrl_addr2 = (US *) (flash_ptr + (0x2aa));
* ctrl_addr1 = 0xaa;
* ctrl_addr2 = 0x55;
* ctrl_addr1 = 0x80;
* ctrl_addr1 = 0xaa;
* ctrl_addr2 = 0x55;
* ctrl_addr1 = 0x10;
delay_msec(100);
*(int *)EMIF_GCR = 0x00000018;
pass = poll_data( (US *)flash_ptr, (UC)0xff);
return pass;
}
/*-----------------------program flash-----------------*/
BOOL program_flash(US * src_ptr, US * flash_ptr, US length)
{
US i;
BOOL pass = TRUE;
US data;
US * ctrl_addr1 = (US *) (flash_ptr + (0x555));
US * ctrl_addr2 = (US *) (flash_ptr + (0x2aa));
for (i=0; (i<length) & pass; i++)
{
* ctrl_addr1 = 0xaa;
* ctrl_addr2 = 0x55;
* ctrl_addr1 = 0xa0;
* flash_ptr++ = * src_ptr;
data = *(US *) src_ptr++;
delay_msec(5); /* delay 10ms */
pass = poll_wdata( flash_ptr-1, data );
}
return pass;
}
/*--------------------------------------------------------*/
/*----------------- control led --------------------------*/
/*--------------------------------------------------------*/
VOID OpenLed0(VOID)
{
STRUCT DSPIOStruct *io_struct;
io_struct = (STRUCT DSPIOStruct*)IO_ADDR;
io_struct->Led0 = LED_ON;
}
VOID CloseLed0(VOID)
{
STRUCT DSPIOStruct *io_struct;
io_struct = (STRUCT DSPIOStruct*)IO_ADDR;
io_struct->Led0 = LED_OFF;
}
VOID OpenLed1(VOID)
{
STRUCT DSPIOStruct *io_struct;
io_struct = (STRUCT DSPIOStruct*)IO_ADDR;
io_struct->Led1 = LED_ON;
}
VOID CloseLed1(VOID)
{
STRUCT DSPIOStruct *io_struct;
io_struct = (STRUCT DSPIOStruct*)IO_ADDR;
io_struct->Led1 = LED_OFF;
}
VOID open_close_led0(VOID)
{
OpenLed0();
delay_msec(MSEC);
CloseLed0();
delay_msec(MSEC);
}
VOID open_close_led1(VOID)
{
OpenLed1();
delay_msec(MSEC);
CloseLed1();
delay_msec(MSEC);
}
int get_filelen(FILE *fp)
{
INT length;
fseek(fp,0,SEEK_END);
fgetpos(fp,&length);
fseek(fp,0,SEEK_SET);
return length;
}
/*---------------------------------------------*/
void main( void )
{
FILE *fp1;
int file_len, times=0;
BOOL Res;
US i, readnum, totalnum;
US *dst_addr;
US *sdram_addr;
HardwareInit( );
dst_addr = (US *)FLASH_ADDRS;
sdram_addr = (US *)SDRAM_ADDRS;
readnum = 0;
Res = erase_flash( dst_addr );
/*fp1=fopen("d:\\liang_computer\\bootload\\led.bin","rb");*/
/*fp1=fopen("d:\\debug_dsp\\dsp\\sdram\\down.bin","rb");*/
/*fp1=fopen("c:\\lf_work\\dsp\\yyr_work\\led\\led.bin","rb");*/
file_len=get_filelen(fp1);
totalnum = file_len/sizeof(US);
for(i=0;i<totalnum;i++)
{
fread(sdram_addr,sizeof(US),1,fp1);
readnum++;
sdram_addr++;
if( readnum == 0x100 )
{
open_close_led0();
readnum = 0;
times++;
}
}
if( Res == TRUE )
Res = program_flash( (US *)SDRAM_ADDRS, dst_addr, totalnum);
if( Res == TRUE )
{
while( 1 )
{
open_close_led0();
delay_msec(10);
}
}
else
{
while( 1 )
{
open_close_led1();
delay_msec(10);
}
}
fclose(fp1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -