📄 com.c
字号:
/*
* Com.c
*
* Copyright (C) 2004 Vimicro Corporation
*
* Written by TangMian Email: tangmian@vimicro.com Tel: 010-68948888-8902
*
* Overview:
* This is a Serial Communication Firmware. It is used to Script Test.
*
*
* 2005,10,27
* Released By TangMian. Version 1.01
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Com.h"
void Com_SendData(char* pt, int num);
void ErrorCommand(void);
void RespondCommand(void);
void ReturnCommand(UINT8 vl);
UINT16 LengthCommand(void);
UINT8 GetDataCommand(UINT8* ptr, UINT16 length);
void InitComRecive(UINT32 baud, void (*func)(UINT8 uOneByte));
UINT8 m_buf[12];
UINT8 bcomnum = 0;
UINT32 dPara[64];
static UINT8 buffer[256];
static UINT8 bData[256];
static UINT32 (*pReceiveFunc)(UINT8* pbDptr);
static void (*pSendFunc)(UINT8* pbDptr, UINT32 dNum);
//************************************************ API ******************************************************//
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Initialize Uart0
[ARGUMENTS]
pReceiveCom: Receive Function Pointer
pSendCom: Send Function Pointer
[RETURN VALUE]
NULL
------------------------------------------------------------------------------------------------------------*/
void Com_Init(UINT32 (*pReceiveCom)(UINT8* pbDptr), void (*pSendCom)(UINT8* pbDptr, UINT32 dNum))
{
memset(m_buf, 0, 12);
memset(buffer, 0, 256);
memset(bData, 0, 256);
memset((void*)dPara, 0, 64);
pReceiveFunc = pReceiveCom;
pSendFunc = pSendCom;
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Check that wether command has been received
[ARGUMENTS]
NULL
[RETURN VALUE]
1: command received; 0: No command received
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_Check(void)
{
UINT8* sptr;
sptr = m_buf + bcomnum;
bcomnum += (UINT8)pReceiveFunc(sptr);
/*
if((m_buf[0]==0x80) && (bcomnum==0xA))
{
//bcomnum = 0; //leon
return 1;
}
else
return 0;*///leon
if(m_buf[0]!=0x80)
bcomnum=0;
if(bcomnum>=0xA)
{
bcomnum = 0;
return 1;
}
else
return 0;
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Get Command Main ID
[ARGUMENTS]
NULL
[RETURN VALUE]
ID Number (0x81: 938; 0x82: 568; 0x83 Function ...)
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_GetMainID(void)
{
return m_buf[1];
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Get Function Parameter
[ARGUMENTS]
NULL
[RETURN VALUE]
1: Success; 0: Failed
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_GetFuncPara(void)
{
UINT32 i, len;
//UINT8* sptr;
//sptr = (UINT8*)dPara;
len = LengthCommand();
RespondCommand();
i = GetDataCommand(bData, len);
if (i)
{
//for(j=0; j<256; j++)
//{
//*sptr ++ = *(bData + j);
memcpy((void*)dPara, (void*)(bData + 1), 256);
//}
}
return i;
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Get Function Command ID
[ARGUMENTS]
NULL
[RETURN VALUE]
ID Number
------------------------------------------------------------------------------------------------------------*/
UINT16 Com_GetFuncID(void)
{
if(Com_GetFuncPara())
return ((m_buf[2] << 8) | m_buf[3]);
else
return 0;
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Return Function Result
[ARGUMENTS]
bParaNum: The Number of Parameter to be returned
[RETURN VALUE]
1: Success; 0: Failed
------------------------------------------------------------------------------------------------------------*/
void Com_ReturnValue(UINT8 bParaNum)
{
UINT32 Temp;
//UINT8* sptr;
Temp = bParaNum * 4;
//sptr = (UINT8*)dPara;
buffer[0] = START_FLAG;
buffer[1] = Temp + 4;
buffer[2] = 0x0;
buffer[3] = 0x0;
memcpy((void*)(buffer + 4), (void*)dPara, Temp);
buffer[Temp + 4] = 0x55;
buffer[Temp + 5] = END_FLAG;
Com_SendData((char*)buffer, (Temp + 6));
bcomnum = 0;
memset(m_buf, 0, 12);
memset(buffer, 0, 256);
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Return Error Command
[ARGUMENTS]
NULL
[RETURN VALUE]
NULL
------------------------------------------------------------------------------------------------------------*/
void ErrorCommand(void)
{
//DisableInterrupt();
buffer[0] = m_buf[0];
buffer[1] = m_buf[1];
buffer[2] = m_buf[2];
buffer[3] = m_buf[3];
buffer[4] = 0x00;
buffer[5] = 0x02; //Unknown Command
buffer[9] = END_FLAG;
Com_SendData((char*)buffer, 10);
memset(m_buf, 0, 12);
bcomnum = 0;
//EnableInterrupt();
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Download File to a Buffer
[ARGUMENTS]
filePtr : Buffer Point
size : Buffer size
[RETURN VALUE]
NULL
// Add by aawolf 2005.12.1
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_DownloadFile(UINT8 * filePtr,UINT32 size)
{
UINT8 * ptr;
UINT32 filesize=0;
char buffer[1];
memset(buffer,0,1);
ptr = filePtr;
while(filesize<size)
{
if((size - filesize) < 512)
{
GetDataCommand(ptr, (size - filesize));
break;
}
else
{
filesize += 512;
GetDataCommand(ptr, 512);
ptr += 512;
}
buffer[0] = 0x1;
Com_SendData(buffer,1);
}
return 0;
}
/*------------------------------------------------------------------------------------------------------------
[DESCRIPTION]
Upload a Buffer to a File
[ARGUMENTS]
filePtr : Buffer Point
size : Buffer size
[RETURN VALUE]
NULL
// Add by aawolf 2005.12.1
------------------------------------------------------------------------------------------------------------*/
UINT8 Com_UploadFile(UINT8 * ptr,UINT32 size)
{
UINT8 rx;
char buffer[1];
memset(buffer,0,1);
while(size)
{
if(size > 512)
{
Com_SendData((char*)ptr, 512);
ptr+=512;
size-=512;
//rx=Uart_Getch();
}
else
{
Com_SendData((char*)ptr, size);
break;
}
//Delay(100);
GetDataCommand((UINT8 *)buffer, 1);
//if(buffer[0] != 0x1)
// return 0x1;
}
//rx=Uart_Getch();
return 0;
}
//************************************************ API ******************************************************//
void Com_SendData(char* pt, int num)
{
pSendFunc((UINT8*)pt, num);
}
void RespondCommand(void)
{
memcpy(buffer, m_buf, 4);
buffer[4] = buffer[5] = 0x0;
buffer[9] = END_FLAG;
Com_SendData((char*)buffer, 10);
}
void ReturnCommand(UINT8 vl)
{
if(vl!=0)
{
buffer[1]=0x00;
buffer[2]=vl;
}
buffer[14]=0x55;
buffer[15]=END_FLAG;
Com_SendData((char*)buffer, 16);
}
UINT16 LengthCommand(void)
{
UINT16 length;
length = ((m_buf[4] << 8) | m_buf[5]);
length *= 4;
length +=3;
return length;
}
UINT8 GetDataCommand(UINT8* ptr, UINT16 length)
{
UINT32 dComNum = 0;
UINT32 dNum, timeout;
UINT8* sptr;
sptr = ptr;
dNum = timeout = 0;
//while((dComNum < length) && (timeout >= 0x7ffffff))
while((dComNum < length) && (timeout < 0x7ffffff)) //leon
{
dNum = pReceiveFunc(sptr);
if (dNum == 0)
timeout ++;
else
{
sptr += dNum;
dComNum += dNum;
}
}
if(timeout >= 0x7ffffff)
return 0;
else
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -