1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_CSI2_CSI2_REVA_H_
22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_CSI2_CSI2_REVA_H_
23 
24 /****** Includes *******/
25 #include <stdint.h>
26 #include "csi2.h"
27 #include "dma.h"
28 #include "dma_reva.h"
29 #include "csi2_reva_regs.h"
30 
31 /***** Definitions *****/
32 
33 /**
34  * @brief   Enumeration type for the CSI-2 FIFO Triggers.
35  */
36 typedef enum {
37     MXC_CSI2_REVA_FF_TRIG_NO_TRIGGER = 0, ///< No FIFO Trigger
38     MXC_CSI2_REVA_FF_TRIG_NOT_EMPTY = MXC_F_CSI2_REVA_RX_EINT_VFF_IF_FNEMPTY, ///< FIFO Not Empty
39     MXC_CSI2_REVA_FF_TRIG_ABV_THD = MXC_F_CSI2_REVA_RX_EINT_VFF_IF_FTHD, ///< FIFO Above Threshold
40     MXC_CSI2_REVA_FF_TRIG_FULL = MXC_F_CSI2_REVA_RX_EINT_VFF_IF_FFULL, ///< FIFO Full
41 } mxc_csi2_reva_fifo_trig_t;
42 
43 typedef struct {
44     bool success;
45     uint32_t ctrl_err;
46     uint32_t ppi_err;
47     uint32_t vfifo_err;
48     size_t frame_size;
49     size_t bytes_captured;
50 } mxc_csi2_reva_capture_stats_t;
51 
52 /******* Globals *******/
53 
54 /****** Functions ******/
55 
56 /******************************************/
57 /* Global Control/Configuration Functions */
58 /******************************************/
59 
60 int MXC_CSI2_RevA_Init(mxc_csi2_reva_regs_t *csi2, mxc_csi2_req_t *req,
61                        mxc_csi2_ctrl_cfg_t *ctrl_cfg, mxc_csi2_vfifo_cfg_t *vfifo_cfg);
62 
63 int MXC_CSI2_RevA_Shutdown(mxc_csi2_reva_regs_t *csi2);
64 
65 int MXC_CSI2_RevA_Start(mxc_csi2_reva_regs_t *csi2, int num_data_lanes);
66 
67 int MXC_CSI2_RevA_Stop(mxc_csi2_reva_regs_t *csi2);
68 
69 int MXC_CSI2_RevA_CaptureFrameDMA();
70 
71 int MXC_CSI2_RevA_SetLaneCtrlSource(mxc_csi2_reva_regs_t *csi2, mxc_csi2_lane_src_t *src);
72 
73 int MXC_CSI2_RevA_GetLaneCtrlSource(mxc_csi2_reva_regs_t *csi2, mxc_csi2_lane_src_t *src);
74 
75 void MXC_CSI2_RevA_GetImageDetails(uint32_t *imgLen, uint32_t *w, uint32_t *h);
76 
77 int MXC_CSI2_RevA_Callback(mxc_csi2_req_t *req, int retVal);
78 
79 void MXC_CSI2_RevA_Handler();
80 
81 /********************************/
82 /* CSI2 RX Controller Functions */
83 /********************************/
84 
85 int MXC_CSI2_RevA_CTRL_Config(mxc_csi2_reva_regs_t *csi2, mxc_csi2_ctrl_cfg_t *cfg);
86 
87 void MXC_CSI2_RevA_CTRL_EnableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask);
88 
89 void MXC_CSI2_RevA_CTRL_DisableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask);
90 
91 int MXC_CSI2_RevA_CTRL_GetFlags(mxc_csi2_reva_regs_t *csi2);
92 
93 void MXC_CSI2_RevA_CTRL_ClearFlags(mxc_csi2_reva_regs_t *csi2, uint32_t flags);
94 
95 /************************/
96 /* CSI2 VFIFO Functions */
97 /************************/
98 
99 int MXC_CSI2_RevA_VFIFO_Config(mxc_csi2_reva_regs_t *csi2, mxc_csi2_vfifo_cfg_t *cfg);
100 
101 int MXC_CSI2_RevA_VFIFO_ProcessRAWtoRGB(mxc_csi2_reva_regs_t *csi2, mxc_csi2_req_t *req);
102 
103 int MXC_CSI2_RevA_VFIFO_NextFIFOTrigMode(mxc_csi2_reva_regs_t *csi2, uint8_t ff_not_empty,
104                                          uint8_t ff_abv_thd, uint8_t ff_full);
105 
106 void MXC_CSI2_RevA_VFIFO_EnableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask, uint32_t edge);
107 
108 void MXC_CSI2_RevA_VFIFO_ChangeIntMode(mxc_csi2_reva_regs_t *csi2, uint32_t mask, uint32_t edge);
109 
110 void MXC_CSI2_RevA_VFIFO_DisableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask);
111 
112 int MXC_CSI2_RevA_VFIFO_GetFlags(mxc_csi2_reva_regs_t *csi2);
113 
114 void MXC_CSI2_RevA_VFIFO_ClearFlags(mxc_csi2_reva_regs_t *csi2, uint32_t flags);
115 
116 int MXC_CSI2_RevA_VFIFO_Enable(mxc_csi2_reva_regs_t *csi2);
117 
118 int MXC_CSI2_RevA_VFIFO_Disable(mxc_csi2_reva_regs_t *csi2);
119 
120 int MXC_CSI2_RevA_VFIFO_SetPayloadType(mxc_csi2_reva_regs_t *csi2, mxc_csi2_payload0_t payload0,
121                                        mxc_csi2_payload1_t payload1);
122 
123 int MXC_CSI2_RevA_VFIFO_GetPayloadType(mxc_csi2_reva_regs_t *csi2, uint32_t *payload0,
124                                        uint32_t *payload1);
125 
126 int MXC_CSI2_RevA_VFIFO_SetDMAMode(mxc_csi2_reva_regs_t *csi2, mxc_csi2_dma_mode_t dma_mode);
127 
128 mxc_csi2_dma_mode_t MXC_CSI2_RevA_VFIFO_GetDMAMode(mxc_csi2_reva_regs_t *csi2);
129 
130 int MXC_CSI2_RevA_VFIFO_SetRGBType(mxc_csi2_reva_regs_t *csi2, mxc_csi2_rgb_type_t rgb_type);
131 
132 mxc_csi2_rgb_type_t MXC_CSI2_RevA_VFIFO_GetRGBType(mxc_csi2_reva_regs_t *csi2);
133 
134 int MXC_CSI2_RevA_VFIFO_SetRAWFormat(mxc_csi2_reva_regs_t *csi2, mxc_csi2_raw_format_t raw_format);
135 
136 mxc_csi2_raw_format_t MXC_CSI2_RevA_VFIFO_GetRAWFormat(mxc_csi2_reva_regs_t *csi2);
137 
138 int MXC_CSI2_RevA_VFIFO_GetFIFOEntityCount(mxc_csi2_reva_regs_t *csi2);
139 
140 void MXC_CSI2_RevA_VFIFO_SetAHBWait(mxc_csi2_reva_regs_t *csi2, mxc_csi2_ahbwait_t wait_en);
141 
142 mxc_csi2_ahbwait_t MXC_CSI2_RevA_VFIFO_GetAHBWait(mxc_csi2_reva_regs_t *csi2);
143 
144 /***********************************************/
145 /* CSI2 PHY Protocol Interface (PPI) Functions */
146 /***********************************************/
147 
148 void MXC_CSI2_RevA_PPI_EnableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask);
149 
150 void MXC_CSI2_RevA_PPI_DisableInt(mxc_csi2_reva_regs_t *csi2, uint32_t mask);
151 
152 int MXC_CSI2_RevA_PPI_GetFlags(mxc_csi2_reva_regs_t *csi2);
153 
154 void MXC_CSI2_RevA_PPI_ClearFlags(mxc_csi2_reva_regs_t *csi2, uint32_t flags);
155 
156 int MXC_CSI2_RevA_PPI_Stop(void);
157 
158 /************************************/
159 /* CSI2 DMA - Used for all features */
160 /************************************/
161 
162 mxc_csi2_reva_capture_stats_t MXC_CSI2_RevA_DMA_GetCaptureStats();
163 
164 bool MXC_CSI2_RevA_DMA_Frame_Complete(void);
165 
166 int MXC_CSI2_RevA_DMA_Config(uint8_t *dst_addr, uint32_t byte_cnt, uint32_t burst_size);
167 
168 int MXC_CSI2_RevA_DMA_GetChannel(void);
169 
170 int MXC_CSI2_RevA_DMA_GetCurrentLineCnt(void);
171 
172 int MXC_CSI2_RevA_DMA_GetCurrentFrameEndCnt(void);
173 
174 void MXC_CSI2_RevA_DMA_Callback();
175 
176 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_CSI2_CSI2_REVA_H_
177