📄 hpi.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 + -