www.pudn.com > DMBDRV.rar > smsspicommon.c
#include "smsspicommon.h" #include "SianoSPI.h" #includestatic 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;i rxState) { 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; }