aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phone_svn/ipc_spi/spi_data.h
blob: 6698bdaf20790cde917c962c14af7d1b0c857166 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#ifndef _SPI_DATA_H_
#define _SPI_DATA_H_

#include "spi_dev.h"

#define SPI_TASK_EVENT_COUNT	64
#define SPI_DATA_BOF			0x7F
#define SPI_DATA_EOF			0x7E
#define SPI_DATA_FF_PADDING_HEADER 0xFFFFFFFF

#define SPI_DATA_MUX_NORMAL_MASK	0x0F
#define SPI_DATA_MUX_MORE_H			0x10
#define SPI_DATA_MUX_MORE_M			0x20
#define SPI_DATA_MUX_MORE_T			0x30

#define SPI_DATA_MUX_SIZE		2
#define SPI_DATA_LENGTH_SIZE	4
#define SPI_DATA_BOF_SIZE		1
#define SPI_DATA_INNER_LENGTH_SIZE	4
#define SPI_DATA_IPC_INNER_LENGTH_SIZE	2
#define SPI_DATA_IPC_INNER_CONTROL_SIZE	1
#define SPI_DATA_EOF_SIZE		1
#define SPI_DATA_HEADER_SIZE	(SPI_DATA_MUX_SIZE+ \
		SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE+SPI_DATA_EOF_SIZE)
#define SPI_DATA_HEADER_SIZE_FRONT	(SPI_DATA_MUX_SIZE+ \
		SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE)
#define SPI_DATA_IPC_INNER_HEADER_SIZE	\
		(SPI_DATA_IPC_INNER_LENGTH_SIZE+ \
		SPI_DATA_IPC_INNER_CONTROL_SIZE)
#define SPI_DATA_SIZE(X)				(SPI_DATA_HEADER_SIZE+X)

#define SPI_DATA_LENGTH_OFFSET	SPI_DATA_MUX_SIZE
#define SPI_DATA_BOF_OFFSET		(SPI_DATA_LENGTH_OFFSET+ \
		SPI_DATA_LENGTH_SIZE)
#define SPI_DATA_DATA_OFFSET		(SPI_DATA_BOF_OFFSET+ \
		SPI_DATA_BOF_SIZE)
#define SPI_DATA_EOF_OFFSET(X)		(SPI_DATA_DATA_OFFSET+X)

#define SPI_DATA_PACKET_HEADER_SIZE	                 4
#define SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE		 4
#define SPI_DATA_PACKET_MAX_PACKET_BODY_SIZE \
		(SPI_DEV_MAX_PACKET_SIZE-SPI_DATA_PACKET_HEADER_SIZE- \
		SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE)

#define SPI_DATA_MIN_SIZE		(SPI_DATA_HEADER_SIZE*2)
#define SPI_DATA_MAX_SIZE_PER_PACKET (SPI_DEV_MAX_PACKET_SIZE- \
		SPI_DATA_PACKET_HEADER_SIZE-SPI_DATA_HEADER_SIZE- \
		SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE)
#define SPI_DATA_MAX_COUNT_PER_PACKET		 240

#define SPI_DATA_IPC_QUEUE_SIZE	0x10000
#define SPI_DATA_RAW_QUEUE_SIZE	0x100000
#define SPI_DATA_RFS_QUEUE_SIZE	0x100000

#define SPI_DATA_IPC_DIV_BUFFER_SIZE	0x1000
#define SPI_DATA_RAW_DIV_BUFFER_SIZE	0x1000
#define SPI_DATA_RFS_DIV_BUFFER_SIZE	0x1000

#define SPI_DATA_DIVIDE_BUFFER_SIZE SPI_DEV_MAX_PACKET_SIZE



enum SPI_DATA_TYPE_T {
	SPI_DATA_MUX_IPC			= 0x01,
	SPI_DATA_MUX_RAW			= 0x02,
	SPI_DATA_MUX_RFS			= 0x03,
	SPI_DATA_MUX_CMD			= 0x04,
};

struct spi_data_packet_header {
	/* 12bit : packet size less than SPI_DEV_PACKET_SIZE */
	unsigned long current_data_size:31;
	/* 1bit : packet division flag */
	unsigned long more:1;
};

enum SPI_DATA_QUEUE_TYPE_T {
	SPI_DATA_QUEUE_TYPE_IPC_TX,	/* 0 : formatted(IPC) tx buffer */
	SPI_DATA_QUEUE_TYPE_IPC_RX,	/* 1 : formatted(IPC) rx buffer */
	SPI_DATA_QUEUE_TYPE_RAW_TX,	/* 2 : raw tx buffer */
	SPI_DATA_QUEUE_TYPE_RAW_RX,	/* 3 : raw rx buffer */
	SPI_DATA_QUEUE_TYPE_RFS_TX,	/* 4 : rfs tx buffer */
	SPI_DATA_QUEUE_TYPE_RFS_RX,	/* 5 : rfs rx buffer */
	SPI_DATA_QUEUE_TYPE_NB		/* 6 : number of buffer */
};

struct spi_data_queue {
	unsigned int tail; /* circular queue header */
	unsigned int head; /* circular queue tail */
};

struct spi_data_queue_info {
	struct spi_data_queue *header;
	enum SPI_DATA_TYPE_T type;
	unsigned int buf_size; /* queue size */
	char *buffer; /* queue data */
};

struct spi_data_div_buf {
	unsigned int	length;
	char *buffer;		 /* queue data */
};

extern void *ipc_spi_get_queue_buff(void);

extern struct spi_data_queue *spi_data_queue;
extern struct spi_data_queue_info	 *spi_queue_info;
extern char *gspi_data_packet_buf;

extern void spi_data_queue_init(void);
extern void spi_data_queue_destroy(void);
extern unsigned int spi_data_dequeue(struct spi_data_queue_info *queue_info,
		void *pdata);
extern int spi_data_inqueue(struct spi_data_queue_info *queue, void *data,
		unsigned int length);
extern void spi_data_msg_inqueuefront(enum SPI_MAIN_MSG_T task_msg);
extern int spi_data_queue_is_empty(enum SPI_DATA_QUEUE_TYPE_T type);
extern int spi_data_div_buf_is_empty(enum SPI_DATA_QUEUE_TYPE_T type);
extern int spi_data_check_tx_queue(void);

extern int spi_data_prepare_tx_packet(void *buf);
extern int spi_data_parsing_rx_packet(void *buf, unsigned int length);

extern void spi_data_print_raw_data(void *data, unsigned int length);
#endif