www.pudn.com > DMBDRV.rar > smsspicommon.c


#include "smsspicommon.h" 
#include "SianoSPI.h" 
 
#include  
 
 
static int smsspi_common_find_msg(struct spi_dev* dev, char* buf, int len) 
{ 
	int	i, missing_bytes; 
	 
	int TmpLen; 
	//DBGMSG(ZONE_INFO, (TEXT("entering with %d bytes.\n"), len)); 
 
	missing_bytes = 0; 
	for(i=0;irxState) 
		{ 
			case RxsWait_a5: 
				if((buf[i] & 0xff)== 0xa5) 
				{ 
					dev->rxState = RxsWait_5a; 
					missing_bytes = SPI_PACKET_SIZE; 
					//DBGMSG(ZONE_DETAILED, (TEXT("state %d. missing_bytes = %d\n"), dev->rxState, missing_bytes)); 
				} 
				else 
				{ 
					missing_bytes = 0; 
				} 
			break; 
			case RxsWait_5a: 
				if((buf[i] & 0xff) == 0x5a) 
					dev->rxState = RxsWait_e7; 
				else 
				{ 
					dev->rxState = RxsWait_a5; 
					missing_bytes = 0; 
				} 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsWait_e7: 
				if((buf[i] & 0xff) == 0xe7) 
					dev->rxState = RxsWait_7e; 
				else 
				{ 
					dev->rxState = RxsWait_a5; 
					missing_bytes = 0; 
				} 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsWait_7e: 
				if((buf[i] & 0xff) == 0x7e) 
					dev->rxState = RxsTypeH; 
				else 
					dev->rxState = RxsWait_a5; 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsTypeH: 
				dev->rxPacket.pos = dev->rxbuf; 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsTypeL; 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsTypeL: 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsGetSrcId; 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsGetSrcId: 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsGetDstId; 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsGetDstId: 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsGetLenL; 
				//DBGMSG(ZONE_DETAILED_SET, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsGetLenL: 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsGetLenH; 
				dev->rxPacket.len = (buf[i] & 0xff); 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
			case RxsGetLenH: 
				*dev->rxPacket.pos = (buf[i] & 0xff); 
				dev->rxPacket.pos++; 
				dev->rxState = RxsData; 
				dev->rxPacket.len |= ((unsigned short)(buf[i] & 0xff))<<8; 
 
				if(dev->rxPacket.len>RX_PACKET_SIZE) 
				{ 
					dev->rxPacket.len=RX_PACKET_SIZE; 
				} 
				//DataCnt counts the remaining bytes of the message which is the length - the header already taken. 
				dev->rxPacket.cnt = dev->rxPacket.len - 6; 
				missing_bytes = ((dev->rxPacket.cnt - (len - i) + SPI_PACKET_SIZE) & 0xffffff00); 
				if (missing_bytes < 0) 
					missing_bytes = 0; 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d msglen = %d, missing %d .\n"), dev->rxState, dev->rxPacket.cnt, missing_bytes)); 
			break; 
			case RxsData: 
				 
				//copying the Data of the packet  
				TmpLen = len - i; 
				TmpLen = min(TmpLen, dev->rxPacket.cnt); 
				memcpy(dev->rxPacket.pos,&buf[i],TmpLen); 
				//DBGMSG(ZONE_DETAILED, (TEXT("found %d bytes of data.\n"), TmpLen)); 
				//dec Data count 
				dev->rxPacket.cnt-=TmpLen; 
				 
				//inc pos 
				dev->rxPacket.pos+=TmpLen; 
				//setting to end of parsing 
				i += TmpLen;//stop the loop or parse the rest of the packet not copied				 
				//DBGMSG(ZONE_DETAILED, (TEXT("i=%d.\n"),i)); 
				if(dev->rxPacket.cnt == 0)	 
				{					 
					if (dev->msg_found_cb) 
						dev->msg_found_cb(dev->logContext, dev->rxbuf, dev->rxPacket.len); 
					dev->rxState = RxsWait_a5; 
					missing_bytes = 0; 
				}		 
				//DBGMSG(ZONE_DETAILED, (TEXT("state %d.\n"), dev->rxState)); 
			break; 
		} 
	}	 
	//DBGMSG(ZONE_DETAILED, (TEXT("exiting. missing %d bytes\n"), missing_bytes)); 
	return missing_bytes; 
} 
 
void smsspi_common_transfer_msg(struct spi_dev* dev, struct spi_msg* txmsg, int padding_allowed) 
{ 
	int len, bytes_to_transfer; 
	unsigned long tx_phy_addr; 
	int missing_bytes, tx_bytes; 
	char* txbuf; 
	if (!dev->transfer_data_cb) 
	{ 
		DBGMSG(ZONE_ERROR, (TEXT("function called while module is not initialized.\n"))); 
		return; 
	} 
	if (txmsg == NULL || txmsg->buf == NULL) 
	{ 
		bytes_to_transfer = SPI_PACKET_SIZE; 
		txbuf = NULL; 
		tx_phy_addr = 0; 
		tx_bytes = 0; 
	} 
	else 
	{ 
		tx_bytes = txmsg->len; 
		if (padding_allowed) 
			bytes_to_transfer = (((tx_bytes + SPI_PACKET_SIZE - 1) / SPI_PACKET_SIZE) * SPI_PACKET_SIZE); 
		else 
			bytes_to_transfer = (((tx_bytes + 3) >>2) <<2); 
		txbuf = txmsg->buf; 
		tx_phy_addr = txmsg->buf_phy_addr; 
	} 
	while (bytes_to_transfer) 
	{ 
		len = min (bytes_to_transfer, RX_PACKET_SIZE); 
		//DBGMSG(ZONE_INFO, (TEXT("transfering block of %d bytes\n"), len)); 
		dev->transfer_data_cb(dev->phyContext, txbuf, tx_phy_addr, dev->transferRxBuf, (unsigned long)(dev->rxBufPhyAddr), len); 
		missing_bytes = smsspi_common_find_msg(dev, dev->transferRxBuf, len); 
		bytes_to_transfer -= len; 
		txbuf += len; 
		tx_bytes -= len; 
		if (tx_bytes <= 0) 
		{ 
			txbuf = NULL; 
			tx_bytes = 0; 
		} 
		if (bytes_to_transfer < missing_bytes) 
		{ 
			bytes_to_transfer = missing_bytes; 
			//DBGMSG(ZONE_INFO, (TEXT("a message was found, adding bytes to transfer, txmsg %d, total %d\r\n"), tx_bytes, bytes_to_transfer));  
		}		 
	}	 
} 
  
int smsspicommon_init(	struct spi_dev* dev, 
						void* transferRxBuf, 
						unsigned long rxBufPhyAddr, 
						void*	logContext, 
						void*	phyContext, 
						void  (*transfer_data_cb)(void*, unsigned char*, unsigned long, unsigned char*, unsigned long, int), 
						void (*msg_found_cb)(void*, void*, int)) 
{ 
	DBGMSG(ZONE_INFO, (TEXT("entering smsspicommon_init.\n" ))); 
	if (transfer_data_cb == NULL || 
			msg_found_cb == NULL) 
	{ 
		return -1; 
	} 
	dev->logContext = logContext; 
	dev->phyContext = phyContext; 
	dev->transferRxBuf = transferRxBuf; 
	dev->rxBufPhyAddr = rxBufPhyAddr; 
	dev->msg_found_cb = msg_found_cb; 
	dev->transfer_data_cb = transfer_data_cb; 
	dev->rxState = RxsWait_a5; 
	DBGMSG(ZONE_INFO, (TEXT("exiting smsspicommon_init.\n" ))); 
	return 0; 
}