summaryrefslogtreecommitdiff
path: root/vmeta_lib.h
blob: 3c44412ebcc733e26065b7342f0dde4e340cd602 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef VDEC_OS_DRIVER_H
#define VDEC_OS_DRIVER_H
#include <sys/poll.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define VDEC_DEBUG_ALL 0x1
#define VDEC_DEBUG_MEM 0x2
#define VDEC_DEBUG_NONE 0x80

#define UIO_DEV "/dev/uio0"
#define UIO_IO_MEM_SIZE "/sys/class/uio/uio0/maps/map0/size"
#define UIO_IO_MEM_ADDR "/sys/class/uio/uio0/maps/map0/addr"

//---------------------------------------------------------------------------
// Macros
//---------------------------------------------------------------------------
#ifndef UNSG32
#define UNSG32 unsigned int
#endif

#ifndef SIGN32
#define SIGN32 int
#endif

#ifndef UNSG16
#define UNSG16 unsigned short
#endif

#ifndef SIGN16
#define SIGN16 short
#endif

#ifndef UNSG8
#define UNSG8 unsigned char
#endif

enum dma_data_direction {
	DMA_BIDIRECTIONAL = 0,
	DMA_TO_DEVICE = 1,
	DMA_FROM_DEVICE = 2,
	DMA_NONE = 3,
};

//---------------------------------------------------------------------------
// Driver initialization API
//---------------------------------------------------------------------------
SIGN32 vdec_os_driver_init(void);
SIGN32 vdec_os_driver_clean(void);

//---------------------------------------------------------------------------
// Memory operation API
//---------------------------------------------------------------------------
void * vdec_os_api_dma_alloc(UNSG32 size, UNSG32 align, UNSG32 * pPhysical);
void * vdec_os_api_dma_alloc_writecombine(UNSG32 size, UNSG32 align, UNSG32 * pPhysical);
void * vdec_os_api_dma_alloc_cached(UNSG32 size, UNSG32 align, UNSG32 * pPhysical);

void vdec_os_api_dma_free(void *ptr);
void *vdec_os_api_vmalloc(UNSG32 size, UNSG32 align);		// always return VA and can't be translated to PA
void vdec_os_api_vfree(void *ptr);
UNSG32 vdec_os_api_get_va(UNSG32 paddr);
UNSG32 vdec_os_api_get_pa(UNSG32 vaddr);

UNSG32 vdec_os_api_flush_cache(UNSG32 vaddr, UNSG32 size, enum dma_data_direction direction);

//---------------------------------------------------------------------------
// Mem/IO R/W API
//---------------------------------------------------------------------------
UNSG8 vdec_os_api_rd8(UNSG32 addr);
UNSG16 vdec_os_api_rd16(UNSG32 addr);
UNSG32 vdec_os_api_rd32(UNSG32 addr);
void vdec_os_api_wr8(UNSG32 addr, UNSG8 data);
void vdec_os_api_wr16(UNSG32 addr, UNSG16 data);
void vdec_os_api_wr32(UNSG32 addr, UNSG32 data);
UNSG32 vdec_os_api_get_regbase_addr(void);			// return VA

//---------------------------------------------------------------------------
// Interrupt register API
//---------------------------------------------------------------------------
SIGN32 vdec_os_api_set_sync_timeout_isr(UNSG32 timeout);
SIGN32 vdec_os_api_sync_event();

//---------------------------------------------------------------------------
// Power Management API
//---------------------------------------------------------------------------
void vdec_os_api_power_on(void);
void vdec_os_api_power_off(void);
SIGN32 vdec_os_api_suspend_check(void);
void vdec_os_api_suspend_ready(void);

typedef enum _VPRO_CODEC_ERROR_CODE_ {
	VDEC_OS_DRIVER_OK = 0,
	VDEC_OS_DRIVER_INIT_FAIL,
	VDEC_OS_DRIVER_OPEN_FAIL,
	VDEC_OS_DRIVER_NO_SYS_MEM_FAIL,
	VDEC_OS_DRIVER_MEM_POOL_INIT_FAIL,
	VDEC_OS_DRIVER_MMAP_FAIL,
	VDEC_OS_DRIVER_SYNC_TIMEOUT_FAIL,
	VDEC_OS_DRIVER_IO_CONTROL_FAIL,
	VDEC_OS_DRIVER_ALREADY_INIT_FAIL,
	VDEC_OS_DRIVER_CLEAN_FAIL
}VPRO_DEC_ERROR_CODE;

/*************************
 *   Vmeta ioctl Define   *
 *************************/
#define IOP_MAGIC       'v'
		   
#define UIO_VPRO_IRQ_ENABLE		_IO(IOP_MAGIC, 2)
#define UIO_VPRO_IRQ_DISABLE		_IO(IOP_MAGIC, 3)
#define UIO_VPRO_XV_IN_QUEUE		_IOW(IOP_MAGIC, 4, struct vpro_xv_frame)	// used for vpro decoder to put a video frame in queue
#define UIO_VPRO_XV_DQUEUE		_IOR(IOP_MAGIC, 5, struct vpro_xv_frame)	// used for vpro decoder to free a video frame in queue
#define UIO_VPRO_XV_QUERY_VIDEO		_IOR(IOP_MAGIC, 6, struct vpro_xv_frame)        // used for vo xv interface to query a video frame that from vpro
#define UIO_VPRO_XV_FREE_VIDEO		_IOW(IOP_MAGIC, 7, struct vpro_xv_frame)        // used for vo xv interface to free a video frame
#define UIO_VPRO_XV_INIT_QUEUE 		_IO(IOP_MAGIC, 8)
#define UIO_VMETA_POWER_ON		_IO(IOP_MAGIC, 9)
#define UIO_VMETA_POWER_OFF		_IO(IOP_MAGIC, 10)
#define UIO_VMETA_SUSPEND_CHECK		_IOR(IOP_MAGIC, 11, int)
#define UIO_VMETA_SUSPEND_READY		_IO(IOP_MAGIC, 12)

/* display debug message */
int dbg_printf(UNSG32 dbglevel, const char* format, ...);

//---------------------------------------------------------------------------
// the control block of vdec os driver
//---------------------------------------------------------------------------
typedef struct vdec_os_driver_cb_s
{
	int uiofd;			// the uio file descriptor
	UNSG32 io_mem_phy_addr;		// the physical addr of io register base
	SIGN32 io_mem_virt_addr;	// the reg base addr that maped from kernel
	UNSG32 io_mem_size;		// the size of io mem area
	int refcount;			// reference count
} vdec_os_driver_cb_t;

/* vdec driver get cb */
vdec_os_driver_cb_t *vdec_driver_get_cb(void);


#ifdef __cplusplus
}
#endif
#endif