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  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 RX的Lane分布。根据硬件连接的形式选择具体的mode<br/>MipiCsiSetPhyCmvmode:设置共模电压模式 | 53| 复位/撤销复位Sensor | MipiCsiResetSensor:复位Sensor<br/>MipiCsiUnresetSensor:撤销复位Sensor | 54| 复位/撤销复位MIPI RX | MipiCsiResetRx:复位MIPI RX。不同的s32WorkingViNum有不同的enSnsType<br/>MipiCsiUnresetRx:撤销复位MIPI 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 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