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

📄 teakdsp.c

📁 三星s3c2460开发板完整功能测试代码
💻 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 + -