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

📄 hpi.c

📁 ti的驱动程序例程
💻 C
字号:
#include <stdio.h>
#include <csl.h>
#include <csl_cache.h>


//flash 读写
#if 0
/* Erase a segment of Flash memory */
int HPI_FLASH_erase(Uint32 start, Uint32 length)
{
  return 0;
}
 
/* Read data from a range in Flash */
int  HPI_FLASH_read(char * dst, char * src, Uint32 length)
{
	memset(dst,0xff,length);
    return 0;

}
 
/* Write data to a data range in Flash */
int HPI_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
{

  return 0;

}
 
//串口读写 
 int rs232_write(char * buffer,int count)
 {
   return 0;
 }
int  rs232_set(int audrate,int databits,int stopbits,int paritybits)
 {
    return 0;
 
 }
 
 //返回当前中控状态
 int get_statue()
 {
   return 0;
 }
 
 #endif 
 
#define  p_hpic 		(unsigned int* volatile)0x01880000   
#define  COMMANDBUFFER 	(unsigned int* volatile)0x00000000  
#define  READBUFFER 	(char * volatile)0x00000100 		    
#define  WRITEBUFFER 	(unsigned int* volatile)0x00000200   
#define  CONTROLBUFFER 	(unsigned int* volatile)0x00000300 
#define  DOGFLAG	 	(unsigned int* volatile)0x00000304  


/* ARM和DSP通信定义 */
typedef union
{
    int Val;
    struct
    {
         unsigned DspReady  :1;
         unsigned HostReady :1;
         unsigned Cmd       :22; 
         unsigned Result    :8; 
    }Bit;
}StrHostCnd;

StrHostCnd 	HostCnd;

void HpiDelay()
{
	int i, j, k;
	for(i = 0; i<100; i++)
		for(j = 0; j<100; j++)
			for(k = 0; k<100; k++);

}

void SetDog(void)
{
	*DOGFLAG = 0x01;
}

void Hpi_init(void)
{
	int *pw;
	pw = COMMANDBUFFER;
	while(pw != (int *)0x00000400)
	{
		*pw++ = 0xFFFFFFFF;
	}
	HostCnd.Val = 0x00000000;
	*CONTROLBUFFER = HostCnd.Val;
}

char CrcSum(char * indata, int len)
{
	int i;
	char sum = 0;
	for(i = 0; i < len; i++)
	{
		sum += indata[i];
		sum %= 0x100;
	}
	return sum;
}

int HPI_FLASH_erase(int start, int length)
{
	Uint32 	i, *p_sendCommand, comBuffer[4];
	char 	crc, HpiTimes = 0;
	Uint32 	 hdata;
	
	printf("\HPI_FLASH_erase Start\n");
	p_sendCommand = COMMANDBUFFER;

	HostCnd.Bit.HostReady = 0; 			//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 		//写入控制信息
	
	comBuffer[0] = 0x0800d1a5; 			//指令
	comBuffer[1] = start;
	comBuffer[2] = length;
	crc = CrcSum((char *)comBuffer, 12); //计算校验值
	comBuffer[3] = crc;
	
	for(i = 0; i < 4; i++) 				//写入命令数据到发送缓冲中
	{
		*p_sendCommand++ = comBuffer[i];
	}
	
	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata; 
     
	HostCnd.Val = *CONTROLBUFFER;		
			
	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else 
		{
			return -1;		
		}
	}
	
	printf("\HPI_FLASH_erase End\n");
	
	if(HostCnd.Bit.Result == 0x01)
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return 0;                  //成功
	}
	else
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return -1;                 //失败
	}
	
}

int HPI_FLASH_read(char *dst, char *src, Uint32 length)
{
	Uint32 	len;
	int		retData;
	
	printf("\HPI_FLASH_read loop start\n");
	if(length <= 128)
	{
		retData = HPI_FLASH_read1(dst, src, length);
	}
	else
	{
		len = length;
		while( len > 0x80)
		{
			len = len - 0x80;
			retData = HPI_FLASH_read1(dst, src, 128);
			if(retData == -1)
			{
				printf("\HPI_FLASH_read loop end error\n");
				return -1;
			}
			dst = dst + 0x80;
			src = src + 0x80;
		}
		retData = HPI_FLASH_read1(dst, src, len);
	}
	
	if(retData == -1)
	{
		printf("\HPI_FLASH_read loop end error\n");
		return -1;
	}
	else
	{
		printf("\HPI_FLASH_read loop end\n");
		return 0;
	}
}

int HPI_FLASH_read1(char *dst, char *src, Uint32 length)
{
    Uint32  i, *p_sendCommand, comBuffer[5];
	Uint32	len, rem;
	char 	*p_readData, *p_dst;
	char 	crc, HpiTimes = 0;
	Uint32 	 hdata;
	
	printf("\nHPI_FLASH_read1 Start\n");

	p_sendCommand = COMMANDBUFFER;

	HostCnd.Bit.HostReady = 0; 			//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 	//写入控制信息

	comBuffer[0] = 0x0c00d2a5;
	comBuffer[1] = (Uint32 )READBUFFER;
	comBuffer[2] = (Uint32 )src;
	comBuffer[3] = length;
	crc = CrcSum((char *)comBuffer, 16);
	comBuffer[4] = crc;
	
	for(i = 0; i < 5; i++)
	{
		*p_sendCommand++ = comBuffer[i];
	}

	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata;  
    
	HostCnd.Val = *CONTROLBUFFER;				
	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else
		{
			return -1;		
		}
	}
	
	p_dst = dst;
	p_readData = READBUFFER;
	
	for(i = 0; i < length; i++)
	{
		*p_dst++ = *p_readData++;		
	}
	printf("\nHPI_FLASH_read1 End\n");
	
	if(HostCnd.Bit.Result == 0x01)
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return 0;                  //成功
	}
	else
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return -1;                 //失败
	}
	return 0;
}

int HPI_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
{
	Uint32 	len;
	int		retData;
	
	printf("\HPI_FLASH_write loop start\n");
	if(length <= 128)
	{
		retData = HPI_FLASH_write1(src, dst, length);
	}
	else
	{
		len = length;
		while( len > 0x80)
		{
			len = len - 0x80;
			retData = HPI_FLASH_write1(src, dst, 128);
			if(retData == -1)
			{
				printf("\HPI_FLASH_write loop end error\n");
				return -1;
			}
			dst = dst + 0x80;
			src = src + 0x80;
		}
		retData = HPI_FLASH_write1(src, dst, len);
	}
	if(retData == -1)
	{
		printf("\HPI_FLASH_write loop end error\n");
		return -1;
	}
	else
	{
		printf("\HPI_FLASH_write loop end\n");
		return length;
	}
}

int HPI_FLASH_write1(Uint32 src, Uint32 dst, Uint32 length)
{
	Uint32 	i, *p_sendCommand,  comBuffer[5], hdata;
	char 	*p_writeData, *p_src;
	char 	crc, HpiTimes = 0;;
    
	printf("\HPI_FLASH_write1 Start\n");
	
	p_src = (char *)src;
	p_writeData = (char *)WRITEBUFFER;
	
	for(i = 0; i < length; i++)
	{
		*p_writeData++ = *p_src++;
		
	}
	
	*p_writeData = CrcSum((char *)src, length);
	
	p_sendCommand = COMMANDBUFFER;
	
	HostCnd.Bit.HostReady = 0; 		//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 	//写入控制信息
		
	comBuffer[0] = 0x0c00d3a5;
	comBuffer[1] = (Uint32 )WRITEBUFFER;
	comBuffer[2] = (Uint32 )dst;
	comBuffer[3] = length + 1;
	crc = CrcSum((char *)comBuffer, 16);
	comBuffer[4] = crc;
	
	for(i = 0; i < 5; i++)
	{
		*p_sendCommand++ = comBuffer[i];
	}
	
	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata;    
    	
	HostCnd.Val = *CONTROLBUFFER;
//	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
//	{
//		HostCnd.Val = *CONTROLBUFFER;		
//	}	
	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else
		{
			return -1;		
		}
	}
	
	printf("\HPI_FLASH_write1 End\n");
	
	if(HostCnd.Bit.Result == 0x01)
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return length;                  //成功
	}
	else
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return -1;                 //失败
	}
}

void rs232_write(char *buffer, int count)
{
	Uint32 i, *p_sendCommand, comBuffer[4];
	char crc, *p_src, *p_writeData, HpiTimes = 0;
	Uint32 	 hdata;
	
	printf("\rs232_write Start\n");
	
	p_src = buffer;
	p_writeData = (char *)WRITEBUFFER;
	
	for(i = 0; i < count; i++)
	{
		*p_writeData++ = *p_src++;
		
	}
	
	*p_writeData = CrcSum((char *)buffer, count);
	
	p_sendCommand = COMMANDBUFFER;

	HostCnd.Bit.HostReady = 0; 		//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 	//写入控制信息
		
	comBuffer[0] = 0x0800d6a5;
	comBuffer[1] = (Uint32)WRITEBUFFER;
	comBuffer[2] = count + 1;
	crc = CrcSum((char *)comBuffer, 12);
	comBuffer[3] = crc;
	
	for(i = 0; i < 4; i++)
	{
		*p_sendCommand++ = comBuffer[i];
	}

	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata; 
     
	HostCnd.Val = *CONTROLBUFFER;		
	while(HostCnd.Bit.HostReady != 1) //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else
		{
			return ;		
		}
	}
	
	printf("\rs232_write End\n");
	
	HostCnd.Val = 0x00000000;
	*CONTROLBUFFER = HostCnd.Val;
}

void rs232_set(int baud, int databits, int stopbits,int paritybits)
{
	int i, *p_sendCommand, comBuffer[3], sum = 150;
	char crc, HpiTimes = 0;
	char audrate = 0;
	Uint32 	 hdata;
	
	printf("\rs232_set Start\n");
	
	if( baud <= 38400)
	{	
		while(sum < baud)
		{
			audrate++;
			sum = 2 * sum;
		}
	}
	else if(baud <= 57600)
	{
		audrate = 9;
	}
	else if(baud <= 115200)
	{
		audrate = 10;
	}
	
	p_sendCommand = COMMANDBUFFER;

	HostCnd.Bit.HostReady = 0; 		//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 	//写入控制信息
		
	comBuffer[0] = 0x0400d7a5;
	comBuffer[1] = paritybits;
	comBuffer[1] = (comBuffer[1] << 8) + stopbits;
	comBuffer[1] = (comBuffer[1] << 8) + databits;
	comBuffer[1] = (comBuffer[1] << 8) + audrate;
	crc = CrcSum((char *)comBuffer, 8);
	comBuffer[2] = crc;
	
	for(i = 0; i < 3; i++) //
	{
		*p_sendCommand++ = comBuffer[i];
	}

	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata;  
    
	HostCnd.Val = *CONTROLBUFFER;			
	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else
		{
			return;		
		}
	}
	
	printf("\rs232_set End\n");
	
	HostCnd.Val = 0x00000000;
	*CONTROLBUFFER = HostCnd.Val;
}

int get_statue()
{
	int i, *p_sendCommand, comBuffer[3];
	char crc, HpiTimes = 0;
	Uint32 	 hdata;
	
	printf("\get_statue Start\n");
	
	p_sendCommand = COMMANDBUFFER;

	HostCnd.Bit.HostReady = 0; 		//通知主机ARM, DSP将要发送数据
	*CONTROLBUFFER = HostCnd.Val; 	//写入控制信息
		
	comBuffer[0] = 0x0400d4a5;
	comBuffer[1] = 0x00000000;
	crc = CrcSum((char *)comBuffer, 8);
	comBuffer[2] = crc;

	for(i = 0; i < 3; i++) //
	{
		*p_sendCommand++ = comBuffer[i];
	}

	HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
	*CONTROLBUFFER = HostCnd.Val;
	
	hdata = *p_hpic;
	hdata = hdata | 0x00040004;
    *p_hpic = hdata; 
     
	HostCnd.Val = *CONTROLBUFFER;				
	while(HostCnd.Bit.HostReady != 1)  //检测ARM是否处理完毕
	{
		if( HpiTimes != 100)
		{
			HpiDelay();
			HostCnd.Val = *CONTROLBUFFER;
			HpiTimes++;
			if((HpiTimes % 20) == 0)
			{
				HostCnd.Bit.DspReady = 1;			//通知ARM, dsp准备就绪
				*CONTROLBUFFER = HostCnd.Val;
	
				hdata = *p_hpic;
				hdata = hdata | 0x00040004;
			    *p_hpic = hdata; 
			}
		}
		else
		{
			return -1;		
		}
	}
	
	printf("\get_statue End\n");
	////////////////////////////////
	//状态数据从地址0x0000100处获得
	////////////////////////////////
	
	
	if(HostCnd.Bit.Result == 0x01)
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return *READBUFFER;                  //成功
	}
	else
	{
		HostCnd.Val = 0x00000000;
		*CONTROLBUFFER = HostCnd.Val;
		return -1;                 //失败
	}
	
}

void GetArmData(char *outbuffer, int *len)
{
	unsigned char 	*p_getData;
	int		i;
	p_getData = READBUFFER;
	*len = p_getData[3] + 5;
	for(i = 0; i < *len; i++)          //获取数据
	{
		outbuffer[i] = p_getData[i];
	}
	for(i = 0; i < 256; i++)            //清除数据
	{
		p_getData[i] = 0xFF;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -