128 lines
3.8 KiB
C
Executable File
128 lines
3.8 KiB
C
Executable File
///////////////////////////////////////////////////////////////////////////////////
|
|
// GMvSystem.c
|
|
//---------------------------------------------------------------------------------
|
|
// Created by Byeongjae Gim
|
|
// Email: gaiama78@gmail.com, byeongjae.kim@samsung.com
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "GMvSystem.h"
|
|
|
|
//
|
|
sint32 GMvPacketMakeHeader( uint8 *pu8Dst, EG_MV_PKT_ID ePktId, uint16 u16Arg, uint16 u16PldSize )
|
|
{
|
|
struct SGMvPktHdr *psPktHdr;
|
|
#if defined DG_MV_PKT_PARITY_RS_10_6
|
|
struct SGMvPktHdr sPktHdr;
|
|
#endif
|
|
|
|
#if defined( DG_MV_PKT_PARITY_CRC16 ) || defined( DG_MV_PKT_PARITY_CRC32 )
|
|
psPktHdr = (struct SGMvPktHdr*)pu8Dst;
|
|
#elif defined DG_MV_PKT_PARITY_RS_10_6
|
|
psPktHdr = &sPktHdr;
|
|
#else
|
|
psPktHdr = (struct SGMvPktHdr*)pu8Dst;
|
|
#endif
|
|
psPktHdr->u8SyncByte = DG_MV_PKT_SYNC_BYTE;
|
|
psPktHdr->u8PktId = ePktId;
|
|
psPktHdr->u16Arg = u16Arg;
|
|
psPktHdr->u16PldSize = u16PldSize;
|
|
#if defined( DG_MV_PKT_PARITY_CRC16 )
|
|
*(uint16*)&pu8Dst[sizeof( struct SGMvPktHdr )] = GMvCrc16Encode( pu8Dst, sizeof( struct SGMvPktHdr ) );
|
|
#elif defined( DG_MV_PKT_PARITY_CRC32 )
|
|
*(uint32*)&pu8Dst[sizeof( struct SGMvPktHdr )] = GMvCrc32Encode( pu8Dst, sizeof( struct SGMvPktHdr ) );
|
|
#elif defined DG_MV_PKT_PARITY_RS_10_6
|
|
GMvRsEncode( pu8Dst, &sPktHdr, sizeof( sPktHdr ) );
|
|
#endif
|
|
|
|
return sizeof( struct SGMvPktHdr ) + DG_MV_PKT_PARITY_SIZE_HEADER;
|
|
}
|
|
|
|
sint32 GMvPacketMakePayload( uint8 *pu8Dst, sint32 s32DstSize, uint8 *pu8Src, sint32 s32SrcSize )
|
|
{
|
|
#if defined( DG_MV_PKT_PARITY_CRC16 )
|
|
memcpy( pu8Dst, pu8Src, s32SrcSize );
|
|
*(uint16*)&pu8Dst[s32SrcSize] = GMvCrc16Encode( pu8Src, s32SrcSize );
|
|
#elif defined( DG_MV_PKT_PARITY_CRC32 )
|
|
memcpy( pu8Dst, pu8Src, s32SrcSize );
|
|
*(uint32*)&pu8Dst[s32SrcSize] = GMvCrc32Encode( pu8Src, s32SrcSize );
|
|
#elif defined DG_MV_PKT_PARITY_RS_10_6
|
|
return GMvRsEncode( pu8Dst, pu8Src, s32SrcSize );
|
|
#else
|
|
memcpy( pu8Dst, pu8Src, s32SrcSize );
|
|
#endif
|
|
|
|
return s32SrcSize + DG_MV_PKT_PARITY_SIZE_HEADER;
|
|
}
|
|
|
|
struct SGMvPktHdr* GMvPacketCheckHeader( uint8 *pu8Pkt, sint32 s32HdrSize )
|
|
{
|
|
#if defined( DG_MV_PKT_PARITY_CRC16 )
|
|
if( *(uint16*)&pu8Pkt[sizeof( struct SGMvPktHdr )] != GMvCrc16Encode( pu8Pkt, sizeof( struct SGMvPktHdr ) ) )
|
|
#elif defined( DG_MV_PKT_PARITY_CRC32 )
|
|
if( *(uint32*)&pu8Pkt[sizeof( struct SGMvPktHdr )] != GMvCrc32Encode( pu8Pkt, sizeof( struct SGMvPktHdr ) ) )
|
|
#elif defined DG_MV_PKT_PARITY_RS_10_6
|
|
if( EG_RESULT_SUCCESS != GMvRsDecode( NULL, pu8Pkt, s32HdrSize ) )
|
|
#else
|
|
if( 0 )
|
|
#endif
|
|
{
|
|
DG_DBG_PRINT_ERROR( _T("Packet Header is Corrupted!") );
|
|
return NULL;
|
|
}
|
|
DG_SAFE_IS_NOT_EQUAL( *pu8Pkt, DG_MV_PKT_SYNC_BYTE, DG_DBG_PRINT_ERROR( _T("*pu8Pkt != DG_MV_PKT_SYNC_BYTE") ); return NULL );
|
|
|
|
return (struct SGMvPktHdr*)pu8Pkt;
|
|
}
|
|
|
|
// CRC16
|
|
#if defined( DG_MV_PKT_PARITY_CRC16 )
|
|
struct CGMvCrc16
|
|
{
|
|
uint16 m_u16Polynomial, m_pu16Lut[256];
|
|
};
|
|
|
|
static struct CGMvCrc16 sg_cMvCrc16;
|
|
|
|
static uint16 SGMvCrc16BitReflect( uint16 u16ReflectMask, sint32 s32BitNum )
|
|
{
|
|
sint32 s32BitPos;
|
|
uint16 u16Reflected;
|
|
|
|
u16Reflected = 0;
|
|
for( s32BitPos=1; s32BitPos<=s32BitNum; s32BitPos++ )
|
|
{
|
|
if( u16ReflectMask & 1 )
|
|
u16Reflected |= 1 << (s32BitNum - s32BitPos);
|
|
u16ReflectMask >>= 1;
|
|
}
|
|
|
|
return u16Reflected;
|
|
}
|
|
|
|
void GMvCrc16Open( void )
|
|
{
|
|
uint32 i, j;
|
|
|
|
memset( &sg_cMvCrc16, 0, sizeof( struct CGMvCrc16 ) );
|
|
sg_cMvCrc16.m_u16Polynomial = 0x8005;
|
|
for( i=0; i<256; i++ )
|
|
{
|
|
sg_cMvCrc16.m_pu16Lut[i] = SGMvCrc16BitReflect( i, 8 ) << 8;
|
|
for( j=0; j<8; j++ )
|
|
sg_cMvCrc16.m_pu16Lut[i] = (sg_cMvCrc16.m_pu16Lut[i] << 1) ^ ((sg_cMvCrc16.m_pu16Lut[i] & (1 << 15)) ? sg_cMvCrc16.m_u16Polynomial : 0);
|
|
sg_cMvCrc16.m_pu16Lut[i] = SGMvCrc16BitReflect( sg_cMvCrc16.m_pu16Lut[i], 16 );
|
|
}
|
|
}
|
|
|
|
uint16 GMvCrc16Encode( uint8 *pu8Data, sint32 s32Size )
|
|
{
|
|
uint16 u16Crc16;
|
|
|
|
u16Crc16 = 0;
|
|
while( s32Size-- )
|
|
u16Crc16 = (u16Crc16 >> 8) ^ sg_cMvCrc16.m_pu16Lut[(u16Crc16 & 0xFF) ^ *pu8Data++];
|
|
|
|
return u16Crc16;
|
|
}
|
|
#endif
|