• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# MIPI CSI<a name="title_MIPI_CSIDes"></a>
2
3
4## 概述<a name="section1_MIPI_CSIDes"></a>
5
6- CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。
7
8- 物理层支持HS(High Speed)和LP(Low Power)两种工作模式。HS模式下采用低压差分信号,功耗较大,但数据传输速率可以很高(数据速率为80M~1Gbps);LP模式下采用单端信号,数据速率很低(<10Mbps),但是相应的功耗也很低。两种模式的结合保证了MIPI总线在需要传输大量数据(如图像)时可以高速传输,而在不需要传输大数据量时又能够减少功耗。
9
10- 图1显示了简化的CSI接口。D-PHY采用1对源同步的差分时钟和1~4对差分数据线来进行数据传输。数据传输采用DDR方式,即在时钟的上下边沿都有数据传输。
11
12  **图 1**  CSI发送、接收接口<a name="fig1_MIPI_CSIDes"></a>
13  ![](figures/CSI发送-接收接口.png)
14
15### ComboDevAttr结构体<a name="section1.1_MIPI_CSIDes"></a>
16
17**表** **1** ComboDevAttr结构体介绍
18
19<a name="table1_MIPI_CSIDes"></a>
20
21| 名称      | 描述                                                  |
22| --------- | ----------------------------------------------------- |
23| devno     | 设备号                                                |
24| inputMode | 输入模式:MIPI/LVDS/SUBSLVDS/HISPI/DC                 |
25| dataRate  | Mipi Rx,SLVS输入速率                                 |
26| imgRect   | MIPI Rx设备裁剪区域(与原始传感器输入图像大小相对应) |
27| MIPIAttr  | Mipi设备属性                                          |
28| lvdsAttr  | LVDS/SubLVDS/HiSPi设备属性                            |
29
30### ExtDataType结构体<a name="section1.2_MIPI_CSIDes"></a>
31
32**表** **2** ExtDataType结构体介绍
33
34<a name="table2_MIPI_CSIDes"></a>
35
36| 名称            | 描述                            |
37| --------------- | ------------------------------- |
38| devno           | 设备号                          |
39| num             | sensor号                        |
40| extDataBitWidth | 图片的位深                      |
41| extDataType     | 定义YUV和原始数据格式以及位深度 |
42
43### 接口说明<a name="section1.3_MIPI_CSIDes"></a>
44
45**表 3**  MIPI CSI API接口功能介绍
46
47<a name="table3_MIPI_CSIDes"></a>
48
49  | 功能分类 | 接口名 |
50| -------- | -------- |
51| 获取/释放MIPI CSI控制器操作句柄 | MipiCsiOpen:获取MIPI CSI控制器操作句柄<br/>MipiCsiClose:释放MIPI CSI控制器操作句柄 |
52| MIPI CSI相应配置 | MipiCsiSetComboDevAttr:设置MIPI,CMOS或者LVDS相机的参数给控制器,参数包括工作模式,图像区域,图像深度,数据速率和物理通道等<br/>MipiCsiSetExtDataType(可选):设置YUV和RAW数据格式和位深<br/>MipiCsiSetHsMode:设置MIPI&nbsp;RX的Lane分布。根据硬件连接的形式选择具体的mode<br/>MipiCsiSetPhyCmvmode:设置共模电压模式 |
53| 复位/撤销复位Sensor | MipiCsiResetSensor:复位Sensor<br/>MipiCsiUnresetSensor:撤销复位Sensor |
54| 复位/撤销复位MIPI&nbsp;RX | MipiCsiResetRx:复位MIPI&nbsp;RX。不同的s32WorkingViNum有不同的enSnsType<br/>MipiCsiUnresetRx:撤销复位MIPI&nbsp;RX |
55| 使能/关闭MIPI的时钟 | MipiCsiEnableClock:使能MIPI的时钟。根据上层函数电泳传递的enSnsType参数决定是用MIPI还是LVDS<br/>MipiCsiDisableClock:关闭MIPI设备的时钟 |
56| 使能/禁用MIPI上的Sensor时钟 | MipiCsiEnableSensorClock:使能MIPI上的Sensor时钟<br/>MipiCsiDisableSensorClock:关闭Sensor的时钟 |
57
58
59## 使用指导<a name="section2_MIPI_CSIDes"></a>
60
61### 使用流程<a name="section2.1_MIPI_CSIDes"></a>
62
63使用MIPI CSI的一般流程如[图2](#fig2_MIPI_CSIDes)所示。
64
65**图 2**  MIPI CSI使用流程图<a name="fig2_MIPI_CSIDes"></a>
66
67
68![](figures/MIPI-CSI使用流程图.png)
69
70### 获取MIPI CSI控制器操作句柄<a name="section2.2_MIPI_CSIDes"></a>
71
72在进行MIPI CSI进行通信前,首先要调用MipiCsiOpen获取控制器操作句柄,该函数会返回指定通道ID的控制器操作句柄。
73
74```c
75DevHandle MipiCsiOpen(uint8_t id);
76```
77
78**表 4**  MipiCsiOpen的参数和返回值描述
79
80<a name="table4_MIPI_CSIDes"></a>
81
82| 参数       | 参数描述                                        |
83| ---------- | ----------------------------------------------- |
84| id         | MIPI CSI通道ID                                  |
85| **返回值** | **返回值描述**                                  |
86| NULL       | 获取失败                                        |
87| 设备句柄   | 获取到指令通道的控制器操作句柄,类型为DevHandle |
88
89假设系统中的MIPI CSI通道为0,获取该通道控制器操作句柄的示例如下:
90
91```c
92DevHandle MipiCsiHandle = NULL;  /* 设备句柄 */
93id = 0;      /* MIPI CSI通道ID */
94
95/* 获取控制器操作句柄 */
96MipiCsiHandle = MipiCsiOpen(id);
97if (MipiCsiHandle == NULL) {
98    HDF_LOGE("MipiCsiOpen: failed\n");
99    return;
100}
101```
102
103### MIPI CSI相应配置<a name="section2.3_MIPI_CSIDes"></a>
104
105-   写入MIPI CSI配置
106
107    ```c
108    int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr);
109    ```
110
111    **表 5**  MipiCsiSetComboDevAttr的参数和返回值描述
112
113    <a name="table5_MIPI_CSIDes"></a>
114
115    | 参数       | 参数描述                   |
116    | ---------- | -------------------------- |
117    | handle     | 控制器操作句柄             |
118    | pAttr      | MIPI CSI相应配置结构体指针 |
119    | **返回值** | **返回值描述**             |
120    | 0          | 设置成功                   |
121    | 负数       | 设置失败                   |
122
123    ```c
124    int32_t ret;
125    struct ComboDevAttr attr;
126
127    /* 当前配置如下 */
128    (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
129    attr.devno = 0; /* 设备0 */
130    attr.inputMode = INPUT_MODE_MIPI; /* 输入模式为MIPI */
131    attr.dataRate = MIPI_DATA_RATE_X1; /* 每时钟输出1像素 */
132    attr.imgRect.x = 0; /* 0: 图像传感器左上位置 */
133    attr.imgRect.y = 0; /* 0: 图像传感器右上位置 */
134    attr.imgRect.width = 2592; /* 2592: 图像传感器宽度大小 */
135    attr.imgRect.height = 1944; /* 1944: 图像传感器高度尺寸 */
136    /* 写入配置数据 */
137    ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
138    if (ret != 0) {
139        HDF_LOGE("%s: MipiCsiSetComboDevAttr fail! ret=%d\n", __func__, ret);
140        return -1;
141    }
142    ```
143
144-   设置YUV和RAW数据格式和位深
145
146    ```c
147    int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType);
148    ```
149
150    **表 6**  MipiCsiSetExtDataType的参数和返回值描述
151
152    <a name="table6_MIPI_CSIDes"></a>
153
154    | 参数       | 参数描述                        |
155    | ---------- | ------------------------------- |
156    | handle     | 控制器操作句柄                  |
157    | dataType   | 定义YUV和原始数据格式以及位深度 |
158    | **返回值** | **返回值描述**                  |
159    | 0          | 设置成功                        |
160    | 负数       | 设置失败                        |
161
162    ```c
163    int32_t ret;
164    struct ExtDataType dataType;
165
166    /* 配置YUV和RAW数据格式和位深参数 */
167    dataType.devno = 0; /* 设备0 */
168    dataType.num = 0;   /* sensor 0 */
169    dataType.extDataBitWidth[0] = 12; /* 位深数组元素0 */
170    dataType.extDataBitWidth[1] = 12; /* 位深数组元素1 */
171    dataType.extDataBitWidth[2] = 12; /* 位深数组元素2 */
172
173    dataType.extDataType[0] = 0x39; /* 定义YUV和原始数据格式以及位深度元素0 */
174    dataType.extDataType[1] = 0x39; /* 定义YUV和原始数据格式以及位深度元素1 */
175    dataType.extDataType[2] = 0x39; /* 定义YUV和原始数据格式以及位深度元素2 */
176    /* 设置YUV和RAW数据格式和位深 */
177    ret = MipiCsiSetExtDataType(MipiCsiHandle, &dataType);
178    if (ret != 0) {
179        HDF_LOGE("%s: MipiCsiSetExtDataType fail! ret=%d\n", __func__, ret);
180        return -1;
181    }
182    ```
183
184-   设置MIPI RX的Lane分布
185
186    ```c
187    int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode);
188    ```
189
190    **表 7**  MipiCsiSetHsMode的参数和返回值描述
191
192    <a name="table7_MIPI_CSIDes"></a>
193
194    | 参数           | 参数描述       |
195    | -------------- | -------------- |
196    | handle         | 控制器操作句柄 |
197    | laneDivideMode | lane模式参数   |
198    | **返回值**     | **返回值描述** |
199    | 0              | 设置成功       |
200    | 负数           | 设置失败       |
201
202    ```c
203    int32_t ret;
204    enum LaneDivideMode mode;
205
206    /* lane模式参数为0 */
207    mode = LANE_DIVIDE_MODE_0;
208    /* 设置MIPI RX的 Lane分布 */
209    ret = MipiCsiSetHsMode(MipiCsiHandle, mode);
210    if (ret != 0) {
211        HDF_LOGE("%s: MipiCsiSetHsMode fail! ret=%d\n", __func__, ret);
212        return -1;
213    }
214    ```
215
216-   设置共模电压模式
217
218    ```c
219    int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode);
220    ```
221
222    **表 8**  MipiCsiSetPhyCmvmode的参数和返回值描述
223
224    <a name="table8_MIPI_CSIDes"></a>
225
226    | 参数       | 参数描述         |
227    | ---------- | ---------------- |
228    | handle     | 控制器操作句柄   |
229    | cmvMode    | 共模电压模式参数 |
230    | devno      | 设备编号         |
231    | **返回值** | **返回值描述**   |
232    | 0          | 设置成功         |
233    | 负数       | 设置失败         |
234
235    ```c
236    int32_t ret;
237    enum PhyCmvMode mode;
238    uint8_t devno;
239
240    /* 共模电压模式参数为0 */
241    mode = PHY_CMV_GE1200MV;
242    /* 设备编号为0 */
243    devno = 0;
244    /* 设置共模电压模式 */
245    ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode);
246    if (ret != 0) {
247        HDF_LOGE("%s: MipiCsiSetPhyCmvmode fail! ret=%d\n", __func__, ret);
248        return -1;
249    }
250    ```
251
252### 复位/撤销复位Sensor<a name="section2.4_MIPI_CSIDes"></a>
253
254-   复位Sensor
255
256    ```c
257    int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource);
258    ```
259
260    **表 9**  MipiCsiResetSensor的参数和返回值描述
261
262    <a name="table9_MIPI_CSIDes"></a>
263
264    | 参数           | 参数描述                                         |
265    | -------------- | ------------------------------------------------ |
266    | handle         | 控制器操作句柄                                   |
267    | snsResetSource | 传感器的复位信号线号,在软件中称为传感器的复位源 |
268    | **返回值**     | **返回值描述**                                   |
269    | 0              | 复位成功                                         |
270    | 负数           | 复位失败                                         |
271
272    ```c
273    int32_t ret;
274    uint8_t snsResetSource;
275
276    /* 传感器复位信号线号为0 */
277    snsResetSource = 0;
278    /* 复位sensor */
279    ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
280    if (ret != 0) {
281        HDF_LOGE("%s: MipiCsiResetSensor fail! ret=%d\n", __func__, ret);
282        return -1;
283    }
284    ```
285
286-   撤销复位Sensor
287
288    ```c
289    int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource);
290    ```
291
292    **表 10**  MipiCsiUnresetSensor的参数和返回值描述
293
294    <a name="table10_MIPI_CSIDes"></a>
295
296    | 参数           | 参数描述                                         |
297    | -------------- | ------------------------------------------------ |
298    | handle         | 控制器操作句柄                                   |
299    | snsResetSource | 传感器的复位信号线号,在软件中称为传感器的复位源 |
300    | **返回值**     | **返回值描述**                                   |
301    | 0              | 撤销复位成功                                     |
302    | 负数           | 撤销复位失败                                     |
303
304    ```c
305    int32_t ret;
306    uint8_t snsResetSource;
307
308    /* 传感器撤销复位信号线号为0 */
309    snsResetSource = 0;
310    /* 撤销复位sensor */
311    ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
312    if (ret != 0) {
313        HDF_LOGE("%s: MipiCsiUnresetSensor fail! ret=%d\n", __func__, ret);
314        return -1;
315    }
316    ```
317
318### 复位/撤销复位MIPI RX<a name="section2.5_MIPI_CSIDes"></a>
319
320-   复位MIPI RX
321
322    ```c
323    int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev);
324    ```
325
326    **表 11**  MipiCsiResetRx的参数和返回值描述
327
328    <a name="table11_MIPI_CSIDes"></a>
329
330    | 参数       | 参数描述              |
331    | ---------- | --------------------- |
332    | handle     | 控制器操作句柄        |
333    | comboDev   | MIPI RX或LVDS通路序号 |
334    | **返回值** | **返回值描述**        |
335    | 0          | 复位成功              |
336    | 负数       | 复位失败              |
337
338    ```c
339    int32_t ret;
340    uint8_t comboDev;
341
342    /* 通路序号为0 */
343    comboDev = 0;
344    /* 复位MIPI RX */
345    ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
346    if (ret != 0) {
347        HDF_LOGE("%s: MipiCsiResetRx fail! ret=%d\n", __func__, ret);
348        return -1;
349    }
350    ```
351
352-   撤销复位MIPI RX
353
354    ```c
355    int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev);
356    ```
357
358    **表 12**  MipiCsiUnresetRx的参数和返回值描述
359
360    <a name="table12_MIPI_CSIDes"></a>
361
362    | 参数       | 参数描述              |
363    | ---------- | --------------------- |
364    | handle     | 控制器操作句柄        |
365    | comboDev   | MIPI RX或LVDS通路序号 |
366    | **返回值** | **返回值描述**        |
367    | 0          | 撤销复位成功          |
368    | 负数       | 撤销复位失败          |
369
370    ```c
371    int32_t ret;
372    uint8_t comboDev;
373
374    /* 通路序号为0 */
375    comboDev = 0;
376    /* 撤销复位MIPI RX */
377    ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
378    if (ret != 0) {
379        HDF_LOGE("%s: MipiCsiUnresetRx fail! ret=%d\n", __func__, ret);
380        return -1;
381    }
382    ```
383
384### 使能/关闭MIPI的时钟<a name="section2.6_MIPI_CSIDes"></a>
385
386-   使能MIPI的时钟
387
388    ```c
389    int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev);
390    ```
391
392    **表 13**  MipiCsiEnableClock的参数和返回值描述
393
394    <a name="table13_MIPI_CSIDes"></a>
395
396    | 参数       | 参数描述       |
397    | ---------- | -------------- |
398    | handle     | 控制器操作句柄 |
399    | comboDev   | 通路序号       |
400    | **返回值** | **返回值描述** |
401    | 0          | 使能成功       |
402    | 负数       | 使能失败       |
403
404    ```c
405    int32_t ret;
406    uint8_t comboDev;
407
408    /* 通路序号为0 */
409    comboDev = 0;
410    /* 使能MIPI的时钟 */
411    ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
412    if (ret != 0) {
413        HDF_LOGE("%s: MipiCsiEnableClock fail! ret=%d\n", __func__, ret);
414        return -1;
415    }
416    ```
417
418-   关闭MIPI的时钟
419
420    ```c
421    int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev);
422    ```
423
424    **表 14**  MipiCsiDisableClock的参数和返回值描述
425
426    <a name="table14_MIPI_CSIDes"></a>
427
428    | 参数       | 参数描述       |
429    | ---------- | -------------- |
430    | handle     | 控制器操作句柄 |
431    | comboDev   | 通路序号       |
432    | **返回值** | **返回值描述** |
433    | 0          | 关闭成功       |
434    | 负数       | 关闭失败       |
435
436    ```c
437    int32_t ret;
438    uint8_t comboDev;
439
440    /* 通路序号为0 */
441    comboDev = 0;
442    /* 关闭MIPI的时钟 */
443    ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
444    if (ret != 0) {
445        HDF_LOGE("%s: MipiCsiDisableClock fail! ret=%d\n", __func__, ret);
446        return -1;
447    }
448    ```
449
450### 使能/关闭MIPI上的Sensor时钟<a name="section2.7_MIPI_CSIDes"></a>
451
452-   使能MIPI上的Sensor时钟
453
454    ```c
455    int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource);
456    ```
457
458    **表 15**  MipiCsiEnableSensorClock的参数和返回值描述
459
460    <a name="table15_MIPI_CSIDes"></a>
461
462    | 参数         | 参数描述                                         |
463    | ------------ | ------------------------------------------------ |
464    | handle       | 控制器操作句柄                                   |
465    | snsClkSource | 传感器的时钟信号线号,在软件中称为传感器的时钟源 |
466    | **返回值**   | **返回值描述**                                   |
467    | 0            | 使能成功                                         |
468    | 负数         | 使能失败                                         |
469
470    ```c
471    int32_t ret;
472    uint8_t snsClkSource;
473
474    /* 传感器的时钟信号线号为0 */
475    snsClkSource = 0;
476    /* 使能MIPI上的sensor时钟 */
477    ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
478    if (ret != 0) {
479        HDF_LOGE("%s: MipiCsiEnableSensorClock fail! ret=%d\n", __func__, ret);
480        return -1;
481    }
482    ```
483
484-   关闭MIPI上的Sensor时钟
485
486    ```c
487    int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource);
488    ```
489
490    **表 16**  MipiCsiDisableSensorClock的参数和返回值描述
491
492    <a name="table16_MIPI_CSIDes"></a>
493
494    | 参数         | 参数描述                                         |
495    | ------------ | ------------------------------------------------ |
496    | handle       | 控制器操作句柄                                   |
497    | snsClkSource | 传感器的时钟信号线号,在软件中称为传感器的时钟源 |
498    | **返回值**   | **返回值描述**                                   |
499    | 0            | 关闭成功                                         |
500    | 负数         | 关闭失败                                         |
501
502    ```c
503    int32_t ret;
504    uint8_t snsClkSource;
505
506    /* 传感器的时钟信号线号为0 */
507    snsClkSource = 0;
508    /* 关闭MIPI上的Sensor时钟 */
509    ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
510    if (ret != 0) {
511        HDF_LOGE("%s: MipiCsiDisableSensorClock fail! ret=%d\n", __func__, ret);
512        return -1;
513    }
514    ```
515
516### 释放MIPI CSI控制器操作句柄<a name="section2.8_MIPI_CSIDes"></a>
517
518MIPI CSI使用完成之后,需要释放控制器操作句柄,释放句柄的函数如下所示:
519
520```c
521void MipiCsiClose(DevHandle handle);
522```
523
524该函数会释放掉由MipiCsiOpen申请的资源。
525
526**表 17**  MipiCsiClose的参数和返回值描述
527
528<a name="table17_MIPI_CSIDes"></a>
529
530 | 参数         | 参数描述                                         |
531 | ------------ | ------------------------------------------------ |
532 | handle       | MIPI CSI控制器操作句柄                                  |
533
534```c
535MipiCsiClose(MIPIHandle); /* 释放掉MIPI CSI控制器操作句柄 */
536```
537
538## 使用实例<a name="section3_MIPI_CSIDes"></a>
539
540MIPI CSI完整的使用示例如下所示:
541
542```c
543#include "hdf.h"
544#include "MIPI_csi_if.h"
545
546void PalMipiCsiTestSample(void)
547{
548    uint8_t id;
549    int32_t ret;
550    uint8_t comboDev;
551    uint8_t snsClkSource;
552    uint8_t devno;
553    enum LaneDivideMode mode;
554    enum PhyCmvMode mode;
555    struct ComboDevAttr attr;
556    struct ExtDataType dataType;
557    DevHandle MipiCsiHandle = NULL;
558
559    /* 控制器ID号 */
560    id = 0;
561    /* 获取控制器操作句柄 */
562    MipiCsiHandle = MipiCsiOpen(id);
563    if (MipiCsiHandle == NULL) {
564        HDF_LOGE("MipiCsiOpen: failed!\n");
565        return;
566    }
567
568    /* lane模式参数为0 */
569    mode = LANE_DIVIDE_MODE_0;
570    /* 设置MIPI RX的 Lane分布 */
571    ret = MipiCsiSetHsMode(MipiCsiHandle, mode);
572    if (ret != 0) {
573        HDF_LOGE("%s: MipiCsiSetHsMode fail! ret=%d\n", __func__, ret);
574        return;
575    }
576
577    /* 通路序号为0 */
578    comboDev = 0;
579    /* 使能MIPI的时钟 */
580    ret = MipiCsiEnableClock(MipiCsiHandle, comboDev);
581    if (ret != 0) {
582        HDF_LOGE("%s: MipiCsiEnableClock fail! ret=%d\n", __func__, ret);
583        return;
584    }
585
586    /* 复位MIPI RX */
587    ret = MipiCsiResetRx(MipiCsiHandle, comboDev);
588    if (ret != 0) {
589        HDF_LOGE("%s: MipiCsiResetRx fail! ret=%d\n", __func__, ret);
590        return;
591    }
592
593    /* 传感器的时钟信号线号为0 */
594    snsClkSource = 0;
595    /* 使能MIPI上的sensor时钟 */
596    ret = MipiCsiEnableSensorClock(MipiCsiHandle, snsClkSource);
597    if (ret != 0) {
598        HDF_LOGE("%s: MipiCsiEnableSensorClock fail! ret=%d\n", __func__, ret);
599        return;
600    }
601
602    /* 复位sensor */
603    ret = MipiCsiResetSensor(MipiCsiHandle, snsResetSource);
604    if (ret != 0) {
605        HDF_LOGE("%s: MipiCsiResetSensor fail! ret=%d\n", __func__, ret);
606        return;
607    }
608
609    /* MIPI参数配置如下 */
610    (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr));
611    attr.devno = 0; /* 设备0 */
612    attr.inputMode = INPUT_MODE_MIPI; /* 输入模式为MIPI */
613    attr.dataRate = MIPI_DATA_RATE_X1; /* 每时钟输出1像素 */
614    attr.imgRect.x = 0; /* 0: 图像传感器左上位置 */
615    attr.imgRect.y = 0; /* 0: 图像传感器右上位置 */
616    attr.imgRect.width = 2592; /* 2592: 图像传感器宽度大小 */
617    attr.imgRect.height = 1944; /* 1944: 图像传感器高度尺寸 */
618    /* 写入配置数据 */
619    ret = MipiCsiSetComboDevAttr(MipiCsiHandle, &attr);
620    if (ret != 0) {
621        HDF_LOGE("%s: MipiCsiSetComboDevAttr fail! ret=%d\n", __func__, ret);
622        return;
623    }
624
625    /* 共模电压模式参数为0 */
626    mode = PHY_CMV_GE1200MV;
627    /* 设备编号为0 */
628    devno = 0;
629    /* 设置共模电压模式 */
630    ret = MipiCsiSetPhyCmvmode(MipiCsiHandle, devno, mode);
631    if (ret != 0) {
632        HDF_LOGE("%s: MipiCsiSetPhyCmvmode fail! ret=%d\n", __func__, ret);
633        return;
634    }
635
636    /* 通路序号为0 */
637    comboDev = 0;
638    /* 撤销复位MIPI RX */
639    ret = MipiCsiUnresetRx(MipiCsiHandle, comboDev);
640    if (ret != 0) {
641        HDF_LOGE("%s: MipiCsiUnresetRx fail! ret=%d\n", __func__, ret);
642        return;
643    }
644
645    /* 关闭MIPI的时钟 */
646    ret = MipiCsiDisableClock(MipiCsiHandle, comboDev);
647    if (ret != 0) {
648        HDF_LOGE("%s: MipiCsiDisableClock fail! ret=%d\n", __func__, ret);
649        return;
650    }
651
652    /* 传感器撤销复位信号线号为0 */
653    snsResetSource = 0;
654    /* 撤销复位sensor */
655    ret = MipiCsiUnresetSensor(MipiCsiHandle, snsResetSource);
656    if (ret != 0) {
657        HDF_LOGE("%s: MipiCsiUnresetSensor fail! ret=%d\n", __func__, ret);
658        return;
659    }
660
661    /* 关闭MIPI上的sensor时钟 */
662    ret = MipiCsiDisableSensorClock(MipiCsiHandle, snsClkSource);
663    if (ret != 0) {
664        HDF_LOGE("%s: MipiCsiDisableSensorClock fail! ret=%d\n", __func__, ret);
665        return;
666    }
667
668    /* 释放MIPI DSI设备句柄 */
669    MipiCsiClose(MipiCsiHandle);
670}
671```
672
673