📄 teakdsp.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#define __COFF_PDATA_BASE (_NONCACHE_STARTADDRESS+0)
#define __COFF_XDATA_BASE (_NONCACHE_STARTADDRESS+0x00004000)
unsigned int DownLoadAddress;
unsigned int DownLoadProgramSize;
static int DownloadData(void)
{
int i,tmp;
unsigned short checkSum=0,dnCS;
unsigned int fileSize=10;
unsigned char *downPt;
downPt=(unsigned char *)DownLoadAddress;
printf("\nDownLoadAddress = %x\n",DownLoadAddress);
printf("Download the plain binary file(.BHC) to be written\n");
printf("The file format : <n+6>(4)+(n)+CS(2)\n");
printf("To transmit .BIN file : wkocm2 xxx.BIN /1 /d:1\n");
printf("Download methods : COM:8Bit,NP,1STOP\n");
printf("\nSTATUS : ");
rINTMSK=BIT_ALLMSK;
tmp=RdURXH0(); //To remove overrun error state.
for(i=0;i<4;i++) {
while(!(rUTRSTAT0&0x1));
*(downPt+i)=RdURXH0();
}
fileSize=*((unsigned char *)(DownLoadAddress+0))+
(*((unsigned char *)(DownLoadAddress+1))<<8)+
(*((unsigned char *)(DownLoadAddress+2))<<16)+
(*((unsigned char *)(DownLoadAddress+3))<<24);
for(i=0;i<fileSize-4;i++) {
while(!(rUTRSTAT0&0x1));
*(downPt+i)=RdURXH0();
if((i%1000)==0) WrUTXH0('#');
}
DownLoadProgramSize=fileSize-6;
for(i=0;i<(fileSize-6);i++) {
checkSum+=*((unsigned char *)(i+DownLoadAddress));
}
dnCS=*((unsigned char *)(DownLoadAddress+fileSize-6))+
(*( (unsigned char *)(DownLoadAddress+fileSize-5) )<<8);
if(checkSum!=dnCS)
{
printf("Checksum Error!!! MEM : %x DN : %x\n",checkSum,dnCS);
return 0;
}
*(downPt+i)=0x0;
printf("\nDownload O.K.\n");
return 1;
}
/**************************************************************************
* Function: LOAD_COFF_PDATA
* Created: skpark 2004-5-24
* Description: LOAD COFF PDATA
* Arguments:
* Return: 俊矾蔼
* Side effect:
**************************************************************************/
void LOAD_COFF_PDATA()
{
DownLoadAddress = __COFF_PDATA_BASE;
DownloadData();
}
/**************************************************************************
* Function: LOAD_COFF_XDATA
* Created: skpark 2004-5-24
* Description: LOAD COFF XDATA
* Arguments:
* Return: 俊矾蔼
* Side effect:
**************************************************************************/
void LOAD_COFF_XDATA()
{
DownLoadAddress = __COFF_XDATA_BASE;
DownloadData();
}
/**************************************************************************
* Function: LOAD_ARM2DSP_PDATA
* Created: skpark 2004-5-24
* Description: LOAD PDATA FROM ARM TO DSP
* Arguments:
* Return: 俊矾蔼
* Side effect:
**************************************************************************/
void LOAD_ARM2DSP_PDATA()
{
unsigned char *buff, temp_buff, data_buff[32];
unsigned char count_flag = 0x0, data_flag = 0x0, eob_flag = 0x0;
unsigned short LittleEndian_buff[8];
unsigned int temp_addr=0x0, address_offset=0x0, data_size=0,little_data_size=0;
unsigned int i=0, k=0, count=0,LittleEndian__count=0;
LittleEndian_buff[0] = 0x0000; // CHECK
while (eob_flag != 0x1) {
buff = (unsigned char *)(__COFF_PDATA_BASE + i++) ;
// printf(">>buff[%d]=%x\n",i,*buff);
if (*buff == 0x40 && count_flag == 0x0) {
count_flag = 0x1;
count = 0;
temp_addr = 0x0;
}else if (*buff == 0x0) {
eob_flag = 0x1;
printf("\n>> end of block \n");
printf(">> Completed sending P-DATA from ARM to DSP using AHB \n");
}else if (*buff != 0x40 && count_flag == 0x1) {
if (*buff != 0x0d && data_flag == 0x0) {
if (count < 5) {
if (*buff >= 0x41 && *buff <= 0x46) {
temp_buff = *buff - 0x37;
}else{
temp_buff = *buff - 0x30;
}
temp_buff = temp_buff & 0x0f;
temp_addr = temp_addr | (temp_buff << (4-count)*4);
count++;
//printf(">>count=%d temp_addr=%x temp_buff=%x\n",count,temp_addr,temp_buff);
}else if (count == 5) {
count++;
}else if (count == 6) {
count = 0;
data_size = 0;
data_flag = 0x1;
address_offset = temp_addr;
//printf(">>>> address=%x, address_offset=%x,\n",0x11050000 + address_offset,address_offset);
}
} else if (*buff != 0x0d && data_flag == 0x1) {
if (*buff == 0x20) {
//printf(">> sp..\n");
}else{
if (LittleEndian__count <= 4) {
if (LittleEndian__count == 4) {
LittleEndian__count = 0;
little_data_size++;
LittleEndian_buff[little_data_size] = 0x0000; // CHECK
}
if (*buff >= 0x41 && *buff <= 0x46) {
data_buff[data_size] = *buff - 0x37;
}else {
data_buff[data_size] = *buff - 0x30;
}
//printf(">>>>1. data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
data_buff[data_size] = data_buff[data_size] & 0x0f;
//printf(">>>>2. data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
LittleEndian_buff[little_data_size] |= (data_buff[data_size] << ((3-LittleEndian__count)*4));
LittleEndian__count++;
//printf(">>>>data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
//printf(">>>>LittleEndian_count=%d LittleEndian_buff[%d]=%x\n",LittleEndian__count,little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>address=%x\n",(volatile unsigned short *)0x11050000 + address_offset + little_data_size);
// if ((LittleEndian__count & 3) == 0)
// *((volatile unsigned short *)0x11050000 + address_offset + little_data_size) = LittleEndian_buff[little_data_size] ;
if ((LittleEndian__count & 3) == 0)
{
//printf(">>>>LittleEndian_buff[%d]=%x\n",little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>LittleEndian_count=%d LittleEndian_buff[%d]=%x\n",LittleEndian__count,little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>address=%x\n",(volatile unsigned short *)DSP_PRAM_BANK0 + address_offset + little_data_size);
*((volatile unsigned short *)DSP_PRAM_BANK0 + address_offset + little_data_size) = LittleEndian_buff[little_data_size] ;
}
data_size++;
}
}
}else if (*buff == 0x0d && data_flag == 0x1) {
//printf(">> end of one record \n");
printf("p");
i++;
data_flag = 0x0;
data_size = 0;
little_data_size=0;
LittleEndian__count = 0;
count_flag = 0x0;
LittleEndian_buff[0] = 0x0000; // CHECK
}
}
}
}
/**************************************************************************
* Function: LOAD_ARM2DSP_XDATA
* Created: skpark 2004-5-24
* Description: LOAD XDATA FROM ARM TO DSP
* Arguments:
* Return: 俊矾蔼
* Side effect:
**************************************************************************/
void LOAD_ARM2DSP_XDATA()
{
unsigned char *buff, temp_buff, data_buff[32];
unsigned char count_flag = 0x0, data_flag = 0x0, eob_flag = 0x0;
unsigned short LittleEndian_buff[8];
unsigned int temp_addr=0x0, address_offset=0x0, data_size=0,little_data_size=0;
unsigned int i=0, k=0, count=0,LittleEndian__count=0, total_data_size=0;
unsigned long srcadrs, dstadrs, xfersize;
LittleEndian_buff[0] = 0x0000;
while (eob_flag != 0x1) {
buff = (unsigned char *)(__COFF_XDATA_BASE + i++) ;
//printf(">>buff[%d]=%x\n",i,*buff);
if (*buff == 0x40 && count_flag == 0x0) {
count_flag = 0x1;
count = 0;
temp_addr = 0x0;
} else if (*buff == 0x0) {
eob_flag = 0x1;
printf("\n>> end of block: total_data_size(%d) \n",total_data_size);
printf(">> Completed sending X-DATA from ARM to DSP using AHB \n");
} else if (*buff != 0x40 && count_flag == 0x1) {
if (*buff != 0x0d && data_flag == 0x0) {
if (count < 4) {
if (*buff >= 0x41 && *buff <= 0x46) {
temp_buff = *buff - 0x37;
}else{
temp_buff = *buff - 0x30;
}
temp_buff = temp_buff & 0x0f;
temp_addr = temp_addr | (temp_buff << (3-count)*4);
count++;
//printf(">>count=%d temp_addr=%x temp_buff=%x\n",count,temp_addr,temp_buff);
}else if (count == 4) {
count++;
}else if (count == 5) {
count = 0;
data_size = 0;
data_flag = 0x1;
address_offset = temp_addr;
//printf(">>>> address=%x, address_offset=%x,\n",0x11050000 + address_offset,address_offset);
}
} else if (*buff != 0x0d && data_flag == 0x1) {
if (*buff == 0x20) {
//printf(">> sp..\n");
}else{
if (LittleEndian__count <= 4) {
if (LittleEndian__count == 4) {
LittleEndian__count = 0;
little_data_size++;
LittleEndian_buff[little_data_size] = 0x0000;
}
if (*buff >= 0x41 && *buff <= 0x46) {
data_buff[data_size] = *buff - 0x37;
}else {
data_buff[data_size] = *buff - 0x30;
}
//printf(">>>>1. data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
data_buff[data_size] = data_buff[data_size] & 0x0f;
//printf(">>>>2. data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
LittleEndian_buff[little_data_size] |= (data_buff[data_size] << ((3-LittleEndian__count)*4));
LittleEndian__count++;
//printf(">>>>data_buff[%d]=%x,\n",data_size,data_buff[data_size]);
//printf(">>>>LittleEndian_count=%d LittleEndian_buff[%d]=%x\n",LittleEndian__count,little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>address=%x\n",(volatile unsigned short *)0x11050000 + address_offset + little_data_size);
if ((LittleEndian__count & 3) == 0)
*((volatile unsigned short *)(_NONCACHE_STARTADDRESS+0x00060000) + address_offset + little_data_size) = LittleEndian_buff[little_data_size] ;
if ((LittleEndian__count & 3) == 0)
{
//printf(">>>>LittleEndian_buff[%d]=%x\n",little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>LittleEndian_count=%d LittleEndian_buff[%d]=%x\n",LittleEndian__count,little_data_size,LittleEndian_buff[little_data_size]);
//printf(">>>>address=%x\n",(volatile unsigned short *)DSP_PRAM_BANK0 + address_offset + little_data_size);
*((volatile unsigned short *)DSP_XRAM_BANK0 + address_offset + little_data_size) = LittleEndian_buff[little_data_size] ;
}
data_size++;
}
}
}else if (*buff == 0x0d && data_flag == 0x1) {
total_data_size += data_size;
//printf(">> end of one record : data_size(%d),total(%d)\n",data_size,total_data_size);
printf("x");
i++;
data_flag = 0x0;
data_size = 0;
little_data_size=0;
LittleEndian__count = 0;
count_flag = 0x0;
LittleEndian_buff[0] = 0x0000;
}
}
}
}
static void __irq ISR_TEAK(void)
{
printf("INT from TEAK DSP !\n");
rARM2DSP_CTRL |= 0x2;
rARM2DSP_CTRL |= 0x1;
ClearPending(BIT_TEAK);
}
static void __irq ISR_DSPWDOG(void)
{
printf("INT from DSP WDOG !\n");
ClearPending(BIT_DSPWDOG);
}
void TeakDSP( void)
{
unsigned int DSPCLK;
int key;
rARM2DSP_CTRL &= ~(0x8);
printf("Do you want to download an image ? (y/N)");
if ((getchar()|0x20)=='y') {
printf("\n ##### DOWNLOAD P-COFF FROM PC TO DSP ##### \n");
LOAD_COFF_PDATA();
LOAD_ARM2DSP_PDATA();
printf("Continue to download into DATA memory ? (Y/n)");
if ((getchar()|0x20)!='n') {
printf("\n ##### DOWNLOAD X-COFF FROM PC TO DSP ##### \n");
LOAD_COFF_XDATA();
LOAD_ARM2DSP_XDATA();
}
} else {
(*(volatile unsigned short *)(DSP_PRAM_BANK0+0)) = 0x4180;
(*(volatile unsigned short *)(DSP_PRAM_BANK0+2)) = 0x0000; // make DSP to unconditional loop
}
DSPCLK=HCLK;
printf("\nSelect the frequency of DSPCLK\n");
printf("[0] HCLK (%dMHz) [1] HCLK/2 (%dMHz)\n",DSPCLK/1000000,DSPCLK/2000000);
if (getchar()=='1') {
rCLKDIVCON |= 0x8;
DSPCLK /= 2;
} else {
rCLKDIVCON &= ~(0x8);
}
printf("\nNow run the TeakDSP @%dMHz !!!\n",DSPCLK);
pISR_TEAK = (unsigned int)ISR_TEAK;
rSRCPND = BIT_TEAK; //to clear the previous pending states
rINTPND = BIT_TEAK;
rINTMSK &= ~(BIT_TEAK);
pISR_DSPWDOG = (unsigned int)ISR_DSPWDOG;
rSRCPND = BIT_DSPWDOG; //to clear the previous pending states
rINTPND = BIT_DSPWDOG;
rINTMSK &= ~(BIT_DSPWDOG);
rARM2DSP_CTRL |= 0x78; // Release \reset
while(1) {
printf("Ready DSP action !!!\n");
if ((key=getchar())=='x') break;
}
rARM2DSP_CTRL &= ~(0x8); // Reset hold
rINTMSK |= (BIT_TEAK)|(BIT_DSPWDOG);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -