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
|
/*
* csi_driver
* 12/05/2010
* Synopsys Inc. PT02
*/
#ifndef CSI_DRIVER_H_
#define CSI_DRIVER_H_
#include "csi_types.h"
//#define CURRENT_VERSION 0x3130302A
#ifdef __SIMULATOR__
#define CURRENT_VERSION 0
#else // __SIMULATOR__
#define CURRENT_VERSION 0x3130332A
#endif // __SIMULATOR__
#define PHY_TESTCLR 0
#define PHY_TESTCLK 1
#define PHY_TESTDIN 0
#define PHY_TESTDOUT 8
#define PHY_TESTEN 16
#define PHY_TESTDIN_W 8
#define PHY_TESTDOUT_W 8
#define CSI_PCLK_CFG_COUNTER 29
typedef enum
{
VERSION = 0x00,
N_LANES = 0x04,
PHY_SHUTDOWNZ = 0x08,
DPHY_RSTZ = 0x0C,
CSI2_RESETN = 0x10,
PHY_STATE = 0x14,
DATA_IDS_1 = 0x18,
DATA_IDS_2 = 0x1C,
ERR1 = 0x20,
ERR2 = 0x24,
MASK1 = 0x28,
MASK2 = 0x2C,
PHY_TST_CRTL0 = 0x30,
PHY_TST_CRTL1 = 0x34
} csi_registers_t;
typedef enum
{
CSI_LANE_OFF = 0,
CSI_LANE_ON,
CSI_LANE_ULTRA_LOW_POWER,
CSI_LANE_STOP,
CSI_LANE_HIGH_SPEED
} csi_lane_state_t;
typedef enum
{
ERR_NOT_INIT = 0xFE,
ERR_ALREADY_INIT = 0xFD,
ERR_NOT_COMPATIBLE = 0xFC,
ERR_UNDEFINED = 0xFB,
ERR_OUT_OF_BOUND = 0xFA,
SUCCESS = 0
} csi_error_t;
typedef enum
{
NULL_PACKET = 0x10,
BLANKING_DATA = 0x11,
EMBEDDED_8BIT_NON_IMAGE_DATA = 0x12,
YUV420_8BIT = 0x18,
YUV420_10BIT = 0x19,
LEGACY_YUV420_8BIT = 0x1A,
YUV420_8BIT_CHROMA_SHIFTED = 0x1C,
YUV420_10BIT_CHROMA_SHIFTED = 0x1D,
YUV422_8BIT = 0x1E,
YUV422_10BIT = 0x1F,
RGB444 = 0x20,
RGB555 = 0x21,
RGB565 = 0x22,
RGB666 = 0x23,
RGB888 = 0x24,
RAW6 = 0x28,
RAW7 = 0x29,
RAW8 = 0x2A,
RAW10 = 0x2B,
RAW12 = 0x2C,
RAW14 = 0x2D,
USER_DEFINED_8BIT_DATA_TYPE_1 = 0x30,
USER_DEFINED_8BIT_DATA_TYPE_2 = 0x31,
USER_DEFINED_8BIT_DATA_TYPE_3 = 0x32,
USER_DEFINED_8BIT_DATA_TYPE_4 = 0x33,
USER_DEFINED_8BIT_DATA_TYPE_5 = 0x34,
USER_DEFINED_8BIT_DATA_TYPE_6 = 0x35,
USER_DEFINED_8BIT_DATA_TYPE_7 = 0x36,
USER_DEFINED_8BIT_DATA_TYPE_8 = 0x37
} csi_data_type_t;
struct csi_pclk_cfg {
u32 pclk_start;
u32 pclk_end;
u8 hsfreqrange;
u8 hsrxthssettle;
};
void dphy_init(u32 bps_per_lane, u32 phy_id);
u8 csi_init(u64 base_address);
u8 csi_close(void);
u8 csi_get_on_lanes(void);
u8 csi_set_on_lanes(u8 lanes);
u8 csi_shut_down_phy(u8 shutdown);
u8 csi_reset_phy(void);
u8 csi_reset_controller(void);
csi_lane_state_t csi_lane_module_state(u8 lane);
csi_lane_state_t csi_clk_state(void);
u8 csi_payload_bypass(u8 on);
u8 csi_register_line_event(u8 virtual_channel_no, csi_data_type_t data_type, u8 offset);
u8 csi_unregister_line_event(u8 offset);
u8 csi_get_registered_line_event(u8 offset);
u8 csi_event_disable(u32 mask, u8 err_reg_no);
u8 csi_event_enable(u32 mask, u8 err_reg_no);
u32 csi_event_get_source(u8 err_reg_no);
/******************************************************************************
* register access methods
******************************************************************************/
u32 csi_core_read(csi_registers_t address);
u8 csi_core_write(csi_registers_t address, u32 data);
u8 csi_core_write_part(csi_registers_t address, u32 data, u8 shift, u8 width);
u32 csi_core_read_part(csi_registers_t address, u8 shift, u8 width);
#endif /* CSI_DRIVER_H_ */
|