1# MIPI DSI<a name="ZH-CN_TOPIC_0000001062724343"></a> 2 3- [概述](#section16806142183217) 4 - [接口说明](#section129611916132011) 5 6- [使用指导](#section037231715335) 7 - [使用流程](#section49299119344) 8 - [获取MIPI-DSI操作句柄](#section5126155683811) 9 - [MIPI-DSI相应配置](#section201164274344) 10 - [发送/回读控制指令](#section199401342173415) 11 - [释放MIPI-DSI操作句柄](#section161011610357) 12 13- [使用实例](#section17470126123520) 14 15## 概述<a name="section16806142183217"></a> 16 17- DSI(Display Serial Interface)是由移动行业处理器接口联盟(Mobile Industry Processor Interface \(MIPI\) Alliance)制定的规范,旨在降低移动设备中显示控制器的成本。它以串行的方式发送像素数据或指令给外设\(通常是LCD或者类似的显示设备\),或从外设中读取状态信息或像素信息;它定义了主机、图像数据源和目标设备之间的串行总线和通信协议。 18 19- MIPI-DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等是通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。 20- 图1显示了简化的DSI接口。从概念上看,符合DSI的接口与基于DBI-2和DPI-2标准的接口具有相同的功能。它向外围设备传输像素或命令数据,并且可以从外围设备读取状态或像素信息。主要区别在于,DSI对所有像素数据、命令和事件进行序列化,而在传统接口中,这些像素数据、命令和事件通常需要附加控制信号才能在并行数据总线上传输。 21 22 **图 1** DSI发送、接收接口<a name="fig1122611461203"></a> 23  24 25 26### 接口说明<a name="section129611916132011"></a> 27 28**表 1** MIPI-DSI API接口功能介绍 29 30<a name="table4199102313245"></a> 31<table><thead align="left"><tr id="row1619910238244"><th class="cellrowborder" valign="top" width="26.619999999999997%" id="mcps1.2.4.1.1"><p id="p141991023182411"><a name="p141991023182411"></a><a name="p141991023182411"></a>功能分类</p> 32</th> 33<th class="cellrowborder" valign="top" width="28.910000000000004%" id="mcps1.2.4.1.2"><p id="p1199102315247"><a name="p1199102315247"></a><a name="p1199102315247"></a>接口名</p> 34</th> 35<th class="cellrowborder" valign="top" width="44.47%" id="mcps1.2.4.1.3"><p id="p719918232240"><a name="p719918232240"></a><a name="p719918232240"></a>描述</p> 36</th> 37</tr> 38</thead> 39<tbody><tr id="row15199023172414"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p919902312413"><a name="p919902312413"></a><a name="p919902312413"></a>设置/获取当前MIPI-DSI相关配置</p> 40</td> 41<td class="cellrowborder" valign="top" width="28.910000000000004%" headers="mcps1.2.4.1.2 "><p id="p21995232243"><a name="p21995232243"></a><a name="p21995232243"></a>MipiDsiSetCfg</p> 42</td> 43<td class="cellrowborder" valign="top" width="44.47%" headers="mcps1.2.4.1.3 "><p id="p919911233240"><a name="p919911233240"></a><a name="p919911233240"></a>设置MIPI-DSI相关配置</p> 44</td> 45</tr> 46<tr id="row171996232248"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p7199623152412"><a name="p7199623152412"></a><a name="p7199623152412"></a>MipiDsiGetCfg</p> 47</td> 48<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1119919235248"><a name="p1119919235248"></a><a name="p1119919235248"></a>获取当前MIPI-DSI相关配置</p> 49</td> 50</tr> 51<tr id="row91994239242"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p101998233245"><a name="p101998233245"></a><a name="p101998233245"></a>获取/释放MIPI-DSI操作句柄</p> 52</td> 53<td class="cellrowborder" valign="top" width="28.910000000000004%" headers="mcps1.2.4.1.2 "><p id="p51991323112415"><a name="p51991323112415"></a><a name="p51991323112415"></a>MipiDsiOpen</p> 54</td> 55<td class="cellrowborder" valign="top" width="44.47%" headers="mcps1.2.4.1.3 "><p id="p11991623182415"><a name="p11991623182415"></a><a name="p11991623182415"></a>获取MIPI-DSI操作句柄</p> 56</td> 57</tr> 58<tr id="row12199192352411"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p131991123172412"><a name="p131991123172412"></a><a name="p131991123172412"></a>MipiDsiClose</p> 59</td> 60<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p520062313249"><a name="p520062313249"></a><a name="p520062313249"></a>释放MIPI-DSI操作句柄</p> 61</td> 62</tr> 63<tr id="row7200152382417"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p8200202312241"><a name="p8200202312241"></a><a name="p8200202312241"></a>设置MIPI-DSI进入Low power模式/High speed模式</p> 64</td> 65<td class="cellrowborder" valign="top" width="28.910000000000004%" headers="mcps1.2.4.1.2 "><p id="p6200192318247"><a name="p6200192318247"></a><a name="p6200192318247"></a>MipiDsiSetLpMode</p> 66</td> 67<td class="cellrowborder" valign="top" width="44.47%" headers="mcps1.2.4.1.3 "><p id="p16200192319240"><a name="p16200192319240"></a><a name="p16200192319240"></a>设置MIPI-DSI进入Low power模式</p> 68</td> 69</tr> 70<tr id="row122001523182417"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p22009236249"><a name="p22009236249"></a><a name="p22009236249"></a>MipiDsiSetHsMode</p> 71</td> 72<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p22001423192418"><a name="p22001423192418"></a><a name="p22001423192418"></a>设置MIPI-DSI进入High speed模式</p> 73</td> 74</tr> 75<tr id="row52002237248"><td class="cellrowborder" rowspan="2" valign="top" width="26.619999999999997%" headers="mcps1.2.4.1.1 "><p id="p10200162332412"><a name="p10200162332412"></a><a name="p10200162332412"></a>MIPI-DSI发送/回读指令</p> 76</td> 77<td class="cellrowborder" valign="top" width="28.910000000000004%" headers="mcps1.2.4.1.2 "><p id="p19200142315249"><a name="p19200142315249"></a><a name="p19200142315249"></a>MipiDsiTx</p> 78</td> 79<td class="cellrowborder" valign="top" width="44.47%" headers="mcps1.2.4.1.3 "><p id="p1020082319243"><a name="p1020082319243"></a><a name="p1020082319243"></a>MIPI-DSI发送相应指令的接口</p> 80</td> 81</tr> 82<tr id="row6200162372416"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p18200112392417"><a name="p18200112392417"></a><a name="p18200112392417"></a>MipiDsiRx</p> 83</td> 84<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p9200102312249"><a name="p9200102312249"></a><a name="p9200102312249"></a>MIPI-DSI按期望长度回读的接口</p> 85</td> 86</tr> 87</tbody> 88</table> 89 90> **说明:** 91>本文涉及的所有接口,仅限内核态使用,不支持在用户态使用 92 93## 使用指导<a name="section037231715335"></a> 94 95### 使用流程<a name="section49299119344"></a> 96 97使用MIPI-DSI的一般流程如[图2](#fig99821771782)所示。 98 99**图 2** MIPI-DSI使用流程图<a name="fig99821771782"></a> 100 101 102 103 104### 获取MIPI-DSI操作句柄<a name="section5126155683811"></a> 105 106在进行MIPI-DSI进行通信前,首先要调用MipiDsiOpen获取操作句柄,该函数会返回指定通道ID的操作句柄。 107 108DevHandle MipiDsiOpen\(uint8\_t id\); 109 110**表 2** MipiDsiOpen的参数和返回值描述 111 112<a name="table7603619123820"></a> 113<table><thead align="left"><tr id="row1060351914386"><th class="cellrowborder" valign="top" width="20.66%" id="mcps1.2.3.1.1"><p id="p14603181917382"><a name="p14603181917382"></a><a name="p14603181917382"></a><strong id="b16510829133012"><a name="b16510829133012"></a><a name="b16510829133012"></a>参数</strong></p> 114</th> 115<th class="cellrowborder" valign="top" width="79.34%" id="mcps1.2.3.1.2"><p id="p36031519183819"><a name="p36031519183819"></a><a name="p36031519183819"></a><strong id="b65222293309"><a name="b65222293309"></a><a name="b65222293309"></a>参数描述</strong></p> 116</th> 117</tr> 118</thead> 119<tbody><tr id="row960361918383"><td class="cellrowborder" valign="top" width="20.66%" headers="mcps1.2.3.1.1 "><p id="p8603161903818"><a name="p8603161903818"></a><a name="p8603161903818"></a>id</p> 120</td> 121<td class="cellrowborder" valign="top" width="79.34%" headers="mcps1.2.3.1.2 "><p id="p19603111916381"><a name="p19603111916381"></a><a name="p19603111916381"></a>MIPI DSI通道ID</p> 122</td> 123</tr> 124<tr id="row11410612183019"><td class="cellrowborder" valign="top" width="20.66%" headers="mcps1.2.3.1.1 "><p id="p460381915385"><a name="p460381915385"></a><a name="p460381915385"></a><strong id="b4349113243013"><a name="b4349113243013"></a><a name="b4349113243013"></a>返回值</strong></p> 125</td> 126<td class="cellrowborder" valign="top" width="79.34%" headers="mcps1.2.3.1.2 "><p id="p96031619153812"><a name="p96031619153812"></a><a name="p96031619153812"></a><strong id="b63502322308"><a name="b63502322308"></a><a name="b63502322308"></a>返回值描述</strong></p> 127</td> 128</tr> 129<tr id="row15410111273017"><td class="cellrowborder" valign="top" width="20.66%" headers="mcps1.2.3.1.1 "><p id="p1060418195389"><a name="p1060418195389"></a><a name="p1060418195389"></a>NULL</p> 130</td> 131<td class="cellrowborder" valign="top" width="79.34%" headers="mcps1.2.3.1.2 "><p id="p760471912388"><a name="p760471912388"></a><a name="p760471912388"></a>获取失败</p> 132</td> 133</tr> 134<tr id="row1241081213303"><td class="cellrowborder" valign="top" width="20.66%" headers="mcps1.2.3.1.1 "><p id="p5604719133811"><a name="p5604719133811"></a><a name="p5604719133811"></a>设备句柄</p> 135</td> 136<td class="cellrowborder" valign="top" width="79.34%" headers="mcps1.2.3.1.2 "><p id="p3604181933818"><a name="p3604181933818"></a><a name="p3604181933818"></a>获取到指令通道的操作句柄, 类型为DevHandle</p> 137</td> 138</tr> 139</tbody> 140</table> 141 142假设系统中的MIPI-DSI通道为0,获取该通道操作句柄的示例如下: 143 144``` 145DevHandle mipiDsiHandle = NULL; /* 设备句柄 */ 146chnId = 0; /* MIPI-DSI通道ID */ 147 148/* 获取操作句柄 */ 149mipiDsiHandle = MipiDsiOpen(chnId); 150if (mipiDsiHandle == NULL) { 151 HDF_LOGE("MipiDsiOpen: failed\n"); 152 return; 153} 154``` 155 156### MIPI-DSI相应配置<a name="section201164274344"></a> 157 158- 写入MIPI-DSI配置 159 160int32\_t MipiDsiSetCfg\(DevHandle handle, struct MipiCfg \*cfg\); 161 162**表 3** MipiDsiSetCfg的参数和返回值描述 163 164<a name="table10692555281"></a> 165<table><thead align="left"><tr id="row116914559288"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1169195516288"><a name="p1169195516288"></a><a name="p1169195516288"></a><strong id="b106965519281"><a name="b106965519281"></a><a name="b106965519281"></a>参数</strong></p> 166</th> 167<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p769125512286"><a name="p769125512286"></a><a name="p769125512286"></a><strong id="b969105516280"><a name="b969105516280"></a><a name="b969105516280"></a>参数描述</strong></p> 168</th> 169</tr> 170</thead> 171<tbody><tr id="row4691155142812"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p66935515288"><a name="p66935515288"></a><a name="p66935515288"></a>handle</p> 172</td> 173<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p863714348217"><a name="p863714348217"></a><a name="p863714348217"></a>操作句柄</p> 174</td> 175</tr> 176<tr id="row469145572817"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p46915519287"><a name="p46915519287"></a><a name="p46915519287"></a>cfg</p> 177</td> 178<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p76995518289"><a name="p76995518289"></a><a name="p76995518289"></a>MIPI-DSI相应配置buf 指针</p> 179</td> 180</tr> 181<tr id="row16913554284"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p16955512812"><a name="p16955512812"></a><a name="p16955512812"></a><strong id="b17691155152810"><a name="b17691155152810"></a><a name="b17691155152810"></a>返回值</strong></p> 182</td> 183<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p206945502813"><a name="p206945502813"></a><a name="p206945502813"></a><strong id="b196955572818"><a name="b196955572818"></a><a name="b196955572818"></a>返回值描述</strong></p> 184</td> 185</tr> 186<tr id="row146914556283"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p669175582818"><a name="p669175582818"></a><a name="p669175582818"></a>0</p> 187</td> 188<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p169205511283"><a name="p169205511283"></a><a name="p169205511283"></a>设置成功</p> 189</td> 190</tr> 191<tr id="row5694558283"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p269175516286"><a name="p269175516286"></a><a name="p269175516286"></a>负数</p> 192</td> 193<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p11691554280"><a name="p11691554280"></a><a name="p11691554280"></a>设置失败</p> 194</td> 195</tr> 196</tbody> 197</table> 198 199``` 200int32_t ret; 201struct MipiCfg cfg = {0}; 202 203/* 当前对接的屏幕配置如下 */ 204cfg.lane = DSI_4_LANES; 205cfg.mode = DSI_CMD_MODE; 206cfg.burstMode = VIDEO_NON_BURST_MODE_SYNC_EVENTS; 207cfg.format = FORMAT_RGB_24_BIT; 208cfg.pixelClk = 174; 209cfg.phyDataRate = 384; 210cfg.timingInfo.hsaPixels = 50; 211cfg.timingInfo.hbpPixels = 55; 212cfg.timingInfo.hlinePixels = 1200; 213cfg.timingInfo.yResLines = 1800; 214cfg.timingInfo.vbpLines = 33; 215cfg.timingInfo.vsaLines = 76; 216cfg.timingInfo.vfpLines = 120; 217cfg.timingInfo.xResPixels = 1342; 218/* 写入配置数据 */ 219ret = MipiDsiSetCfg(g_handle, &cfg); 220if (ret != 0) { 221 HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); 222 return -1; 223} 224``` 225 226- 获取当前MIPI-DSI的配置 227 228int32\_t MipiDsiGetCfg\(DevHandle handle, struct MipiCfg \*cfg\); 229 230**表 4** MipiDsiGetCfg的参数和返回值描述 231 232<a name="table7709554280"></a> 233<table><thead align="left"><tr id="row670115515282"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p470205515287"><a name="p470205515287"></a><a name="p470205515287"></a><strong id="b1770105522820"><a name="b1770105522820"></a><a name="b1770105522820"></a>参数</strong></p> 234</th> 235<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p270755162817"><a name="p270755162817"></a><a name="p270755162817"></a><strong id="b170165512817"><a name="b170165512817"></a><a name="b170165512817"></a>参数描述</strong></p> 236</th> 237</tr> 238</thead> 239<tbody><tr id="row57014555286"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p11701155172815"><a name="p11701155172815"></a><a name="p11701155172815"></a>handle</p> 240</td> 241<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p57015510283"><a name="p57015510283"></a><a name="p57015510283"></a>操作句柄</p> 242</td> 243</tr> 244<tr id="row1870155192815"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p137115572815"><a name="p137115572815"></a><a name="p137115572815"></a>cfg</p> 245</td> 246<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p771195522818"><a name="p771195522818"></a><a name="p771195522818"></a>MIPI-DSI相应配置buf 指针</p> 247</td> 248</tr> 249<tr id="row12718555283"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1871175515289"><a name="p1871175515289"></a><a name="p1871175515289"></a><strong id="b871185592819"><a name="b871185592819"></a><a name="b871185592819"></a>返回值</strong></p> 250</td> 251<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p771955182813"><a name="p771955182813"></a><a name="p771955182813"></a><strong id="b147175532813"><a name="b147175532813"></a><a name="b147175532813"></a>返回值描述</strong></p> 252</td> 253</tr> 254<tr id="row1071155582812"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p6718551282"><a name="p6718551282"></a><a name="p6718551282"></a>0</p> 255</td> 256<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p171195516285"><a name="p171195516285"></a><a name="p171195516285"></a>获取成功</p> 257</td> 258</tr> 259<tr id="row97135519282"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p11711355162815"><a name="p11711355162815"></a><a name="p11711355162815"></a>负数</p> 260</td> 261<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p77116555286"><a name="p77116555286"></a><a name="p77116555286"></a>获取失败</p> 262</td> 263</tr> 264</tbody> 265</table> 266 267``` 268int32_t ret; 269struct MipiCfg cfg; 270memset(&cfg, 0, sizeof(struct MipiCfg)); 271ret = MipiDsiGetCfg(g_handle, &cfg); 272if (ret != HDF_SUCCESS) { 273 HDF_LOGE("%s: GetMipiCfg fail!\n", __func__); 274 return HDF_FAILURE; 275} 276``` 277 278### 发送/回读控制指令<a name="section199401342173415"></a> 279 280- 发送指令 281 282int32\_t MipiDsiTx\(PalHandle handle, struct DsiCmdDesc \*cmd\); 283 284**表 5** MipiDsiTx的参数和返回值描述 285 286<a name="table1018490043"></a> 287<table><thead align="left"><tr id="row31848013417"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1415816132411"><a name="p1415816132411"></a><a name="p1415816132411"></a><strong id="b129796117337"><a name="b129796117337"></a><a name="b129796117337"></a>参数</strong></p> 288</th> 289<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p11158111316410"><a name="p11158111316410"></a><a name="p11158111316410"></a><strong id="b1699118123314"><a name="b1699118123314"></a><a name="b1699118123314"></a>参数描述</strong></p> 290</th> 291</tr> 292</thead> 293<tbody><tr id="row10184701945"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p104891871157"><a name="p104891871157"></a><a name="p104891871157"></a>handle</p> 294</td> 295<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p204891671156"><a name="p204891671156"></a><a name="p204891671156"></a>操作句柄</p> 296</td> 297</tr> 298<tr id="row928111518418"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p4282955412"><a name="p4282955412"></a><a name="p4282955412"></a>cmd</p> 299</td> 300<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p7282752412"><a name="p7282752412"></a><a name="p7282752412"></a>需要发送的指令数据指针</p> 301</td> 302</tr> 303<tr id="row17393154515328"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p8158313248"><a name="p8158313248"></a><a name="p8158313248"></a><strong id="b18542051332"><a name="b18542051332"></a><a name="b18542051332"></a>返回值</strong></p> 304</td> 305<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p161591413741"><a name="p161591413741"></a><a name="p161591413741"></a><strong id="b45520523313"><a name="b45520523313"></a><a name="b45520523313"></a>返回值描述</strong></p> 306</td> 307</tr> 308<tr id="row339324593215"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p103191916578"><a name="p103191916578"></a><a name="p103191916578"></a>0</p> 309</td> 310<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1231981611712"><a name="p1231981611712"></a><a name="p1231981611712"></a>发送成功</p> 311</td> 312</tr> 313<tr id="row15393184519323"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p531916166716"><a name="p531916166716"></a><a name="p531916166716"></a>负数</p> 314</td> 315<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p93191161174"><a name="p93191161174"></a><a name="p93191161174"></a>发送失败</p> 316</td> 317</tr> 318</tbody> 319</table> 320 321``` 322int32_t ret; 323struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc)); 324if (cmd == NULL) { 325 return HDF_FAILURE; 326} 327cmd->dtype = DTYPE_DCS_WRITE; 328cmd->dlen = 1; 329cmd->payload = OsalMemCalloc(sizeof(uint8_t)); 330if (cmd->payload == NULL) { 331 HdfFree(cmd); 332 return HDF_FAILURE; 333} 334*(cmd->payload) = DTYPE_GEN_LWRITE; 335MipiDsiSetLpMode(mipiHandle); 336ret = MipiDsiTx(mipiHandle, cmd); 337MipiDsiSetHsMode(mipiHandle); 338if (ret != HDF_SUCCESS) { 339 HDF_LOGE("%s: PalMipiDsiTx fail! ret=%d\n", __func__, ret); 340 HdfFree(cmd->payload); 341 HdfFree(cmd); 342 return HDF_FAILURE; 343} 344HdfFree(cmd->payload); 345HdfFree(cmd); 346``` 347 348- 回读指令 349 350int32\_t MipiDsiRx\(DevHandle handle, struct DsiCmdDesc \*cmd, uint32\_t readLen, uint8\_t \*out\); 351 352**表 6** MipiDsiRx的参数和返回值描述 353 354<a name="table223910318361"></a> 355<table><thead align="left"><tr id="row924033173613"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p16240143143611"><a name="p16240143143611"></a><a name="p16240143143611"></a><strong id="b1724033112363"><a name="b1724033112363"></a><a name="b1724033112363"></a>参数</strong></p> 356</th> 357<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p32401031113610"><a name="p32401031113610"></a><a name="p32401031113610"></a><strong id="b1324013111363"><a name="b1324013111363"></a><a name="b1324013111363"></a>参数描述</strong></p> 358</th> 359</tr> 360</thead> 361<tbody><tr id="row024043193619"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p16231153542520"><a name="p16231153542520"></a><a name="p16231153542520"></a>handle</p> 362</td> 363<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p122311535122518"><a name="p122311535122518"></a><a name="p122311535122518"></a>操作句柄</p> 364</td> 365</tr> 366<tr id="row192401331163613"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p8706172453614"><a name="p8706172453614"></a><a name="p8706172453614"></a>cmd</p> 367</td> 368<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p0706424183610"><a name="p0706424183610"></a><a name="p0706424183610"></a>需要回读的指令数据指针</p> 369</td> 370</tr> 371<tr id="row12646535173616"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p16465359364"><a name="p16465359364"></a><a name="p16465359364"></a>readLen</p> 372</td> 373<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p564617356360"><a name="p564617356360"></a><a name="p564617356360"></a>期望回读的数据长度</p> 374</td> 375</tr> 376<tr id="row919916426361"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p11199942153616"><a name="p11199942153616"></a><a name="p11199942153616"></a>out</p> 377</td> 378<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p91991042143618"><a name="p91991042143618"></a><a name="p91991042143618"></a>回读的数据buf指针</p> 379</td> 380</tr> 381<tr id="row14240133143619"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1723253542518"><a name="p1723253542518"></a><a name="p1723253542518"></a><strong id="b4232173517256"><a name="b4232173517256"></a><a name="b4232173517256"></a>返回值</strong></p> 382</td> 383<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p223217356253"><a name="p223217356253"></a><a name="p223217356253"></a><strong id="b7232103510259"><a name="b7232103510259"></a><a name="b7232103510259"></a>返回值描述</strong></p> 384</td> 385</tr> 386<tr id="row424093120369"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1123203518257"><a name="p1123203518257"></a><a name="p1123203518257"></a>0</p> 387</td> 388<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p62324353251"><a name="p62324353251"></a><a name="p62324353251"></a>获取成功</p> 389</td> 390</tr> 391<tr id="row18241531153610"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p42321635122517"><a name="p42321635122517"></a><a name="p42321635122517"></a>负数</p> 392</td> 393<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p323283510252"><a name="p323283510252"></a><a name="p323283510252"></a>获取失败</p> 394</td> 395</tr> 396</tbody> 397</table> 398 399``` 400int32_t ret; 401uint8_t readVal = 0; 402 403struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc)); 404if (cmdRead == NULL) { 405 return HDF_FAILURE; 406} 407cmdRead->dtype = DTYPE_DCS_READ; 408cmdRead->dlen = 1; 409cmdRead->payload = OsalMemCalloc(sizeof(uint8_t)); 410if (cmdRead->payload == NULL) { 411 HdfFree(cmdRead); 412 return HDF_FAILURE; 413} 414*(cmdRead->payload) = DDIC_REG_STATUS; 415MipiDsiSetLpMode(g_handle); 416ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); 417MipiDsiSetHsMode(g_handle); 418if (ret != HDF_SUCCESS) { 419 HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); 420 HdfFree(cmdRead->payload); 421 HdfFree(cmdRead); 422 return HDF_FAILURE; 423} 424HdfFree(cmdRead->payload); 425HdfFree(cmdRead); 426``` 427 428### 释放MIPI-DSI操作句柄<a name="section161011610357"></a> 429 430MIPI-DSI使用完成之后,需要释放操作句柄,释放句柄的函数如下所示: 431 432void MipiDsiClose\(DevHandle handle\); 433 434该函数会释放掉由MipiDsiOpen申请的资源。 435 436**表 7** MipiDsiClose的参数和返回值描述 437 438<a name="table72517953115"></a> 439<table><thead align="left"><tr id="row1525793312"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p115402031153111"><a name="p115402031153111"></a><a name="p115402031153111"></a>参数</p> 440</th> 441<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p65406313319"><a name="p65406313319"></a><a name="p65406313319"></a>参数描述</p> 442</th> 443</tr> 444</thead> 445<tbody><tr id="row1926109193116"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p105419317318"><a name="p105419317318"></a><a name="p105419317318"></a>handle</p> 446</td> 447<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p132442255912"><a name="p132442255912"></a><a name="p132442255912"></a>MIPI-DSI操作句柄</p> 448</td> 449</tr> 450</tbody> 451</table> 452 453``` 454MipiDsiClose(mipiHandle); /* 释放掉MIPI-DSI操作句柄 */ 455``` 456 457## 使用实例<a name="section17470126123520"></a> 458 459MIPI-DSI完整的使用示例如下所示: 460 461``` 462#include "hdf.h" 463#include "mipi_dsi_if.h" 464 465void PalMipiDsiTestSample(void) 466{ 467 uint8_t chnId; 468 int32_t ret; 469 DevHandle handle = NULL; 470 471 /* 设备通道编号 */ 472 chnId = 0; 473 /* 获取操作句柄 */ 474 handle = MipiDsiOpen(chnId); 475 if (handle == NULL) { 476 HDF_LOGE("MipiDsiOpen: failed!\n"); 477 return; 478 } 479 /* 配置相应参数 */ 480 struct MipiCfg cfg = {0}; 481 cfg.lane = DSI_4_LANES; 482 cfg.mode = DSI_CMD_MODE; 483 cfg.burstMode = VIDEO_NON_BURST_MODE_SYNC_EVENTS; 484 cfg.format = FORMAT_RGB_24_BIT; 485 cfg.pixelClk = 174; 486 cfg.phyDataRate = 384; 487 cfg.timingInfo.hsaPixels = 50; 488 cfg.timingInfo.hbpPixels = 55; 489 cfg.timingInfo.hlinePixels = 1200; 490 cfg.timingInfo.yResLines = 1800; 491 cfg.timingInfo.vbpLines = 33; 492 cfg.timingInfo.vsaLines = 76; 493 cfg.timingInfo.vfpLines = 120; 494 cfg.timingInfo.xResPixels = 1342; 495 /* 写入配置数据 */ 496 ret = MipiDsiSetCfg(g_handle, &cfg); 497 if (ret != 0) { 498 HDF_LOGE("%s: SetMipiCfg fail! ret=%d\n", __func__, ret); 499 return; 500 } 501 /* 发送PANEL初始化指令 */ 502 struct DsiCmdDesc *cmd = OsalMemCalloc(sizeof(struct DsiCmdDesc)); 503 if (cmd == NULL) { 504 return; 505 } 506 cmd->dtype = DTYPE_DCS_WRITE; 507 cmd->dlen = 1; 508 cmd->payload = OsalMemCalloc(sizeof(uint8_t)); 509 if (cmd->payload == NULL) { 510 HdfFree(cmd); 511 return; 512 } 513 *(cmd->payload) = DTYPE_GEN_LWRITE; 514 MipiDsiSetLpMode(mipiHandle); 515 ret = MipiDsiTx(mipiHandle, cmd); 516 MipiDsiSetHsMode(mipiHandle); 517 if (ret != HDF_SUCCESS) { 518 HDF_LOGE("%s: MipiDsiTx fail! ret=%d\n", __func__, ret); 519 HdfFree(cmd->payload); 520 HdfFree(cmd); 521 return; 522 } 523 HdfFree(cmd->payload); 524 HdfFree(cmd); 525 /* 回读panel状态寄存器 */ 526 uint8_t readVal = 0; 527 struct DsiCmdDesc *cmdRead = OsalMemCalloc(sizeof(struct DsiCmdDesc)); 528 if (cmdRead == NULL) { 529 return; 530 } 531 cmdRead->dtype = DTYPE_DCS_READ; 532 cmdRead->dlen = 1; 533 cmdRead->payload = OsalMemCalloc(sizeof(uint8_t)); 534 if (cmdRead->payload == NULL) { 535 HdfFree(cmdRead); 536 return; 537 } 538 *(cmdRead->payload) = DDIC_REG_STATUS; 539 MipiDsiSetLpMode(g_handle); 540 ret = MipiDsiRx(g_handle, cmdRead, sizeof(readVal), &readVal); 541 MipiDsiSetHsMode(g_handle); 542 if (ret != HDF_SUCCESS) { 543 HDF_LOGE("%s: MipiDsiRx fail! ret=%d\n", __func__, ret); 544 HdfFree(cmdRead->payload); 545 HdfFree(cmdRead); 546 return; 547 } 548 HdfFree(cmdRead->payload); 549 HdfFree(cmdRead); 550 /* 释放MIPI DSI设备句柄 */ 551 MipiDsiClose(handle); 552} 553``` 554 555