source: azure_iot_hub_f767zi/trunk/asp_baseplatform/pdic/stm32f7xx/dsi.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 37.9 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2017 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * @(#) $Id$
40 */
41/*
42 * STM32F746-DSI用デバイスドライバ
43 */
44
45#include <kernel.h>
46#include <t_syslog.h>
47#include <t_stdlib.h>
48#include "syssvc/serial.h"
49#include "syssvc/syslog.h"
50#include <target_syssvc.h>
51#include "ltdc.h"
52#include "dsi.h"
53
54#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
55#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
56#define sil_modw_mem(a, b, c) sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
57
58
59#define DSI_TIMEOUT_VALUE 1000 /* 1秒 */
60
61#define DSI_MAX_RTPKT_SIZE 0x00000037 /* 最大リターンパケットサイズ */
62
63#define DSI_CMCR_MASK (DSI_CMCR_GSW0TX | DSI_CMCR_GSW1TX | DSI_CMCR_GSW2TX |\
64 DSI_CMCR_GSR0TX | DSI_CMCR_GSR1TX | DSI_CMCR_GSR2TX |\
65 DSI_CMCR_GLWTX | DSI_CMCR_DSW0TX | DSI_CMCR_DSW1TX |\
66 DSI_CMCR_DSR0TX | DSI_CMCR_DLWTX | DSI_CMCR_MRDPS)
67/*
68 * DSIの初期設定を行う
69 * parameter1 hdsi DSIハンドラへのポインタ
70 * return 正常ならE_OK
71 */
72ER
73dsi_init(DSI_Handle_t *hdsi)
74{
75 uint32_t tick = 0;
76 uint32_t unitIntervalx4 = 0;
77 uint32_t temp;
78
79 if(hdsi == NULL)
80 return E_PAR;
81
82 hdsi->state = DSI_STATE_BUSY;
83
84 /*
85 * DSI PLL設定
86 */
87 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_REGEN);
88
89 /*
90 * レディ待ち
91 */
92 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WISR_RRS) == 0){
93 if(tick > DSI_TIMEOUT_VALUE)
94 return E_TMOUT;
95 tick++;
96 dly_tsk(1);
97 }
98
99 /*
100 * PLLの分周設定
101 */
102 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR));
103 temp &= ~(DSI_WRPCR_PLL_NDIV | DSI_WRPCR_PLL_IDF | DSI_WRPCR_PLL_ODF);
104 temp |= ((hdsi->Init.pllndiv)<<2) | ((hdsi->Init.pllidf)<<11) | ((hdsi->Init.pllodf)<<16);
105 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), temp);
106
107 /*
108 * DSI PLLイネーブル、レディ待ち
109 */
110 tick = 0;
111 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_PLLEN);
112 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WISR_PLLLS) == 0){
113 if(tick > DSI_TIMEOUT_VALUE)
114 return E_TMOUT;
115 tick++;
116 dly_tsk(1);
117 }
118
119 /*
120 * D-PHYクロック、デジタルイネーブル
121 */
122 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCTLR), (DSI_PCTLR_CKE | DSI_PCTLR_DEN));
123
124 /*
125 * クロックレーンのコンフィギュレーション
126 */
127 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLCR));
128 temp &= ~(DSI_CLCR_DPCC | DSI_CLCR_ACR);
129 temp |= (DSI_CLCR_DPCC | hdsi->Init.AutomaticClockLaneControl);
130 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLCR), temp);
131
132 /*
133 * データレーンのコンフィギュレーション
134 */
135 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR), DSI_PCONFR_NL, hdsi->Init.NumberOfLanes);
136
137 /*
138 * DSIクロックパラメータ設定
139 */
140 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CCR), DSI_CCR_TXECKDIV, hdsi->Init.TXEscapeCkdiv);
141
142 /*
143 * ハイスピードモード設定
144 */
145 temp = (hdsi->Init.pllidf > 0) ? hdsi->Init.pllidf : 1;
146 unitIntervalx4 = (4000000 * temp * (1 << hdsi->Init.pllodf)) / ((HSE_VALUE/1000) * hdsi->Init.pllndiv);
147 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_UIX4, unitIntervalx4);
148
149 /*
150 * エラー割込み無効化
151 */
152 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_IER0), 0);
153 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_IER1), 0);
154
155 /*
156 * エラー情報リセット、レディ設定
157 */
158 hdsi->errorcode = DSI_ERROR_NONE;
159 hdsi->state = DSI_STATE_READY;
160 return E_OK;
161}
162
163/*
164 * DSIの非有効化設定を行う
165 * parameter1 hdsi DSIハンドラへのポインタ
166 * return 正常ならE_OK
167 */
168ER
169dsi_deinit(DSI_Handle_t *hdsi)
170{
171 if(hdsi == NULL)
172 return E_PAR;
173
174 hdsi->state = DSI_STATE_BUSY;
175
176 /*
177 * DSI WRAPPER無効化
178 */
179 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCR), DSI_WCR_DSIEN);
180
181 /*
182 * DSIモジュール無効化
183 */
184 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CR), DSI_CR_EN);
185
186 /*
187 * D-PHYクロック、デジタル無効化
188 */
189 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCTLR), (DSI_PCTLR_CKE | DSI_PCTLR_DEN));
190
191 /*
192 * DSI PLLオフ
193 */
194 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_PLLEN);
195
196 /*
197 * レギュレータ無効化
198 */
199 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_REGEN);
200
201 /*
202 * エラー情報リセット、リセット設定
203 */
204 hdsi->errorcode = DSI_ERROR_NONE;
205 hdsi->state = DSI_STATE_RESET;
206 return E_OK;
207}
208
209
210/*
211 * DSIビデオコンフィギュレーション設定
212 * parameter1 hdsi DSIハンドラへのポインタ
213 * parameter2 pini DSIビデオコンフィギュレーション設定へのポインタ
214 * return 正常ならE_OK
215 */
216ER
217dsi_configvideo(DSI_Handle_t *hdsi, DSI_VideoConfig_t *pini)
218{
219 uint32_t temp;
220
221 if(hdsi == NULL || pini == NULL)
222 return E_PAR;
223 if(pini->ColorCoding == DSI_RGB666 && (pini->LooselyPacked & ~DSI_LCOLCR_LPE) != 0)
224 return E_PAR;
225
226 /*
227 * ビデオモード選択
228 */
229 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_MCR), DSI_MCR_CMDM);
230 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), DSI_WCFGR_DSIM);
231
232 /*
233 * ビデオモード設定
234 */
235 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_VMT, pini->Mode);
236
237 /*
238 * ビデオパケットサイズ設定
239 */
240 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VPCR), DSI_VPCR_VPSIZE, pini->PacketSize);
241
242 /*
243 * チャンク番号設定
244 */
245 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VCCR), DSI_VCCR_NUMC, pini->NumberOfChunks);
246
247 /*
248 * ナルパケットサイズ設定
249 */
250 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VNPCR), DSI_VNPCR_NPSIZE, pini->NullPacketSize);
251
252 /*
253 * バーチャルチャネル設定
254 */
255 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LVCIDR), DSI_LVCIDR_VCID, pini->VirtualChannelID);
256
257 /*
258 * コントロールシグナルの極性設定
259 */
260 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPCR));
261 temp &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
262 temp |= (pini->DEPolarity | pini->VSPolarity | pini->HSPolarity);
263 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPCR), temp);
264
265 /*
266 * カラーコーディング設定
267 */
268 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LCOLCR), DSI_LCOLCR_COLC, pini->ColorCoding);
269 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), DSI_WCFGR_COLMUX, ((pini->ColorCoding)<<1));
270
271 /*
272 * RGB666用 loosely packed variants設定
273 */
274 if(pini->ColorCoding == DSI_RGB666){
275 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LCOLCR), DSI_LCOLCR_LPE, pini->LooselyPacked);
276 }
277
278 /*
279 * Horizontal Synchronization Active (HSA)クロック設定
280 */
281 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VHSACR), DSI_VHSACR_HSA, pini->HorizontalSyncActive);
282
283 /*
284 * Horizontal Back Porch (HBP)クロック設定
285 */
286 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VHBPCR), DSI_VHBPCR_HBP, pini->HorizontalBackPorch);
287
288 /*
289 * total line time (HLINE=HSA+HBP+HACT+HFP)クロック設定
290 */
291 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VLCR), DSI_VLCR_HLINE, pini->HorizontalLine);
292
293 /*
294 * Vertical Synchronization Active (VSA)クロック設定
295 */
296 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VVSACR), DSI_VVSACR_VSA, pini->VerticalSyncActive);
297
298 /*
299 * Vertical Back Porch (VBP)クロック設定
300 */
301 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VVBPCR), DSI_VVBPCR_VBP, pini->VerticalBackPorch);
302
303 /*
304 * Vertical Front Porch (VFP)クロック設定
305 */
306 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VVFPCR), DSI_VVFPCR_VFP, pini->VerticalFrontPorch);
307
308 /*
309 * Vertical Active period設定
310 */
311 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VVACR), DSI_VVACR_VA, pini->VerticalActive);
312
313 /*
314 * Command transmission modeモード設定
315 */
316 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPCE, pini->LPCommandEnable);
317
318 /*
319 * Low power 最大パケットサイズ設定
320 */
321 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPMCR), DSI_LPMCR_LPSIZE, ((pini->LPLargestPacketSize)<<16));
322
323 /*
324 * Low power VACT 最大パケットサイズ設定
325 */
326 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPMCR), DSI_LPMCR_VLPSIZE, pini->LPVACTLargestPacketSize);
327
328 /*
329 * LP transition in HFP period設定
330 */
331 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPHFPE, pini->LPHorizontalFrontPorchEnable);
332
333 /*
334 * LP transition in HBP period設定
335 */
336 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPHBPE, pini->LPHorizontalBackPorchEnable);
337
338 /*
339 * LP transition in VACT period設定
340 */
341 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPVAE, pini->LPVerticalActiveEnable);
342
343 /*
344 * LP transition in VFP period設定
345 */
346 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPVFPE, pini->LPVerticalFrontPorchEnable);
347
348 /*
349 * LP transition in VBP period設定
350 */
351 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPVBPE, pini->LPVerticalBackPorchEnable);
352
353 /*
354 * LP transition in vertical sync period設定
355 */
356 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_LPVSAE, pini->LPVerticalSyncActiveEnable);
357
358 /*
359 * request for an acknowledge response設定
360 */
361 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_FBTAAE, pini->FrameBTAAcknowledgeEnable);
362 return E_OK;
363}
364
365/*
366 * LTDCの初期化パラメータをDSI VIDEOモードから設定
367 * parameter1 hltdc LTDCの初期設定構造体へのポインタ
368 * parameter2 pini DSI VIDEOモード設定構造体へのポインタ
369 * return 正常ならばE_OK
370 */
371ER
372dci_configltdc(LTDC_Handle_t* hltdc, DSI_VideoConfig_t *pini)
373{
374 if(hltdc == NULL || pini == NULL)
375 return E_PAR;
376
377 /*
378 * LTDC用極性設定
379 */
380 hltdc->Init.DEPolarity = (pini->DEPolarity == DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH;
381 hltdc->Init.VSPolarity = (pini->VSPolarity == DSI_VSYNC_ACTIVE_HIGH) ? LTDC_VSPOLARITY_AH : LTDC_VSPOLARITY_AL;
382 hltdc->Init.HSPolarity = (pini->HSPolarity == DSI_HSYNC_ACTIVE_HIGH) ? LTDC_HSPOLARITY_AH : LTDC_HSPOLARITY_AL;
383
384 /*
385 * LTDC用バーチャルタイミングパラメータ設定
386 */
387 hltdc->Init.VerticalSync = pini->VerticalSyncActive - 1;
388 hltdc->Init.AccumulatedVBP = pini->VerticalSyncActive + pini->VerticalBackPorch - 1;
389 hltdc->Init.AccumulatedActiveH = pini->VerticalSyncActive + pini->VerticalBackPorch + pini->VerticalActive - 1;
390 hltdc->Init.TotalHeigh = pini->VerticalSyncActive + pini->VerticalBackPorch + pini->VerticalActive + pini->VerticalFrontPorch - 1;
391 return E_OK;
392}
393
394/*
395 * 適合コマンドモード設定
396 * parameter1 hdsi DSIハンドラへのポインタ
397 * parameter2 pcfg コマンド設定定義へのポインタ
398 * parameter3 actactive 転送ACK有効無効設定(DSI_ACTIVE/DSI_INACTIVE)
399 * return 正常ならばE_OK
400 */
401ER
402dsi_configadaptedCmdMode(DSI_Handle_t *hdsi, DSI_CommandConfig_t *pcfg, uint32_t ackactive)
403{
404 uint32_t temp;
405
406 if(hdsi == NULL || pcfg == NULL)
407 return E_PAR;
408 /*
409 * コマンドモード設定
410 */
411 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_MCR), DSI_MCR_CMDM);
412 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), DSI_WCFGR_DSIM);
413 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), DSI_WCFGR_DSIM);
414
415 /*
416 * バーチャルチャネル設定
417 */
418 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LVCIDR), DSI_LVCIDR_VCID, pcfg->VirtualChannelID);
419
420 /*
421 * 極性と制御シグナル設定
422 */
423 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPCR));
424 temp &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
425 temp |= (pcfg->DEPolarity | pcfg->VSPolarity | pcfg->HSPolarity);
426 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LPCR), temp);
427
428 /*
429 * カラーコーディング選択
430 */
431 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LCOLCR), DSI_LCOLCR_COLC, pcfg->ColorCoding);
432 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), DSI_WCFGR_COLMUX, ((pcfg->ColorCoding)<<1));
433
434 /*
435 * 最大コマンドサイズ設定
436 */
437 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_LCCR), DSI_LCCR_CMDSIZE, pcfg->CommandSize);
438
439 /*
440 * ティアリングエフェクトソース、極性、リフレッシュモード設定
441 */
442 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR));
443 temp &= ~(DSI_WCFGR_TESRC | DSI_WCFGR_TEPOL | DSI_WCFGR_AR | DSI_WCFGR_VSPOL);
444 temp |= (pcfg->TearingEffectSource | pcfg->TearingEffectPolarity | pcfg->AutomaticRefresh | pcfg->VSyncPol);
445 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCFGR), temp);
446
447 /*
448 * 転送ACK設定
449 */
450 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CMCR), DSI_CMCR_TEARE, (ackactive & 1));
451
452 /*
453 * 割込み設定
454 */
455 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WIER), (DSI_WIER_TEIE | DSI_WIER_ERIE));
456 return E_OK;
457}
458
459/*
460 * コマンド転送モード設定
461 * parameter1 hdsi DSIハンドラへのポインタ
462 * parameter2 lpcmode コマンドモード設定ビット値
463 * parameter3 ackactive ACKのアクティブ設定(DSI_ACTIVE/DSI_INACTIVE)
464 * return 正常ならばE_OK
465 */
466ER
467dsi_configcommand(DSI_Handle_t *hdsi, uint32_t lpcmode, uint32_t ackactive)
468{
469 if(hdsi == NULL)
470 return E_PAR;
471 /*
472 * コマンド転送モード設定
473 */
474 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CMCR), DSI_CMCR_MASK);
475 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CMCR), (lpcmode & DSI_CMCR_MASK));
476
477 /*
478 * パケットACK設定
479 */
480 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CMCR), DSI_CMCR_ARE, (ackactive<<1));
481 return E_OK;
482}
483
484/*
485 * DSI PHYタイミング設定
486 * parameter1 hdsi DSIハンドラへのポインタ
487 * parameter2 ptime
488 * @brief Configure the DSI PHY timer parameters
489 * @param hdsi: pointer to a DSI_Handle_t structure that contains
490 * the configuration information for the DSI.
491 * @param ptime: DSI_PHY_Time_t structure that contains
492 * the DSI PHY timing parameters
493 * @retval HAL status
494 */
495ER
496dsi_configPhyTimer(DSI_Handle_t *hdsi, DSI_PHY_Time_t *ptime)
497{
498 uint32_t maxTime, temp;
499
500 maxTime = (ptime->ClockLaneLP2HSTime > ptime->ClockLaneHS2LPTime)? ptime->ClockLaneLP2HSTime: ptime->ClockLaneHS2LPTime;
501
502 /*
503 * クロックレーンタイマー設定
504 */
505 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLTCR));
506 temp &= ~(DSI_CLTCR_LP2HS_TIME | DSI_CLTCR_HS2LP_TIME);
507 temp |= (maxTime | ((maxTime)<<16));
508 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLTCR), temp);
509
510 /*
511 * データレーンタイマー設定
512 */
513 temp = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_DLTCR));
514 temp &= ~(DSI_DLTCR_MRD_TIME | DSI_DLTCR_LP2HS_TIME | DSI_DLTCR_HS2LP_TIME);
515 temp |= (ptime->DataLaneMaxReadTime | ((ptime->DataLaneLP2HSTime)<<16) | ((ptime->DataLaneHS2LPTime)<<24));
516 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_DLTCR), temp);
517
518 /*
519 * 停止状態の後の HS転送待ち時間設定
520 */
521 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR), DSI_PCONFR_SW_TIME, ptime->StopWaitTime<<8);
522 return E_OK;
523}
524
525/*
526 * DSI HOSTタイムアウト設定
527 * parameter1 hdsi DSIハンドラへのポインタ
528 * parameter2 ptimeout DSI_HostTimeout_t structure that contains
529 * return 正常ならE_OK
530 */
531ER
532dsi_configHostTimeout(DSI_Handle_t *hdsi, DSI_HostTimeout_t *ptimeout)
533{
534 /*
535 * timeout clock division factor設定
536 */
537 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CCR), DSI_CCR_TOCKDIV, (ptimeout->TimeoutCkdiv<<8));
538
539 /*
540 * High-speed transmission timeout設定
541 */
542 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR0), DSI_TCCR0_HSTX_TOCNT, ptimeout->HighSpeedTransmissionTimeout<<16);
543
544 /*
545 * Low-power reception timeout設定
546 */
547 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR0), DSI_TCCR0_LPRX_TOCNT, ptimeout->LowPowerReceptionTimeout);
548
549 /*
550 * High-speed read timeout設定
551 */
552 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR1), DSI_TCCR1_HSRD_TOCNT, ptimeout->HighSpeedReadTimeout);
553
554 /*
555 * Low-power read timeout設定
556 */
557 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR2), DSI_TCCR2_LPRD_TOCNT, ptimeout->LowPowerReadTimeout);
558
559 /*
560 * High-speed write timeout設定
561 */
562 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR3), DSI_TCCR3_HSWR_TOCNT, ptimeout->HighSpeedWriteTimeout);
563
564 /*
565 * High-speed write presp mode設定
566 */
567 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR3), DSI_TCCR3_PM, ptimeout->HighSpeedWritePrespMode);
568
569 /*
570 * Low-speed write timeout設定
571 */
572 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR4), DSI_TCCR4_LPWR_TOCNT, ptimeout->LowPowerWriteTimeout);
573
574 /*
575 * BTA timeout設定
576 */
577 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_TCCR5), DSI_TCCR5_BTA_TOCNT, ptimeout->BTATimeout);
578 return E_OK;
579}
580
581/*
582 * DSIモジュール実行開始
583 * parameter1 hdsi DSIハンドラへのポインタ
584 * return 正常ならE_OK
585 */
586ER
587dsi_start(DSI_Handle_t *hdsi)
588{
589 /*
590 * DSIモジュール有効化
591 */
592 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CR), DSI_CR_EN);
593
594 /*
595 * DSI WRAPPER有効化
596 */
597 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCR), DSI_WCR_DSIEN);
598 return E_OK;
599}
600
601/*
602 * DSIモジュール停止
603 * parameter1 hdsi DSIハンドラへのポインタ
604 * return 正常ならE_OK
605 */
606ER
607dsi_stop(DSI_Handle_t *hdsi)
608{
609 /*
610 * DSIモジュール無効化
611 */
612 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CR), DSI_CR_EN);
613
614 /*
615 * DSI WRAPPER無効化
616 */
617 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WCR), DSI_WCR_DSIEN);
618 return E_OK;
619}
620
621/*
622 * ショートWRITEコマンド
623 * parameter1 hdsi DSIハンドラへのポインタ
624 * parameter2 Channel Virtual channel ID.
625 * parameter3 Mode DSI short packet data type.
626 * parameter4 Param1 DSC command or first generic parameter.
627 * parameter5 Param2 DSC parameter or second generic parameter.
628 * return 正常ならE_OK
629 */
630ER
631dsi_swrite(DSI_Handle_t *hdsi, uint32_t Channel, uint32_t Mode, uint32_t Param1, uint32_t Param2)
632{
633 uint32_t tick = 0;
634
635 if(hdsi == NULL)
636 return E_PAR;
637 /*
638 * 書込みFIFOエンプティ待ち
639 */
640 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPSR)) & DSI_GPSR_CMDFE) == 0){
641 if(tick > DSI_TIMEOUT_VALUE)
642 return E_TMOUT;
643 tick++;
644 dly_tsk(1);
645 }
646
647 /*
648 * 書込みコマンド設定
649 */
650 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (Param1<<8) | (Param2<<16)));
651 return E_OK;
652}
653
654/*
655 * ロングWRITEコマンド
656 * parameter1 hdsi DSIハンドラへのポインタ
657 * parameter2 Channel Virtual channel ID.
658 * parameter3 Mode DSI long packet data type.
659 * parameter4 NbParams: Number of parameters.
660 * parameter5 Param1: DSC command or first generic parameter.
661 * parameter6 buf: Pointer to parameter values table.
662 * return 正常ならE_OK
663 */
664ER
665dsi_lwrite(DSI_Handle_t *hdsi, uint32_t Channel, uint32_t Mode, uint32_t NbParams, uint32_t Param1, uint8_t* buf)
666{
667 uint32_t no = 0;
668 uint32_t tick = 0;
669
670 if(hdsi == NULL)
671 return E_PAR;
672 /*
673 * 書込みFIFOエンプティ待ち
674 */
675 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPSR)) & DSI_GPSR_CMDFE) == 0){
676 if(tick > DSI_TIMEOUT_VALUE)
677 return E_TMOUT;
678 tick++;
679 dly_tsk(1);
680 }
681
682 /* Set the DCS code hexadecimal on payload byte 1, and the other parameters on the write FIFO command*/
683 while(no < NbParams){
684 if(no == 0x00){
685 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPDR), (Param1 | \
686 ((uint32_t)(*(buf + no)) << 8) | \
687 ((uint32_t)(*(buf + no+1))<<16) | \
688 ((uint32_t)(*(buf + no+2))<<24)));
689 no += 3;
690 }
691 else{
692 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPDR), ((uint32_t)(*(buf + no)) | \
693 ((uint32_t)(*(buf + no+1)) << 8) | \
694 ((uint32_t)(*(buf + no+2)) << 16) | \
695 ((uint32_t)(*(buf + no+3)) << 24)));
696 no += 4;
697 }
698 }
699
700 /*
701 * 書込みパケット設定
702 */
703 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (((NbParams+1)&0x00FF)<<8) | (((NbParams+1)&0xFF00)<<8)));
704 return E_OK;
705}
706
707/*
708 * DSIコマンドリード
709 * parameter1 hdsi DSIハンドラへのポインタ
710 * parameter2 Channel Virtual channel ID
711 * parameter3 Array pointer to a buffer to store the payload of a read back operation.
712 * parameter4 Size Data size to be read (in byte).
713 * parameter5 Mode DSI read packet data type.
714 * parameter6 DCSCmd DCS get/read command.
715 * parameter7 buf 設定領域へのポインタ
716 * return 正常ならE_OK
717 */
718ER
719dsi_read(DSI_Handle_t *hdsi, uint32_t Channel, uint8_t* Array, uint32_t Size, uint32_t Mode, uint32_t DCSCmd, uint8_t* buf)
720{
721 uint32_t tick = 0;
722
723 if(Size > 2){ /* リターンパケットサイズ設定 */
724 dsi_swrite(hdsi, Channel, DSI_MAX_RTPKT_SIZE, ((Size)&0xFF), (((Size)>>8)&0xFF));
725 }
726
727 /*
728 * READコマンド設定
729 */
730 if(Mode == DSI_DCS_SHORT_PKT_READ){
731 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (DCSCmd<<8) | (0<<16)));
732 }
733 else if(Mode == DSI_GEN_SHORT_PKT_READ_P0){
734 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (0<<8) | (0<<16)));
735 }
736 else if(Mode == DSI_GEN_SHORT_PKT_READ_P1){
737 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (buf[0]<<8) | (0<<16)));
738 }
739 else if(Mode == DSI_GEN_SHORT_PKT_READ_P2){
740 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_GHCR), (Mode | (Channel<<6) | (buf[0]<<8) | (buf[1]<<16)));
741 }
742 else{
743 return E_PAR;
744 }
745
746 /*
747 * 読み出しFIFO設定待ち
748 */
749 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPSR)) & DSI_GPSR_PRDFE) != 0){
750 /* Check for the Timeout */
751 if(tick > DSI_TIMEOUT_VALUE)
752 return E_TMOUT;
753 tick++;
754 dly_tsk(1);
755 }
756
757 /*
758 * 第一バイト取出し
759 */
760 *((uint32_t *)Array) = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPDR));
761 if(Size > 4){
762 Size -= 4;
763 Array += 4;
764 }
765 else{
766 return E_OK;
767 }
768
769 /*
770 * 残りバイト取出し
771 */
772 tick = 0;
773 while(((int)(Size)) > 0){
774 if((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPSR)) & DSI_GPSR_PRDFE) == 0){
775 *((uint32_t *)Array) = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_GPDR));
776 Size -= 4;
777 Array += 4;
778 }
779 if(tick > DSI_TIMEOUT_VALUE)
780 return E_TMOUT;
781 tick++;
782 dly_tsk(1);
783 }
784 return E_OK;
785}
786
787/*
788 * ULPM(Ultra Low Power Mode設定(D-PHY PLL running)
789 * parameter1 hdsi DSIハンドラへのポインタ
790 * return 正常ならE_OK
791 */
792ER
793dsi_enterULPMData(DSI_Handle_t *hdsi)
794{
795 uint32_t tick = 0;
796 uint32_t pconfrnl;
797
798 /*
799 * DSI Host PHY ULPSのデータレーンオン
800 */
801 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), DSI_PUCR_URDL);
802
803 /*
804 * D-PHYアクティブレーン設定待ち
805 */
806 pconfrnl = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR)) & DSI_PCONFR_NL;
807 if(pconfrnl == DSI_ONE_DATA_LANE){
808 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & DSI_PSR_UAN0) != 0){
809 if(tick > DSI_TIMEOUT_VALUE)
810 return E_TMOUT;
811 tick++;
812 dly_tsk(1);
813 }
814 }
815 else if(pconfrnl == DSI_TWO_DATA_LANES){
816 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0){
817 if(tick > DSI_TIMEOUT_VALUE)
818 return E_TMOUT;
819 tick++;
820 dly_tsk(1);
821 }
822 }
823 return E_OK;
824}
825
826/*
827 * ULPM(Ultra Low Power Mode終了(D-PHY PLL running)
828 * parameter1 hdsi DSIハンドラへのポインタ
829 * return 正常ならE_OK
830 */
831ER
832dsi_exitULPMData(DSI_Handle_t *hdsi)
833{
834 uint32_t tick = 0;
835 uint32_t pconfrnl;
836
837 /*
838 * DSI Host PHY ULPSのデータレーン終了
839 */
840 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), DSI_PUCR_UEDL);
841
842 /*
843 * D-PHYレーンアクティブ待ち
844 */
845 pconfrnl = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR)) & DSI_PCONFR_NL;
846 if(pconfrnl == DSI_ONE_DATA_LANE){
847 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & DSI_PSR_UAN0) == 0){
848 if(tick > DSI_TIMEOUT_VALUE)
849 return E_TMOUT;
850 tick++;
851 dly_tsk(1);
852 }
853 }
854 else if(pconfrnl == DSI_TWO_DATA_LANES){
855 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1)){
856 if(tick > DSI_TIMEOUT_VALUE)
857 return E_TMOUT;
858 tick++;
859 dly_tsk(1);
860 }
861 }
862
863 /*
864 * DSI Host PHY ULPSのクロックとデータレーンビットをすべてオフ
865 */
866 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), 0);
867 return E_OK;
868}
869
870/*
871 * ULPM(Ultra Low Power Mode設定(D-PHY PLL turned off)
872 * parameter1 hdsi DSIハンドラへのポインタ
873 * return 正常ならE_OK
874 */
875ER
876dsi_enterULPM(DSI_Handle_t *hdsi)
877{
878 uint32_t tick = 0;
879 uint32_t pconfrnl;
880
881 /*
882 * D-PHY制御オフ
883 */
884 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLCR), DSI_CLCR_DPCC);
885
886 /*
887 * D-PHYからのクロックソースオン
888 */
889 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR2), RCC_DCKCFGR2_DSISEL);
890
891 /*
892 * DSI Host PHY ULPSのクロックとデータレーンオン
893 */
894 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), (DSI_PUCR_URCL | DSI_PUCR_URDL));
895
896 /*
897 * アクティブレーン終了待ち
898 */
899 pconfrnl = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR)) & DSI_PCONFR_NL;
900 if(pconfrnl == DSI_ONE_DATA_LANE){
901 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != 0){
902 if(tick > DSI_TIMEOUT_VALUE)
903 return E_TMOUT;
904 tick++;
905 dly_tsk(1);
906 }
907 }
908 else if(pconfrnl == DSI_TWO_DATA_LANES){
909 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != 0){
910 if(tick > DSI_TIMEOUT_VALUE)
911 return E_TMOUT;
912 tick++;
913 dly_tsk(1);
914 }
915 }
916
917 /*
918 * DSI PLLオフ
919 */
920 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_PLLEN);
921 return E_OK;
922}
923
924/*
925 * ULPM(Ultra Low Power Mode)終了(D-PHY PLL turned off)
926 * parameter1 hdsi DSIハンドラへのポインタ
927 * return 正常ならE_OK
928 */
929ER
930dsi_exitULPM(DSI_Handle_t *hdsi)
931{
932 uint32_t tick = 0;
933 uint32_t pconfrnl;
934
935 /*
936 * DSI PLLオン
937 */
938 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WRPCR), DSI_WRPCR_PLLEN);
939
940 /*
941 * DSI PLLロック待ち
942 */
943 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WISR_PLLLS) == 0){
944 if(tick > DSI_TIMEOUT_VALUE)
945 return E_TMOUT;
946 tick++;
947 dly_tsk(1);
948 }
949
950 /*
951 * DSI Host PHY ULPSのクロックとデータレーン終了
952 */
953 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), (DSI_PUCR_UECL | DSI_PUCR_UEDL));
954
955 /*
956 * レーンアクティブレーン待ち
957 */
958 tick = 0;
959 pconfrnl = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PCONFR)) & DSI_PCONFR_NL;
960 if(pconfrnl == DSI_ONE_DATA_LANE){
961 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UANC)){
962 /* Check for the Timeout */
963 if(tick > DSI_TIMEOUT_VALUE)
964 return E_TMOUT;
965 tick++;
966 dly_tsk(1);
967 }
968 }
969 else if(pconfrnl == DSI_TWO_DATA_LANES){
970 while((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_PSR)) & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)){
971 /* Check for the Timeout */
972 if(tick > DSI_TIMEOUT_VALUE)
973 return E_TMOUT;
974 tick++;
975 dly_tsk(1);
976 }
977 }
978
979 /*
980 * DSI Host PHY ULPSのクロックとデータレーンビットをすべてオフ
981 */
982 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_PUCR), 0);
983
984 /*
985 * D-PHYからのクロックソースオフ
986 */
987 sil_andw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR2), RCC_DCKCFGR2_DSISEL);
988
989 /*
990 * D-PHY制御オオン
991 */
992 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_CLCR), DSI_CLCR_DPCC);
993
994 return E_OK;
995}
996
997/*
998 * テストパターン生成開始
999 * parameter1 hdsi DSIハンドラへのポインタ
1000 * parameter2 mode Pattern generator mode(0:color bars, 1:ber pattern)
1001 * parameter3 orient Pattern generator orientation(0:垂直,1:水平)
1002 */
1003void
1004dsi_startPatternGenerator(DSI_Handle_t *hdsi, uint32_t mode, uint32_t orient)
1005{
1006 mode &= 1;
1007 orient &= 1;
1008 /* Configure pattern generator mode and orientation */
1009 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), (DSI_VMCR_PGM | DSI_VMCR_PGO));
1010 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), ((mode<<20) | (orient<<24)));
1011
1012 /* Enable pattern generator by setting PGE bit */
1013 sil_orw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_PGE);
1014}
1015
1016/*
1017 * テストパターン生成終了
1018 * parameter1 hdsi DSIハンドラへのポインタ
1019 */
1020void
1021dsi_stopPatternGenerator(DSI_Handle_t *hdsi)
1022{
1023 sil_andw_mem((uint32_t *)(hdsi->base+TOFF_DSI_VMCR), DSI_VMCR_PGE);
1024}
1025
1026/*
1027 * カスタムラインピン設定
1028 * parameter1 hdsi DSIハンドラへのポインタ
1029 * parameter2 customl カスタムレーン
1030 * parameter3 lane レーン設定
1031 * parameter4 active DSI_ACTIVE/DSI_INACTIVE
1032 * return 正常ならE_OK
1033 */
1034ER
1035dsi_setLanePinsConfiguration(DSI_Handle_t *hdsi, uint32_t customlane, uint32_t lane, uint32_t active)
1036{
1037 if(hdsi == NULL)
1038 return E_PAR;
1039 active &= 1;
1040 if(customlane == DSI_SWAP_LANE_PINS){
1041 if(lane == DSI_CLOCK_LANE) /* SWAP PINS on clock lane */
1042 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_SWCL, ((uint32_t)active << 6));
1043 else if(lane == DSI_DATA_LANE0) /* SWAP PINS on data lane 0 */
1044 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_SWDL0, ((uint32_t)active << 7));
1045 else if(lane == DSI_DATA_LANE1) /* SWAP PINS on data lane 1 */
1046 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_SWDL1, ((uint32_t)active << 8));
1047 else
1048 return E_PAR;
1049 }
1050 else if(customlane == DSI_INVERT_HS_SIGNAL){
1051 if(lane == DSI_CLOCK_LANE) /* INVERT HS SIGNAL on clock lane */
1052 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_HSICL, ((uint32_t)active << 9));
1053 else if(lane == DSI_DATA_LANE0) /* INVERT HS SIGNAL on data lane 0 */
1054 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_HSIDL0, ((uint32_t)active << 10));
1055 else if(lane == DSI_DATA_LANE1) /* INVERT HS SIGNAL on data lane 1 */
1056 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_HSIDL1, ((uint32_t)active << 11));
1057 else
1058 return E_PAR;
1059 }
1060 else
1061 return E_PAR;
1062 return E_OK;
1063}
1064
1065/*
1066 * PHYタイミング設定
1067 * parameter1 hdsi DSIハンドラへのポインタ
1068 * parameter2 timing 設定タイムング
1069 * parameter3 active DSI_ACTIVE/DSI_INACTIVE
1070 * parameter4 value 設定値 the configuration information for the DSI.
1071 * return 正常ならE_OK
1072 */
1073ER
1074dsi_setPHYTiming(DSI_Handle_t *hdsi, uint32_t timing, uint32_t active, uint32_t Value)
1075{
1076 if(hdsi == NULL)
1077 return E_PAR;
1078 active &= 1;
1079 switch(timing){
1080 case DSI_TCLK_POST:
1081 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_TCLKPOSTEN, (active << 27));
1082 if(active == DSI_ACTIVE)
1083 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR4), DSI_WPCR4_TCLKPOST, Value & DSI_WPCR4_TCLKPOST);
1084 break;
1085 case DSI_TLPX_CLK:
1086 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_TLPXCEN, (active << 26));
1087 if(active == DSI_ACTIVE)
1088 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR3), DSI_WPCR3_TLPXC, (Value << 24) & DSI_WPCR3_TLPXC);
1089 break;
1090 case DSI_THS_EXIT:
1091 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_THSEXITEN, (active << 25));
1092 if(active == DSI_ACTIVE)
1093 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR3), DSI_WPCR3_THSEXIT, (Value << 16) & DSI_WPCR3_THSEXIT);
1094 break;
1095 case DSI_TLPX_DATA:
1096 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_TLPXDEN, (active << 24));
1097 if(active == DSI_ACTIVE)
1098 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR3), DSI_WPCR3_TLPXD, (Value << 8) & DSI_WPCR3_TLPXD);
1099 break;
1100 case DSI_THS_ZERO:
1101 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_THSZEROEN, (active << 23));
1102 if(active == DSI_ACTIVE)
1103 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR3), DSI_WPCR3_THSZERO, Value & DSI_WPCR3_THSZERO);
1104 break;
1105 case DSI_THS_TRAIL:
1106 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_THSTRAILEN, (active << 22));
1107 if(active == DSI_ACTIVE)
1108 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR2), DSI_WPCR2_THSTRAIL, (Value << 24) & DSI_WPCR2_THSTRAIL);
1109 break;
1110 case DSI_THS_PREPARE:
1111 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_THSPREPEN, (active << 21));
1112 if(active == DSI_ACTIVE)
1113 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR2), DSI_WPCR2_THSPREP, (Value << 16) & DSI_WPCR2_THSPREP);
1114 break;
1115 case DSI_TCLK_ZERO:
1116 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_TCLKZEROEN, (active << 20));
1117 if(active == DSI_ACTIVE)
1118 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR2), DSI_WPCR2_TCLKZERO, (Value << 8) & DSI_WPCR2_TCLKZERO);
1119 break;
1120 case DSI_TCLK_PREPARE:
1121 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_TCLKPREPEN, (active << 19));
1122 if(active == DSI_ACTIVE)
1123 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR2), DSI_WPCR2_TCLKPREP, Value & DSI_WPCR2_TCLKPREP);
1124 break;
1125 default:
1126 return E_PAR;
1127 }
1128 return E_OK;
1129}
1130
1131/*
1132 * クロック/データレーン強制停止
1133 * parameter1 hdsi DSIハンドラへのポインタ
1134 * parameter2 lane レーン選択(DSI_CLOCK_LANE/DSI_DATA_LANES)
1135 * parameter3 actine DSI_ACTIVE/DSI_INACTIVE
1136 * return 正常ならE_OK
1137 */
1138ER
1139dsi_forceTXStopMode(DSI_Handle_t *hdsi, uint32_t lane, uint32_t active)
1140{
1141 if(hdsi == NULL)
1142 return E_PAR;
1143 if(lane == DSI_CLOCK_LANE){
1144 /*
1145 * クロックレーンストップ
1146 */
1147 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_FTXSMCL, (active << 12));
1148 }
1149 else if(lane == DSI_DATA_LANES){
1150 /*
1151 * データレーンストップ
1152 */
1153 sil_modw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WPCR0), DSI_WPCR0_FTXSMDL, (active << 13));
1154 }
1155 return E_OK;
1156}
1157
1158/*
1159 * DSI割込みハンドラ
1160 */
1161void dsi_irqhandler(DSI_Handle_t *hdsi)
1162{
1163 uint32_t isr0 = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_ISR0));
1164 uint32_t isr1 = sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_ISR1));
1165
1166 isr0 &= sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_IER0));
1167 isr1 &= sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_IER1));
1168
1169 /*
1170 * ティアリングエフェクトチェック
1171 */
1172 if((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WISR_TEIF) != 0){
1173 if((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WIER_TEIE) != 0){
1174 /*
1175 * ティアリングエフェクト割込みクリア
1176 */
1177 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WIFCR), DSI_WISR_TEIF);
1178
1179 /*
1180 * ティアリングエフェクトコールバック
1181 */
1182 if(hdsi->teffectcallback != NULL)
1183 hdsi->teffectcallback(hdsi);
1184 }
1185 }
1186
1187 /*
1188 * リフレッシュ終了イベントチェック
1189 */
1190 if((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WISR_ERIF) != 0){
1191 if((sil_rew_mem((uint32_t *)(hdsi->base+TOFF_DSI_WISR)) & DSI_WIER_ERIE) != 0){
1192 /*
1193 * リフレッシュ割込みクリア
1194 */
1195 sil_wrw_mem((uint32_t *)(hdsi->base+TOFF_DSI_WIFCR), DSI_WISR_ERIF);
1196
1197 /*
1198 * リフレッシュコールバック
1199 */
1200 if(hdsi->refreshcallback != NULL)
1201 hdsi->refreshcallback(hdsi);
1202 }
1203 }
1204
1205 /*
1206 * エラーフラグチェック
1207 */
1208 if((isr0 & DSI_INT_ACKERR_REQ) != 0)
1209 hdsi->errorcode |= DSI_ERROR_ACK;
1210 if((isr0 & DSI_INT_PHYERR_REQ) != 0)
1211 hdsi->errorcode |= DSI_ERROR_PHY;
1212 if((isr1 & DSI_ISR1_TOHSTX) != 0)
1213 hdsi->errorcode |= DSI_ERROR_TX;
1214 if((isr1 & DSI_ISR1_TOLPRX) != 0)
1215 hdsi->errorcode |= DSI_ERROR_RX;
1216 if((isr1 & (DSI_ISR1_ECCSE | DSI_ISR1_ECCME)) != 0)
1217 hdsi->errorcode |= DSI_ERROR_ECC;
1218 if((isr1 & DSI_ISR1_CRCE) != 0)
1219 hdsi->errorcode |= DSI_ERROR_CRC;
1220 if((isr1 & DSI_ISR1_PSE) != 0)
1221 hdsi->errorcode |= DSI_ERROR_PSE;
1222 if((isr1 & DSI_ISR1_EOTPE) != 0)
1223 hdsi->errorcode |= DSI_ERROR_EOT;
1224 if((isr1 & DSI_ISR1_LPWRE) != 0)
1225 hdsi->errorcode |= DSI_ERROR_OVF;
1226 if((isr1 & DSI_INT_GENERR_REQ) != 0)
1227 hdsi->errorcode |= DSI_ERROR_GEN;
1228
1229 /*
1230 * DSIエラーコールバック
1231 */
1232 if(hdsi->errorcode != DSI_ERROR_NONE){
1233 if(hdsi->errorcallback != NULL)
1234 hdsi->errorcallback(hdsi);
1235 }
1236}
1237
Note: See TracBrowser for help on using the repository browser.