/********************************************************** Prototype void spi_send_msg ( void ) Type function Description Dequeue a spi data from spi_data_queue_XXX_rx Unpack the spi data for ipc, raw or rfs data Send msg to other task until that all queues are empty CP use this functions for other task as below IPC : ipc_cmd_send_queue RAW : data_send_queue RFS : rfs_send_queue Param input (none) Return value (none) ***********************************************************/ void spi_send_msg_to_app(void) { u32 int_cmd = 0; struct ipc_spi *od_spi = NULL; #define MB_VALID 0x0080 #define MB_DATA(x) (MB_VALID | x) #define MBD_SEND_FMT 0x0002 #define MBD_SEND_RAW 0x0001 #define MBD_SEND_RFS 0x0100 od_spi = ipc_spi; if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_IPC_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_FMT); ipc_spi_make_data_interrupt(int_cmd, od_spi); } if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_RAW_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_RAW); ipc_spi_make_data_interrupt(int_cmd, od_spi); } if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_RFS_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_RFS); ipc_spi_make_data_interrupt(int_cmd, od_spi); } }
/* chunk reader */ int conn_chunk_reader(CONN *conn) { int ret = -1, n = -1; CHUNK *cp = NULL; CONN_CHECK_RET(conn, ret); if(conn && conn->chunk) { if(MB_NDATA(conn->buffer) > 0) { if((n = CHUNK_FILL(conn->chunk, MB_DATA(conn->buffer), MB_NDATA(conn->buffer))) > 0) { MB_DEL(conn->buffer, n); } if(CHUNK_STATUS(conn->chunk) == CHUNK_STATUS_OVER ) { conn->s_state = S_STATE_DATA_HANDLING; conn->push_message(conn, MESSAGE_DATA); DEBUG_LOGGER(conn->logger, "Chunk completed %d bytes from %s:%d via %d", CK_SIZE(conn->chunk), conn->ip, conn->port, conn->fd); } if(n > 0) { DEBUG_LOGGER(conn->logger, "Filled %d byte(s) left:%lld to chunk from buffer " "on conn[%s:%d] via %d", n, CK_LEFT(conn->chunk), conn->ip, conn->port, conn->fd); ret = 0; } } } return ret; }
/********************************************************** Prototype void spi_send_msg ( void ) Type function Description Dequeue a spi data from spi_data_queue_XXX_rx Unpack the spi data for ipc, raw or rfs data Send msg to other task until that all queues are empty CP use this functions for other task as below IPC : ipc_cmd_send_queue RAW : data_send_queue RFS : rfs_send_queue Param input (none) Return value (none) ***********************************************************/ void spi_send_msg_to_app(void) { u32 int_cmd; struct ipc_spi *od_spi; od_spi = ipc_spi; if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_IPC_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_FMT); ipc_spi_make_data_interrupt(int_cmd, od_spi); } if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_RAW_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_RAW); ipc_spi_make_data_interrupt(int_cmd, od_spi); } if (spi_data_queue_is_empty(SPI_DATA_QUEUE_TYPE_RFS_RX) == 0) { int_cmd = MB_DATA(MBD_SEND_RFS); ipc_spi_make_data_interrupt(int_cmd, od_spi); } }
/* packet reader */ int conn_packet_reader(CONN *conn) { int len = -1, i = 0; CB_DATA *data = NULL; char *p = NULL, *e = NULL; int packet_type = 0; CONN_CHECK_RET(conn, -1); if(conn) { data = PCB(conn->buffer); packet_type = conn->session.packet_type; DEBUG_LOGGER(conn->logger, "Reading packet type[%d]", packet_type); /* Remove invalid packet type */ if(!(packet_type & PACKET_ALL)) { FATAL_LOGGER(conn->logger, "Unkown packet_type[%d] on %s:%d via %d", packet_type, conn->ip, conn->port, conn->fd); /* Terminate connection */ CONN_TERMINATE(conn); } /* Read packet with customized function from user */ if(packet_type == PACKET_CUSTOMIZED && conn->session.packet_reader) { len = conn->session.packet_reader(conn, data); DEBUG_LOGGER(conn->logger, "Reading packet with customized function[%08x] length[%d] on %s:%d via %d", conn->session.packet_reader, len, conn->ip, conn->port, conn->fd); goto end; } /* Read packet with certain length */ else if(packet_type == PACKET_CERTAIN_LENGTH && MB_NDATA(conn->buffer) >= conn->session.packet_length) { len = conn->session.packet_length; DEBUG_LOGGER(conn->logger, "Reading packet with certain length[%d] on %s:%d via %d", len, conn->ip, conn->port, conn->fd); goto end; } /* Read packet with delimiter */ else if(packet_type == PACKET_DELIMITER && conn->session.packet_delimiter && conn->session.packet_delimiter_length > 0) { p = MB_DATA(conn->buffer); e = MB_END(conn->buffer); i = 0; while(p < e && i < conn->session.packet_delimiter_length ) { if(((char *)conn->session.packet_delimiter)[i++] != *p++) i = 0; if(i == conn->session.packet_delimiter_length) { len = p - MB_DATA(conn->buffer); break; } } DEBUG_LOGGER(conn->logger, "Reading packet with delimiter[%d] " "length[%d] on %s:%d via %d", conn->session.packet_delimiter_length, len, conn->ip, conn->port, conn->fd); goto end; } return len; end: /* Copy data to packet from buffer */ if(len > 0) { MB_RESET(conn->packet); MB_PUSH(conn->packet, MB_DATA(conn->buffer), len); MB_DEL(conn->buffer, len); /* For packet handling */ conn->s_state = S_STATE_PACKET_HANDLING; conn->push_message(conn, MESSAGE_PACKET); } } return len; }