コード例 #1
0
/**********************************************************

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]);
	}
}
コード例 #2
0
/**********************************************************
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);
}