1 //*****************************************************************************
2 //
3 //! @file am_hal_dsi.h
4 //!
5 //! @brief Hardware abstraction for the Display Serial Interface
6 //!
7 //! @addtogroup dsi_4p DSI - Display Serial Interface
8 //! @ingroup apollo4p_hal
9 //! @{
10 //
11 //*****************************************************************************
12 
13 //*****************************************************************************
14 //
15 // Copyright (c) 2023, Ambiq Micro, Inc.
16 // All rights reserved.
17 //
18 // Redistribution and use in source and binary forms, with or without
19 // modification, are permitted provided that the following conditions are met:
20 //
21 // 1. Redistributions of source code must retain the above copyright notice,
22 // this list of conditions and the following disclaimer.
23 //
24 // 2. Redistributions in binary form must reproduce the above copyright
25 // notice, this list of conditions and the following disclaimer in the
26 // documentation and/or other materials provided with the distribution.
27 //
28 // 3. Neither the name of the copyright holder nor the names of its
29 // contributors may be used to endorse or promote products derived from this
30 // software without specific prior written permission.
31 //
32 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
33 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
36 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
37 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
38 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
40 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 // POSSIBILITY OF SUCH DAMAGE.
43 //
44 // This is part of revision stable-7da8bae71f of the AmbiqSuite Development Package.
45 //
46 //*****************************************************************************
47 
48 #ifndef AM_HAL_DSI_H
49 #define AM_HAL_DSI_H
50 
51 #ifdef __cplusplus
52 extern "C"
53 {
54 #endif
55 
56 //*****************************************************************************
57 //
58 // DSI error codes.
59 //
60 //*****************************************************************************
61 /*typedef enum
62 {
63     AM_HAL_DSI_INT_STATUS_RX_START_TRANS_ERROR = AM_HAL_STATUS_MODULE_SPECIFIC_START,
64     AM_HAL_DSI_INT_STATUS_RX_START_TRANS_SYNC_ERROR,
65     AM_HAL_DSI_INT_STATUS_RX_END_TRANS_SYNC_ERROR,
66     AM_HAL_DSI_INT_STATUS_RX_ESCAPE_ENTRY_ERROR,
67     AM_HAL_DSI_INT_STATUS_RX_LP_TX_SYNC_ERROR,
68     AM_HAL_DSI_INT_STATUS_RX_PERIPH_TIMEOUT_ERROR,
69     AM_HAL_DSI_INT_STATUS_RX_FALSE_CONTROL_ERROR,
70     AM_HAL_DSI_INT_STATUS_RX_ECC_SINGLE_BIT_ERROR,
71     AM_HAL_DSI_INT_STATUS_RX_ECC_MULTI_BIT_ERROR,
72     AM_HAL_DSI_INT_STATUS_START_TRANS_SYNC_ERROR,
73 
74 }
75 am_hal_dsi_interrupt_status_t;*/
76 
77 //*****************************************************************************
78 //
79 //! DSI clock lane frequency.
80 //
81 //*****************************************************************************
82 typedef enum
83 {
84     AM_HAL_DSI_FREQ_TRIM_X1  = 0x40,
85     AM_HAL_DSI_FREQ_TRIM_X2  = 0x01,
86     AM_HAL_DSI_FREQ_TRIM_X3  = 0x41,
87     AM_HAL_DSI_FREQ_TRIM_X4  = 0x02,
88     AM_HAL_DSI_FREQ_TRIM_X5  = 0x42,
89     AM_HAL_DSI_FREQ_TRIM_X6  = 0x03,
90     AM_HAL_DSI_FREQ_TRIM_X7  = 0x43,
91     AM_HAL_DSI_FREQ_TRIM_X8  = 0x04,
92     AM_HAL_DSI_FREQ_TRIM_X9  = 0x44,
93     AM_HAL_DSI_FREQ_TRIM_X10 = 0x05,
94     AM_HAL_DSI_FREQ_TRIM_X11 = 0x45,
95     AM_HAL_DSI_FREQ_TRIM_X12 = 0x06,
96     AM_HAL_DSI_FREQ_TRIM_X13 = 0x46,
97     AM_HAL_DSI_FREQ_TRIM_X14 = 0x07,
98     AM_HAL_DSI_FREQ_TRIM_X15 = 0x47,
99     AM_HAL_DSI_FREQ_TRIM_X16 = 0x08,
100     AM_HAL_DSI_FREQ_TRIM_X17 = 0x48,
101     AM_HAL_DSI_FREQ_TRIM_X18 = 0x09,
102     AM_HAL_DSI_FREQ_TRIM_X19 = 0x49,
103     AM_HAL_DSI_FREQ_TRIM_X20 = 0x0A,
104     AM_HAL_DSI_FREQ_TRIM_X21 = 0x4A,
105     AM_HAL_DSI_FREQ_TRIM_X22 = 0x0B,
106     AM_HAL_DSI_FREQ_TRIM_X23 = 0x4B,
107     AM_HAL_DSI_FREQ_TRIM_X24 = 0x0C,
108     AM_HAL_DSI_FREQ_TRIM_X25 = 0x4C,
109     AM_HAL_DSI_FREQ_TRIM_X26 = 0x0D,
110     AM_HAL_DSI_FREQ_TRIM_X27 = 0x4D,
111     AM_HAL_DSI_FREQ_TRIM_X28 = 0x0E,
112     AM_HAL_DSI_FREQ_TRIM_X29 = 0x4E,
113     AM_HAL_DSI_FREQ_TRIM_X30 = 0x0F,
114     AM_HAL_DSI_FREQ_TRIM_X31 = 0x4F,
115     AM_HAL_DSI_FREQ_TRIM_X32 = 0x10,
116     AM_HAL_DSI_FREQ_TRIM_X33 = 0x50,
117     AM_HAL_DSI_FREQ_TRIM_X34 = 0x11,
118     AM_HAL_DSI_FREQ_TRIM_X35 = 0x51,
119     AM_HAL_DSI_FREQ_TRIM_X36 = 0x12,
120     AM_HAL_DSI_FREQ_TRIM_X37 = 0x52,
121     AM_HAL_DSI_FREQ_TRIM_X38 = 0x13,
122     AM_HAL_DSI_FREQ_TRIM_X39 = 0x53,
123     AM_HAL_DSI_FREQ_TRIM_X40 = 0x14,
124     AM_HAL_DSI_FREQ_TRIM_X41 = 0x54,
125     AM_HAL_DSI_FREQ_TRIM_X42 = 0x15,
126     AM_HAL_DSI_FREQ_TRIM_X43 = 0x55,
127     AM_HAL_DSI_FREQ_TRIM_X44 = 0x16,
128     AM_HAL_DSI_FREQ_TRIM_X45 = 0x56,
129     AM_HAL_DSI_FREQ_TRIM_X46 = 0x17,
130     AM_HAL_DSI_FREQ_TRIM_X47 = 0x57,
131     AM_HAL_DSI_FREQ_TRIM_X48 = 0x18,
132     AM_HAL_DSI_FREQ_TRIM_X49 = 0x58,
133     AM_HAL_DSI_FREQ_TRIM_X50 = 0x19,
134     AM_HAL_DSI_FREQ_TRIM_X51 = 0x59,
135     AM_HAL_DSI_FREQ_TRIM_X52 = 0x1A,
136     AM_HAL_DSI_FREQ_TRIM_X53 = 0x5A,
137     AM_HAL_DSI_FREQ_TRIM_X54 = 0x1B,
138     AM_HAL_DSI_FREQ_TRIM_X55 = 0x5B,
139     AM_HAL_DSI_FREQ_TRIM_X56 = 0x1C,
140     AM_HAL_DSI_FREQ_TRIM_X57 = 0x5C,
141     AM_HAL_DSI_FREQ_TRIM_X58 = 0x1D,
142     AM_HAL_DSI_FREQ_TRIM_X59 = 0x5D,
143     AM_HAL_DSI_FREQ_TRIM_X60 = 0x1E,
144     AM_HAL_DSI_FREQ_TRIM_X61 = 0x5E,
145     AM_HAL_DSI_FREQ_TRIM_X62 = 0x1F,
146     AM_HAL_DSI_FREQ_TRIM_X63 = 0x5F,
147 } am_hal_dsi_freq_trim_e;
148 
149 //*****************************************************************************
150 //
151 //! DBI to DSI: DBI data width.
152 //
153 //*****************************************************************************
154 typedef enum
155 {
156     AM_HAL_DSI_DBI_WIDTH_8  = 8,
157     AM_HAL_DSI_DBI_WIDTH_16 = 16,
158 } am_hal_dsi_dbi_width_e;
159 
160 //*****************************************************************************
161 //
162 //! DSI command type.
163 //
164 //*****************************************************************************
165 typedef enum
166 {
167     DCS_CMD = 0,
168     GE_CMD
169 } am_hal_dsi_cmd_type_e;
170 
171 //*****************************************************************************
172 //
173 //! DSI high speed mode and low power mode.
174 //
175 //*****************************************************************************
176 typedef enum
177 {
178     LP_MODE = 0,
179     HS_MODE
180 } am_hal_dsi_speed_e;
181 
182 //*****************************************************************************
183 //
184 //! @brief DSI external VDD18 power rail control callback function pointer type
185 //!
186 //! The BSP shall provide callback functions to control DSI external VDD18 power
187 //! rail.
188 //
189 //*****************************************************************************
190 typedef void (*am_hal_dsi_external_vdd18_callback)(bool bEnable);
191 
192 //*****************************************************************************
193 //
194 // External functions.
195 //
196 //*****************************************************************************
197 //*****************************************************************************
198 //
199 //! @brief Register external VDD18 callback function
200 //!
201 //! @param cb is pointer of VDD18 control function.
202 //!
203 //! This function should be called before DSI init and deinit.
204 //!
205 //! @return AM_HAL_STATUS_SUCCESS
206 //
207 //*****************************************************************************
208 extern uint32_t am_hal_dsi_register_external_vdd18_callback(const am_hal_dsi_external_vdd18_callback cb);
209 
210 //*****************************************************************************
211 //
212 //! @brief DSI configuration
213 //!
214 //! @param ui8LanesNum          - Number of lanes.
215 //! @param ui8DBIBusWidth       - Width of DBI bus.
216 //! @param ui32FreqTrim         - DPHY output frequency trim.
217 //! @param bSendUlpsPattern     - Unused parameter
218 //!
219 //! This function should be called after DSI power is enabled.
220 //!
221 //! @return AM_HAL_STATUS_SUCCESS
222 //
223 //*****************************************************************************
224 extern uint32_t am_hal_dsi_para_config(uint8_t ui8LanesNum,
225                                        uint8_t ui8DBIBusWidth,
226                                        uint32_t ui32FreqTrim,
227                                        bool bSendUlpsPattern);
228 
229 //*****************************************************************************
230 //
231 //! @brief DSI initialization
232 //!
233 //! Configure power and clock of DSI.
234 //!
235 //! @return AM_HAL_STATUS_SUCCESS
236 //
237 //*****************************************************************************
238 extern uint32_t am_hal_dsi_init(void);
239 
240 //*****************************************************************************
241 //
242 //! @brief DSI deinit
243 //!
244 //! Turn off power and clock of DSI.
245 //!
246 //! @return AM_HAL_STATUS_SUCCESS
247 //
248 //*****************************************************************************
249 extern uint32_t am_hal_dsi_deinit(void);
250 
251 //*****************************************************************************
252 //
253 //! @brief DSI configuration
254 //!
255 //! @param ui32FreqTrim         - DPHY output frequency trim.
256 //!
257 //! Configure DSI frequency and timing
258 //!
259 //! @return AM_HAL_STATUS_SUCCESS
260 //
261 //*****************************************************************************
262 extern uint32_t am_hal_dsi_timing(uint32_t ui32FreqTrim);
263 
264 //*****************************************************************************
265 //
266 //! @brief DSI state
267 //!
268 //! ULPS mode entry
269 //!
270 //! @return AM_HAL_STATUS_SUCCESS
271 //
272 //*****************************************************************************
273 extern uint32_t am_hal_dsi_ulps_entry(void);
274 
275 //*****************************************************************************
276 //
277 //! @brief DSI state
278 //!
279 //! ULPS mode exit
280 //!
281 //! @return AM_HAL_STATUS_SUCCESS
282 //
283 //*****************************************************************************
284 extern uint32_t am_hal_dsi_ulps_exit(void);
285 
286 //*****************************************************************************
287 //
288 //! @brief DSI state
289 //!
290 //! @param bSendUlpsPattern     - Unused paramter
291 //!
292 //! DSI napping
293 //!
294 //! @return AM_HAL_STATUS_SUCCESS
295 //
296 //*****************************************************************************
297 extern uint32_t am_hal_dsi_napping(bool bSendUlpsPattern);
298 
299 //*****************************************************************************
300 //
301 //! @brief DSI state
302 //!
303 //! @param ui8LanesNum          - Number of lanes.
304 //! @param ui8DBIBusWidth       - Width of DBI bus.
305 //! @param ui32FreqTrim         - DPHY output frequency trim.
306 //! @param bSendUlpsPattern     - Unused parameter
307 //!
308 //! DSI wakeup
309 //!
310 //! @return AM_HAL_STATUS_SUCCESS
311 //
312 //*****************************************************************************
313 extern uint32_t am_hal_dsi_wakeup(uint8_t ui8LanesNum, uint8_t ui8DBIBusWidth, uint32_t ui32FreqTrim, bool bSendUlpsPattern);
314 
315 //*****************************************************************************
316 //
317 //! @brief Set DSI return packet size (bytes)
318 //!
319 //! @param ui8DataLen           - Return size(bytes).
320 //! @param bHS                  - Transmit Command in HS or LP mode
321 //!
322 //! DSI Transmits command to set maximum return size.
323 //!
324 //! @return AM_HAL_STATUS_SUCCESS
325 //
326 //*****************************************************************************
327 extern uint32_t am_hal_dsi_set_return_size(uint8_t ui8DataLen, bool bHS);
328 
329 #ifdef __cplusplus
330 }
331 #endif
332 
333 #endif // AM_HAL_DSI_H
334 
335 //*****************************************************************************
336 //
337 // End Doxygen group.
338 //! @}
339 //
340 //*****************************************************************************
341 
342