/********************************************************** Prototype void spi_data_queue_init ( void ) Type function Description init buffer and data variable ***********************************************************/ void spi_data_queue_init(void) { int i; void *p_virtual_buff; unsigned int buffer_offset[SPI_DATA_QUEUE_TYPE_NB] = { FMT_OUT, FMT_IN, RAW_OUT, RAW_IN, RFS_OUT, RFS_IN}; p_virtual_buff = ipc_spi_get_queue_buff(); spi_queue = p_virtual_buff+sizeof(struct spi_data_queue)*2; spi_queue_info = (struct spi_data_queue_info *) spi_os_vmalloc( sizeof(struct spi_data_queue_info)*SPI_DATA_QUEUE_TYPE_NB); spi_os_memset(spi_queue_info, 0x00, sizeof(struct spi_data_queue_info)*SPI_DATA_QUEUE_TYPE_NB); spi_div_buf = (struct spi_data_div_buf *) spi_os_vmalloc( sizeof(struct spi_data_div_buf)*SPI_DATA_QUEUE_TYPE_NB); spi_os_memset(spi_div_buf, 0x00, sizeof(struct spi_data_div_buf) *SPI_DATA_QUEUE_TYPE_NB); gspi_data_prepare_packet = (char *) spi_os_vmalloc( SPI_DEV_MAX_PACKET_SIZE); gspi_data_packet_buf = (char *) spi_os_malloc(SPI_DEV_MAX_PACKET_SIZE); for (i = 0 ; i < SPI_DATA_QUEUE_TYPE_NB ; i++) { spi_queue_info[i].header = &spi_queue[i]; switch (i) { case SPI_DATA_QUEUE_TYPE_IPC_TX: case SPI_DATA_QUEUE_TYPE_IPC_RX: spi_queue_info[i].buf_size = SPI_DATA_IPC_QUEUE_SIZE; spi_queue_info[i].type = SPI_DATA_MUX_IPC; spi_div_buf[i].buffer = (char *)spi_os_vmalloc( SPI_DATA_IPC_DIV_BUFFER_SIZE); break; case SPI_DATA_QUEUE_TYPE_RAW_TX: case SPI_DATA_QUEUE_TYPE_RAW_RX: spi_queue_info[i].buf_size = SPI_DATA_RAW_QUEUE_SIZE; spi_queue_info[i].type = SPI_DATA_MUX_RAW; spi_div_buf[i].buffer = (char *)spi_os_vmalloc( SPI_DATA_RAW_DIV_BUFFER_SIZE); break; case SPI_DATA_QUEUE_TYPE_RFS_TX: case SPI_DATA_QUEUE_TYPE_RFS_RX: spi_queue_info[i].buf_size = SPI_DATA_RFS_QUEUE_SIZE; spi_queue_info[i].type = SPI_DATA_MUX_RFS; spi_div_buf[i].buffer = (char *)spi_os_vmalloc( SPI_DATA_RFS_DIV_BUFFER_SIZE); break; } if (spi_queue_info[i].buffer == 0) spi_queue_info[i].buffer = (char *)(p_virtual_buff + buffer_offset[i]); } }
/********************************************************** Prototype void spi_app_receive_msg ( struct spi_os_msg * msg ) Type function Description receive data from spi task message queue and Pack data for spi data. Then inqueue the message to spi_data_queue_XXX_tx Param input msg : message received from other task Return value (none) ***********************************************************/ void spi_receive_msg_from_app(struct spi_os_msg *msg) { enum SPI_MAIN_MSG_T type; enum SPI_DATA_QUEUE_TYPE_T q_type; enum SPI_DATA_TYPE_T mux_type; unsigned int in_length = 0, out_length = 0; void *in_buffer = 0; void *out_buffer = 0; type = msg->signal_code; in_length = msg->data_length; in_buffer = msg->data; switch (type) { case SPI_MAIN_MSG_IPC_SEND: q_type = SPI_DATA_QUEUE_TYPE_IPC_TX; mux_type = SPI_DATA_MUX_IPC; break; case SPI_MAIN_MSG_RAW_SEND: q_type = SPI_DATA_QUEUE_TYPE_RAW_TX; mux_type = SPI_DATA_MUX_RAW; break; case SPI_MAIN_MSG_RFS_SEND: q_type = SPI_DATA_QUEUE_TYPE_RFS_TX; mux_type = SPI_DATA_MUX_RFS; break; default: SPI_OS_ASSERT(("[SPI] spi_app_receive_msg Unknown type")); return; } out_buffer = spi_os_malloc(in_length+SPI_DATA_HEADER_SIZE); out_length = _pack_spi_data(mux_type, out_buffer, in_buffer, in_length); if (spi_data_inqueue(&spi_queue_info[q_type], out_buffer, out_length) == 0) { SPI_OS_ASSERT(("[SPI] spi_app_receive_msg inqueue[%d] Fail", q_type)); } spi_os_free(in_buffer); spi_os_free(out_buffer); }