source: azure_iot_hub_f767zi/trunk/asp_baseplatform/pdic/stm32f7xx/dfsdm.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: 51.5 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-2018 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 *
43 * DFSDMドライバ関数群
44 *
45 */
46#include <kernel.h>
47#include <t_syslog.h>
48#include <t_stdlib.h>
49#include "syssvc/serial.h"
50#include "syssvc/syslog.h"
51#include <target_syssvc.h>
52
53#include "device.h"
54#include "dfsdm.h"
55
56#define sil_orw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) | (b))
57#define sil_andw_mem(a, b) sil_wrw_mem((a), sil_rew_mem(a) & ~(b))
58#define sil_modw_mem(a, b, c) sil_wrw_mem((a), (sil_rew_mem(a) & (~b)) | (c))
59#define get_channelno(b) (((b)-TADR_DFSDM1_BASE) / 0x20)
60
61/*
62 * SAIポート定義
63 */
64#define SAI1_PORTID 1
65#define SAI2_PORTID 2
66
67/*
68 * タイムアウト時間定義
69 */
70#define HAL_MAX_DELAY 0xFFFFFFFFU
71#define PLLI2S_TIMEOUT_VALUE 100 /* Timeout value fixed to 100 ms */
72#define DFSDM_CKAB_TIMEOUT 5000
73
74/*
75 * チャネル設定定義
76 */
77#define DFSDM_LSB_MASK 0x0000FFFF
78#define DFSDM1_CHANNEL_NUMBER 8
79
80/*
81 * オーディオ周波数の定義
82 */
83#define AUDIO_FREQUENCY_44K ((uint32_t)44100)
84#define AUDIO_FREQUENCY_22K ((uint32_t)22050)
85#define AUDIO_FREQUENCY_11K ((uint32_t)11025)
86
87/*
88 * チャネル情報
89 */
90static volatile uint32_t Dfsdm1ChannelCounter = 0;
91static DFSDM_Channel_Handle_t* Dfsdm1ChannelHandle[DFSDM1_CHANNEL_NUMBER] = {NULL};
92
93
94/*
95 * DFSDMクロックコンフィグレーション
96 * parameter1 port:SAI PORTID
97 * parameter2 AudioFreq: Audio周波数
98 * parameter3 Params: 補助パラメータポインタ
99 */
100void
101dfsdm_clockconfig(ID port, uint32_t AudioFreq)
102{
103 uint32_t PLLI2SN, PLLI2SQ, PLLI2SDivQ;
104 uint32_t tick = 0;
105
106 /*
107 * AUDIO周波数からPLL設定値の取得
108 */
109 if((AudioFreq == AUDIO_FREQUENCY_11K) || (AudioFreq == AUDIO_FREQUENCY_22K) || (AudioFreq == AUDIO_FREQUENCY_44K)){
110 /* Configure PLLI2S prescalers */
111 /* PLLI2S_VCO: VCO_429M
112 I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 429/2 = 214.5 Mhz
113 I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 214.5/19 = 11.289 Mhz */
114 PLLI2SN = 429;
115 PLLI2SQ = 2;
116 PLLI2SDivQ = 19;
117 }
118 else /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_48K, AUDIO_FREQUENCY_96K */{
119 /* I2S clock config
120 PLLI2S_VCO: VCO_344M
121 I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 344/7 = 49.142 Mhz
122 I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 49.142/1 = 49.142 Mhz */
123 PLLI2SN = 344;
124 PLLI2SQ = 7;
125 PLLI2SDivQ = 1;
126 }
127
128 /*
129 * SAI1/2クロック設定
130 */
131 if(port == SAI1_PORTID){
132 sil_modw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR1), RCC_DCKCFGR1_SAI1SEL, RCC_DCKCFGR1_SAI1SEL_0);
133 }
134 else{
135 sil_modw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR1), RCC_DCKCFGR1_SAI2SEL, RCC_DCKCFGR1_SAI2SEL_0);
136 }
137
138 /*
139 * PLLI2Sデゼーブル
140 */
141 sil_andw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLI2SON);
142
143 /*
144 * PLLI2S停止待ち
145 */
146 tick = 0;
147 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLI2SRDY) != 0){
148 if(tick > PLLI2S_TIMEOUT_VALUE){
149 return; /* タイムアウトエラー */
150 }
151 dly_tsk(1);
152 tick++;
153 }
154
155 /*
156 * PLLI2SSN/PLLI2SN値設定
157 */
158 sil_modw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_PLLI2SCFGR), (RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ), ((PLLI2SN << 6) | (PLLI2SQ << 24)));
159
160 /*
161 * PLLI2SDIVQ設定
162 */
163 sil_modw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR1), RCC_DCKCFGR1_PLLI2SDIVQ, (PLLI2SDivQ-1));
164
165 /*
166 * PLLI2Sイネーブル
167 */
168 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLI2SON);
169
170 /*
171 * PLLI2S再開待ち
172 */
173 tick = 0;
174 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLI2SRDY) == 0){
175 if(tick > PLLI2S_TIMEOUT_VALUE){
176 return; /* タイムアウトエラー */
177 }
178 dly_tsk(1);
179 tick++;
180 }
181}
182
183/*
184 * DFSDMチャネル初期化
185 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
186 * return 正常終了時、E_OK
187 */
188ER dfsdm_channel_init(DFSDM_Channel_Handle_t *hdfsc)
189{
190 /*
191 * パラメータチェック
192 */
193 if(hdfsc == NULL)
194 return E_PAR;
195 if((hdfsc->Init.OutClockActivation & DFSDM_MASK) != 0)
196 return E_PAR;
197 if(hdfsc->Init.InputMultiplexer != DFSDM_CHANNEL_EXTERNAL_INPUTS &&
198 hdfsc->Init.InputMultiplexer != DFSDM_CHANNEL_INTERNAL_REGISTER)
199 return E_PAR;
200 if(hdfsc->Init.InputDataPacking != DFSDM_CHANNEL_STANDARD_MODE &&
201 hdfsc->Init.InputDataPacking != DFSDM_CHANNEL_INTERLEAVED_MODE &&
202 hdfsc->Init.InputDataPacking != DFSDM_CHANNEL_DUAL_MODE)
203 return E_PAR;
204 if(hdfsc->Init.InputPins != DFSDM_CHANNEL_SAME_CHANNEL_PINS &&
205 hdfsc->Init.InputPins != DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS)
206 return E_PAR;
207 if(hdfsc->Init.SerialType != DFSDM_CHANNEL_SPI_RISING &&
208 hdfsc->Init.SerialType != DFSDM_CHANNEL_SPI_FALLING &&
209 hdfsc->Init.SerialType != DFSDM_CHANNEL_MANCHESTER_RISING &&
210 hdfsc->Init.SerialType != DFSDM_CHANNEL_MANCHESTER_FALLING)
211 return E_PAR;
212 if(hdfsc->Init.SerialSpiClock != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL &&
213 hdfsc->Init.SerialSpiClock != DFSDM_CHANNEL_SPI_CLOCK_INTERNAL &&
214 hdfsc->Init.SerialSpiClock != DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING &&
215 hdfsc->Init.SerialSpiClock != DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING)
216 return E_PAR;
217 if(hdfsc->Init.AwdFilterOrder != DFSDM_CHANNEL_FASTSINC_ORDER &&
218 hdfsc->Init.AwdFilterOrder != DFSDM_CHANNEL_SINC1_ORDER &&
219 hdfsc->Init.AwdFilterOrder != DFSDM_CHANNEL_SINC2_ORDER &&
220 hdfsc->Init.AwdFilterOrder != DFSDM_CHANNEL_SINC3_ORDER)
221 return E_PAR;
222 if(hdfsc->Init.AwdOversampling < 1 || hdfsc->Init.AwdOversampling > 32)
223 return E_PAR;
224 if(hdfsc->Init.Offset < -8388608 || hdfsc->Init.Offset > 8388607)
225 return E_PAR;
226 if(hdfsc->Init.RightBitShift > 0x1F)
227 return E_PAR;
228
229 /*
230 * チャネル設定テーブルのチェック
231 */
232 if(Dfsdm1ChannelHandle[get_channelno(hdfsc->base)] != NULL)
233 return E_OBJ;
234
235 /*
236 * グローバルDFSDM設定
237 */
238 if(++Dfsdm1ChannelCounter == 1){
239 /*
240 * アウトプット・シリアルクロックソース設定
241 */
242 sil_andw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CKOUTSRC);
243 sil_orw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), hdfsc->Init.OutClockSelection);
244
245 /*
246 * クロック分周設定
247 */
248 sil_andw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CKOUTDIV);
249 if(hdfsc->Init.OutClockActivation == DFSDM_ENABLE)
250 sil_orw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), ((hdfsc->Init.OutClockDivider - 1) << 16));
251
252 /*
253 * DFSDMグローバルインターフェイス設定
254 */
255 sil_orw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_DFSDMEN);
256 }
257
258 /*
259 * チャネル入力設定
260 */
261 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), (DFSDM_CHCFGR1_DATPACK | DFSDM_CHCFGR1_DATMPX | DFSDM_CHCFGR1_CHINSEL));
262 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), (hdfsc->Init.InputMultiplexer | hdfsc->Init.InputDataPacking | hdfsc->Init.InputPins));
263
264 /*
265 * シリアルインターフェース設定
266 */
267 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), (DFSDM_CHCFGR1_SITP | DFSDM_CHCFGR1_SPICKSEL));
268 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), (hdfsc->Init.SerialType | hdfsc->Init.SerialSpiClock));
269
270 /*
271 * アナログウォッチドッグ設定
272 */
273 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHAWSCDR), (DFSDM_CHAWSCDR_AWFORD | DFSDM_CHAWSCDR_AWFOSR));
274 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHAWSCDR), (hdfsc->Init.AwdFilterOrder | ((hdfsc->Init.AwdOversampling - 1) << 16)));
275
276 /*
277 * チャネルオフセット、ライトビットシフト設定
278 */
279 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR2), (DFSDM_CHCFGR2_OFFSET | DFSDM_CHCFGR2_DTRBS));
280 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR2), ((hdfsc->Init.Offset << 8) | (hdfsc->Init.RightBitShift << 3)));
281
282 /*
283 * DFSDMチャネル有効化
284 */
285 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CHEN);
286 hdfsc->state = DFSDM_CHANNEL_STATE_READY;
287
288 /*
289 * DFSDMチャネルテーブル設定
290 */
291 Dfsdm1ChannelHandle[get_channelno(hdfsc->base)] = hdfsc;
292 return E_OK;
293}
294
295/*
296 * DFSDMチャネル無効化
297 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
298 * return 正常終了時、E_OK
299 */
300ER
301dfsdm_channel_deinit(DFSDM_Channel_Handle_t *hdfsc)
302{
303 if(hdfsc == NULL)
304 return E_PAR;
305
306 /*
307 * DFSDMチャネルテーブルチェック
308 */
309 if(Dfsdm1ChannelHandle[get_channelno(hdfsc->base)] == NULL){
310 return E_OBJ;
311 }
312
313 /*
314 * DFSDMチャネル無効化
315 */
316 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CHEN);
317
318 /*
319 * グローバルDFSDM無効化
320 */
321 if(--Dfsdm1ChannelCounter == 0){
322 sil_andw_mem((uint32_t *)(TADR_DFSDM1_CHANNEL0_BASE+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_DFSDMEN);
323 }
324
325 /*
326 * DFSDMチャネルテーブルリセット
327 */
328 hdfsc->state = DFSDM_CHANNEL_STATE_RESET;
329 Dfsdm1ChannelHandle[get_channelno(hdfsc->base)] = (DFSDM_Channel_Handle_t *)NULL;
330 return E_OK;
331}
332
333
334/*
335 * クロック・アブセンススタート
336 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
337 * return 正常終了時、E_OK
338 */
339ER
340dfsdm_channelCkabStart(DFSDM_Channel_Handle_t *hdfsc)
341{
342 uint32_t channel;
343 uint32_t tick = 0;
344
345 if(hdfsc == NULL)
346 return E_PAR;
347
348 if(hdfsc->state != DFSDM_CHANNEL_STATE_READY) /* 状態判定 */
349 return E_OBJ;
350
351 /*
352 * チャネル番号取得
353 */
354 channel = get_channelno(hdfsc->base);
355
356 /*
357 * クロックアブセンス・フラグクリア
358 */
359 while((((sil_rew_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTISR)) & DFSDM_FLTISR_CKABF) >> (16 + channel)) & 1) != 0){
360 sil_wrw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTICR), (1 << (16 + channel)));
361 if(tick++ > DFSDM_CKAB_TIMEOUT)
362 return E_TMOUT; /* タイムアウト */
363 dly_tsk(1);
364 }
365
366 /*
367 * クロックアブセンス割込み設定
368 */
369 sil_orw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_CKABIE);
370
371 /*
372 * クロックアブセンス・スタート
373 */
374 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CKABEN);
375 return E_OK;
376}
377
378/*
379 * クロック・アブセンスストップ
380 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
381 * return 正常終了時、E_OK
382 */
383ER
384dfsdm_channelCkabStop(DFSDM_Channel_Handle_t *hdfsc)
385{
386 uint32_t channel;
387
388 if(hdfsc == NULL)
389 return E_PAR;
390
391 if(hdfsc->state != DFSDM_CHANNEL_STATE_READY) /* 状態判定 */
392 return E_OBJ;
393
394 /*
395 * クロックアブセンス・停止
396 */
397 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_CKABEN);
398
399 /*
400 * クロックアブセンス・フラグクリア
401 */
402 channel = get_channelno(hdfsc->base);
403 sil_wrw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTICR), (1 << (16 + channel)));
404
405 /*
406 * クロックアブセンス割込み停止
407 */
408 sil_andw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_CKABIE);
409 return E_OK;
410}
411
412/*
413 * ショート・サーキットスタート
414 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
415 * parameter2 Threshold ショート・サーキット・スレッシュホールド(0-255)
416 * parameter3 BreakSignal ブレークシグナル
417 * return 正常終了時、E_OK
418 */
419ER
420dfsdm_channelScdStart(DFSDM_Channel_Handle_t *hdfsc, uint32_t Threshold, uint32_t BreakSignal)
421{
422 if(hdfsc == NULL)
423 return E_PAR;
424 if(Threshold > 255)
425 return E_PAR;
426 if(BreakSignal > 15)
427 return E_PAR;
428
429 if(hdfsc->state != DFSDM_CHANNEL_STATE_READY) /* 状態判定 */
430 return E_OBJ;
431
432 /*
433 * ショート・サーキット割込み設定
434 */
435 sil_orw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_SCDIE);
436
437 /*
438 * スレッシュホールド、ブレークシグナル設定
439 */
440 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHAWSCDR), (DFSDM_CHAWSCDR_BKSCD | DFSDM_CHAWSCDR_SCDT));
441 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHAWSCDR), ((BreakSignal << 12) | Threshold));
442
443 /*
444 * ショート・サーキットスタート
445 */
446 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_SCDEN);
447 return E_OK;
448}
449
450/*
451 * ショート・サーキットストップ
452 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
453 * return 正常終了時、E_OK
454 */
455ER
456dfsdm_channelScdStop(DFSDM_Channel_Handle_t *hdfsc)
457{
458 uint32_t channel;
459
460 if(hdfsc == NULL)
461 return E_PAR;
462
463 if(hdfsc->state != DFSDM_CHANNEL_STATE_READY) /* 状態判定 */
464 return E_OBJ;
465
466 /*
467 * ショート・サーキット停止
468 */
469 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR1), DFSDM_CHCFGR1_SCDEN);
470
471 /*
472 * ショート・サーキットフラグクリア
473 */
474 channel = get_channelno(hdfsc->base);
475 sil_wrw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTICR), (1 << (24 + channel)));
476
477 /*
478 * ショート・サーキット割込み停止
479 */
480 sil_andw_mem((uint32_t *)(TADR_DFSDM1_FILTER0_BASE+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_SCDIE);
481 return E_OK;
482}
483
484/*
485 * アナログ・ウォッチドッグ値取得
486 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
487 * return アナログ・ウォッチドッグ値
488 */
489int16_t
490dfsdm_channelGetAwdValue(DFSDM_Channel_Handle_t *hdfsc)
491{
492 return (int16_t)sil_rew_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHWDATAR));
493}
494
495/*
496 * チャネルオフセット値変更
497 * parameter1 hdfsc DFSDMチャネルハンドラへのポインタ
498 * parameter2 Offset チャネルオフセット値(-8388608 - 8388607)
499 * return 正常終了時、E_OK
500 */
501ER
502dfsdm_channelModifyOffset(DFSDM_Channel_Handle_t *hdfsc, int32_t Offset)
503{
504 if(hdfsc == NULL)
505 return E_PAR;
506 if(Offset < -8388608 || Offset > 8388607)
507 return E_PAR;
508
509 if(hdfsc->state != DFSDM_CHANNEL_STATE_READY)
510 return E_OBJ;
511
512 /*
513 * チャネルオフセット値設定
514 */
515 sil_andw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR2), DFSDM_CHCFGR2_OFFSET);
516 sil_orw_mem((uint32_t *)(hdfsc->base+TOFF_DFSDM_CHCFGR2), ((uint32_t) Offset << 8));
517 return E_OK;
518}
519
520
521/*
522 * インジェクトチャネル数取得
523 */
524static uint32_t
525DFSDM_GetInjChannelsNbr(uint32_t Channels)
526{
527 uint32_t nbChannels = 0;
528 uint32_t tmp = (Channels & DFSDM_LSB_MASK);
529
530 /*
531 * チャネルビットフィールドから数を取得
532 */
533 while(tmp != 0){
534 if((tmp & 1) != 0)
535 nbChannels++;
536 tmp >>= 1;
537 }
538 return nbChannels;
539}
540
541/*
542 * レギュラー変換設定
543 */
544static void
545DFSDM_RegConvStart(DFSDM_Filter_Handle_t* hdfsf)
546{
547 /*
548 * レギュラートリガなら即スタート
549 */
550 if(hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER)
551 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSWSTART);
552 else{ /* シンクロナストリガの場合 */
553 /*
554 * DFSDMフィルターディゼーブル
555 */
556 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
557
558 /*
559 * RSYNCビットセット
560 */
561 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSYNC);
562
563 /*
564 * DFSDMフィルターイネーブル
565 */
566 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
567
568 /*
569 * インジェクト変換中なら再スタート
570 */
571 if(hdfsf->state == DFSDM_FILTER_STATE_INJ){
572 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER)
573 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSWSTART);
574 hdfsf->InjConvRemaining = (hdfsf->Init.InjScanMode == DFSDM_ENABLE) ? hdfsf->InjectedChannelsNbr : 1;
575 }
576 }
577 /*
578 * DFSDMフィルター状態更新
579 */
580 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_READY) ? DFSDM_FILTER_STATE_REG : DFSDM_FILTER_STATE_REG_INJ;
581}
582
583/*
584 * レギュラー変換停止
585 */
586static void
587DFSDM_RegConvStop(DFSDM_Filter_Handle_t* hdfsf)
588{
589 /*
590 * DFSDMフィルターディゼーブル
591 */
592 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
593
594 /*
595 * シンクロナストリガなら RSYNCビットリセット
596 */
597 if(hdfsf->Init.RegTrigger == DFSDM_FILTER_SYNC_TRIGGER)
598 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSYNC);
599
600 /*
601 * DFSDMフィルターイネーブル
602 */
603 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
604
605 /*
606 * インジェクト変換中ならリスタート
607 */
608 if(hdfsf->state == DFSDM_FILTER_STATE_REG_INJ){
609 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER)
610 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSWSTART);
611 hdfsf->InjConvRemaining = (hdfsf->Init.InjScanMode == DFSDM_ENABLE) ? hdfsf->InjectedChannelsNbr : 1;
612 }
613
614 /*
615 * DFSDMフィルター状態更新
616 */
617 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_REG) ? DFSDM_FILTER_STATE_READY : DFSDM_FILTER_STATE_INJ;
618}
619
620/*
621 * インジェクト変換設定
622 */
623static void
624DFSDM_InjConvStart(DFSDM_Filter_Handle_t* hdfsf)
625{
626 /*
627 * インジェクトトリガなら即スタート
628 */
629 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER)
630 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSWSTART);
631 else{ /* 外部またはシンクロナストリガの場合 */
632 /*
633 * DFSDMフィルターディゼーブル
634 */
635 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
636
637 /*
638 * シンクロナストリガならJSYNCビットセット
639 * 外部トリガならJEXTENビットセット
640 */
641 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SYNC_TRIGGER)
642 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSYNC);
643 else
644 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), hdfsf->Init.InjExtTriggerEdge);
645
646 /*
647 * DFSDMフィルターイネーブル
648 */
649 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
650
651 /* If regular conversion was in progress, restart it */
652 if(hdfsf->state == DFSDM_FILTER_STATE_REG && hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER)
653 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSWSTART);
654 }
655
656 /*
657 * DFSDMフィルター状態更新
658 */
659 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_READY) ? DFSDM_FILTER_STATE_INJ : DFSDM_FILTER_STATE_REG_INJ;
660}
661
662/*
663 * インジェクト変換停止
664 */
665static void
666DFSDM_InjConvStop(DFSDM_Filter_Handle_t* hdfsf)
667{
668 /*
669 * DFSDMフィルターディゼーブル
670 */
671 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
672
673 /*
674 * シンクロナストリガならJSYNCビットリセット
675 * 外部トリガならJEXTENビットリセット
676 */
677 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SYNC_TRIGGER)
678 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSYNC);
679 else if(hdfsf->Init.InjTrigger == DFSDM_FILTER_EXT_TRIGGER)
680 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JEXTEN);
681
682 /*
683 * DFSDMフィルターイネーブル
684 */
685 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
686
687 /*
688 * レギュラー変換中なら、リスタート
689 */
690 if(hdfsf->state == DFSDM_FILTER_STATE_REG_INJ && hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER)
691 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSWSTART);
692
693 /*
694 * インジェクト状態更新
695 */
696 hdfsf->InjConvRemaining = (hdfsf->Init.InjScanMode == DFSDM_ENABLE) ? hdfsf->InjectedChannelsNbr : 1;
697
698 /*
699 * DFSDMフィルター状態更新
700 */
701 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_INJ) ? DFSDM_FILTER_STATE_READY : DFSDM_FILTER_STATE_REG;
702}
703
704
705/*
706 * DFSDMフィルター初期化
707 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
708 * return 正常終了時、E_OK
709 */
710ER
711dfsdm_filter_init(DFSDM_Filter_Handle_t *hdfsf)
712{
713 if(hdfsf == NULL)
714 return E_PAR;
715 if(hdfsf->Init.RegTrigger != DFSDM_FILTER_SW_TRIGGER && hdfsf->Init.RegTrigger != DFSDM_FILTER_SYNC_TRIGGER)
716 return E_PAR;
717 if((hdfsf->Init.RegFastMode & DFSDM_MASK) != 0)
718 return E_PAR;
719 if((hdfsf->Init.RegDmaMode & DFSDM_MASK) != 0)
720 return E_PAR;
721 if((hdfsf->Init.InjScanMode & DFSDM_MASK) != 0)
722 return E_PAR;
723 if((hdfsf->Init.InjDmaMode & DFSDM_MASK) != 0)
724 return E_PAR;
725 if(hdfsf->Init.FilterSincOrder != DFSDM_FILTER_FASTSINC_ORDER &&
726 hdfsf->Init.FilterSincOrder != DFSDM_FILTER_SINC1_ORDER &&
727 hdfsf->Init.FilterSincOrder != DFSDM_FILTER_SINC2_ORDER &&
728 hdfsf->Init.FilterSincOrder != DFSDM_FILTER_SINC3_ORDER &&
729 hdfsf->Init.FilterSincOrder != DFSDM_FILTER_SINC4_ORDER &&
730 hdfsf->Init.FilterSincOrder != DFSDM_FILTER_SINC5_ORDER)
731 return E_PAR;
732 if(hdfsf->Init.FilterOversampling < 1 || hdfsf->Init.FilterOversampling > 1024)
733 return E_PAR;
734 if(hdfsf->Init.FilterIntOversampling < 1 || hdfsf->Init.FilterIntOversampling > 256)
735 return E_PAR;
736
737 /*
738 * Check parameters compatibility */
739 if((hdfsf->base == TADR_DFSDM1_FILTER0_BASE) &&
740 ((hdfsf->Init.RegTrigger == DFSDM_FILTER_SYNC_TRIGGER) ||
741 (hdfsf->Init.InjTrigger == DFSDM_FILTER_SYNC_TRIGGER)))
742 return E_PAR;
743
744 /*
745 * DFSDMフィルターデフォルト設定
746 */
747 hdfsf->RegularContMode = DFSDM_CONTINUOUS_CONV_OFF;
748 hdfsf->InjectedChannelsNbr = 1;
749 hdfsf->InjConvRemaining = 1;
750 hdfsf->errorcode = DFSDM_FILTER_ERROR_NONE;
751
752 /*
753 * レギュラー変換設定
754 */
755 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RSYNC);
756 if(hdfsf->Init.RegFastMode == DFSDM_ENABLE)
757 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_FAST);
758 else
759 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_FAST);
760
761 if(hdfsf->Init.RegDmaMode == DFSDM_ENABLE)
762 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RDMAEN);
763 else
764 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_RDMAEN);
765
766 /*
767 * インジェクト変換設定
768 */
769 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), (DFSDM_FLTCR1_JSYNC | DFSDM_FLTCR1_JEXTEN | DFSDM_FLTCR1_JEXTSEL));
770 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_EXT_TRIGGER){
771 if((hdfsf->Init.InjExtTrigger & ~DFSDM_FLTCR1_JEXTSEL) != 0)
772 return E_PAR;
773 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), hdfsf->Init.InjExtTrigger);
774 }
775
776 if(hdfsf->Init.InjScanMode == DFSDM_ENABLE)
777 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSCAN);
778 else
779 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JSCAN);
780
781 if(hdfsf->Init.InjDmaMode == DFSDM_ENABLE)
782 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JDMAEN);
783 else
784 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_JDMAEN);
785
786 /*
787 * フィルター用パラメータ設定
788 */
789 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTFCR), (DFSDM_FLTFCR_FORD | DFSDM_FLTFCR_FOSR | DFSDM_FLTFCR_IOSR));
790 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTFCR), (hdfsf->Init.FilterSincOrder |
791 ((hdfsf->Init.FilterOversampling - 1) << 16) |
792 (hdfsf->Init.FilterIntOversampling - 1)));
793
794 /*
795 * DFSDMフィルター有効化
796 */
797 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
798 hdfsf->state = DFSDM_FILTER_STATE_READY;
799 return E_OK;
800}
801
802/*
803 * DFSDMフィルター無効化
804 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
805 * return 正常終了時、E_OK
806 */
807ER
808dfsdm_filter_deinit(DFSDM_Filter_Handle_t *hdfsf)
809{
810 if(hdfsf == NULL)
811 return E_PAR;
812
813 /*
814 * DFSDMフィルター有効化
815 */
816 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_DFEN);
817 hdfsf->state = DFSDM_FILTER_STATE_RESET;
818 return E_OK;
819}
820
821/*
822 * DFSDMフィルターレギュラー変換設定
823 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
824 * parameter2 Channel チャネル番号
825 * parameter3 ContMode コンティニュー有効無効設定
826 * return 正常終了時、E_OK
827 */
828ER
829dfsdm_filter_config_reg(DFSDM_Filter_Handle_t *hdfsf, uint32_t Channel, uint32_t ContinuousMode)
830{
831 if(hdfsf == NULL)
832 return E_PAR;
833 if(Channel < DFSDM_CHANNEL_0 || Channel > DFSDM_CHANNEL_7)
834 return E_PAR;
835 if(ContinuousMode != DFSDM_CONTINUOUS_CONV_OFF && ContinuousMode != DFSDM_CONTINUOUS_CONV_ON)
836 return E_PAR;
837
838 /*
839 * 状態判定
840 */
841 if(hdfsf->state != DFSDM_FILTER_STATE_RESET && hdfsf->state != DFSDM_FILTER_STATE_ERROR){
842 /*
843 * レギュラー変換用、チャネルと継続モード設定
844 */
845 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), (DFSDM_FLTCR1_RCH | DFSDM_FLTCR1_RCONT));
846 if(ContinuousMode == DFSDM_CONTINUOUS_CONV_ON)
847 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), (((Channel << 8) & DFSDM_FLTCR1_RCH) |
848 DFSDM_FLTCR1_RCONT));
849 else
850 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), ((Channel << 8) & DFSDM_FLTCR1_RCH));
851 hdfsf->RegularContMode = ContinuousMode;
852 return E_OK;
853 }
854 else
855 return E_OBJ;
856}
857
858/*
859 * DFSDMフィルターインジェクト変換設定
860 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
861 * parameter2 Channel チャネル番号
862 * return 正常終了時、E_OK
863 */
864ER dfsdm_filter_config_inj(DFSDM_Filter_Handle_t *hdfsf, uint32_t Channel)
865{
866 if(hdfsf == NULL)
867 return E_PAR;
868
869 if(Channel == 0 || Channel > 0x000F00FF)
870 return E_PAR;
871
872 /*
873 * 状態判定
874 */
875 if(hdfsf->state != DFSDM_FILTER_STATE_RESET && hdfsf->state != DFSDM_FILTER_STATE_ERROR){
876 /*
877 * インジェクト変換用、チャネル設定
878 */
879 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTJCHGR), (Channel & DFSDM_LSB_MASK));
880 hdfsf->InjectedChannelsNbr = DFSDM_GetInjChannelsNbr(Channel);
881 hdfsf->InjConvRemaining = (hdfsf->Init.InjScanMode == DFSDM_ENABLE) ? hdfsf->InjectedChannelsNbr : 1;
882 return E_OK;
883 }
884 else
885 return E_OBJ;
886}
887
888/*
889 * DFSDMフィルターレギュラー変換DMAハーフ終了コールバック
890 */
891static void
892DFSDM_DMARegularHalfConvCplt(DMA_Handle_t *hdma)
893{
894 DFSDM_Filter_Handle_t* hdfsf = (DFSDM_Filter_Handle_t*) ((DMA_Handle_t*)hdma)->localdata;
895
896 /*
897 * コールバック関数の呼び出し
898 */
899 if(hdfsf->regconvhalfcallback != NULL)
900 hdfsf->regconvhalfcallback(hdfsf);
901}
902
903/*
904 * DFSDMフィルターレギュラー変換DMA終了コールバック
905 */
906static void
907DFSDM_DMARegularConvCplt(DMA_Handle_t *hdma)
908{
909 DFSDM_Filter_Handle_t* hdfsf = (DFSDM_Filter_Handle_t*) ((DMA_Handle_t*)hdma)->localdata;
910
911 /*
912 * コールバック関数の呼び出し
913 */
914 if(hdfsf->regconvcallback != NULL)
915 hdfsf->regconvcallback(hdfsf);
916}
917
918/*
919 * DFSDMフィルターインジェクト変換DMAハーフ終了コールバック
920 */
921static void
922DFSDM_DMAInjectedHalfConvCplt(DMA_Handle_t *hdma)
923{
924 DFSDM_Filter_Handle_t* hdfsf = (DFSDM_Filter_Handle_t*) ((DMA_Handle_t*)hdma)->localdata;
925
926 /*
927 * コールバック関数の呼び出し
928 */
929 if(hdfsf->injconvhalfcallback != NULL)
930 hdfsf->injconvhalfcallback(hdfsf);
931}
932
933/*
934 * DFSDMフィルターインジェクト変換DMA終了コールバック
935 */
936static void
937DFSDM_DMAInjectedConvCplt(DMA_Handle_t *hdma)
938{
939 DFSDM_Filter_Handle_t* hdfsf = (DFSDM_Filter_Handle_t*) ((DMA_Handle_t*)hdma)->localdata;
940
941 /*
942 * コールバック関数の呼び出し
943 */
944 if(hdfsf->injconvcallback != NULL)
945 hdfsf->injconvcallback(hdfsf);
946}
947
948/*
949 * DFSDMフィルターDMAエラーコールバック
950 */
951static void
952DFSDM_DMAError(DMA_Handle_t *hdma)
953{
954 DFSDM_Filter_Handle_t* hdfsf = (DFSDM_Filter_Handle_t*) ((DMA_Handle_t*)hdma)->localdata;
955
956 /*
957 * エラーコード設定
958 */
959 hdfsf->errorcode = DFSDM_FILTER_ERROR_DMA;
960
961 /*
962 * DMAエラーコールバック
963 */
964 if(hdfsf->errorcallback != NULL)
965 hdfsf->errorcallback(hdfsf);
966}
967
968
969/*
970 * DFSDMフィルターレギュラー変換スタート(32BIT変換)
971 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
972 * paramter 2 pData 変換データ設定領域のポインタ
973 * parameter3 Length 領域長
974 * return 正常終了時、E_OK
975 */
976ER
977dfsdm_filterRegularStart(DFSDM_Filter_Handle_t *hdfsf, int32_t *pData, uint32_t Length)
978{
979 if(hdfsf == NULL || pData == NULL || Length == 0)
980 return E_PAR;
981
982 /*
983 * 初期設定値の確認
984 */
985 if((hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER) && \
986 (hdfsf->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \
987 (hdfsf->hdmaReg->Init.Mode == DMA_NORMAL) && Length != 1)
988 return E_PAR;
989
990 if((hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER) && \
991 (hdfsf->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \
992 (hdfsf->hdmaReg->Init.Mode == DMA_CIRCULAR))
993 return E_OBJ;
994
995 /*
996 * DMAの有効確認
997 */
998 if((sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1)) & DFSDM_FLTCR1_RDMAEN) == 0)
999 return E_OBJ;
1000
1001 /*
1002 * DFSDMフィルターの状態チェック
1003 */
1004 if(hdfsf->state == DFSDM_FILTER_STATE_READY || hdfsf->state == DFSDM_FILTER_STATE_INJ){
1005 ER ercd = E_OK;
1006 /*
1007 * コールバック関数の設定
1008 */
1009 hdfsf->hdmaReg->xfercallback = DFSDM_DMARegularConvCplt;
1010 hdfsf->hdmaReg->errorcallback = DFSDM_DMAError;
1011 hdfsf->hdmaReg->xferhalfcallback = (hdfsf->hdmaReg->Init.Mode == DMA_CIRCULAR) ? DFSDM_DMARegularHalfConvCplt : NULL;
1012
1013 /*
1014 * DMAスタート
1015 */
1016 if((ercd = dma_start(hdfsf->hdmaReg, (uint32_t)(hdfsf->base+TOFF_DFSDM_FLTRDATAR), (uint32_t)pData, Length)) != E_OK)
1017 hdfsf->state = DFSDM_FILTER_STATE_ERROR; /* DMAエラー */
1018 else /* レギュラー変換スタート */
1019 DFSDM_RegConvStart(hdfsf);
1020 return ercd;
1021 }
1022 else
1023 return E_OBJ;
1024}
1025
1026/*
1027 * DFSDMフィルターレギュラー変換スタート(16BIT変換)
1028 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1029 * paramter 2 pData 変換データ設定領域のポインタ
1030 * parameter3 Length 領域長
1031 * return 正常終了時、E_OK
1032 */
1033ER
1034dfsdm_filterRegularMsbStart(DFSDM_Filter_Handle_t *hdfsf, int16_t *pData, uint32_t Length)
1035{
1036 if(hdfsf == NULL || pData == NULL || Length == 0)
1037 return E_PAR;
1038
1039 /*
1040 * 初期設定値の確認
1041 */
1042 if((hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER) && \
1043 (hdfsf->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \
1044 (hdfsf->hdmaReg->Init.Mode == DMA_NORMAL) && (Length != 1))
1045 return E_PAR;
1046
1047 if((hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER) && \
1048 (hdfsf->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \
1049 (hdfsf->hdmaReg->Init.Mode == DMA_CIRCULAR))
1050 return E_OBJ;
1051
1052 /*
1053 * DMAの有効確認
1054 */
1055 if((sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1)) & DFSDM_FLTCR1_RDMAEN) == 0)
1056 return E_OBJ;
1057
1058 /*
1059 * DFSDMフィルターの状態チェック
1060 */
1061 if(hdfsf->state == DFSDM_FILTER_STATE_READY || hdfsf->state == DFSDM_FILTER_STATE_INJ){
1062 ER ercd = E_OK;
1063 /*
1064 * コールバック関数の設定
1065 */
1066 hdfsf->hdmaReg->xfercallback = DFSDM_DMARegularConvCplt;
1067 hdfsf->hdmaReg->errorcallback = DFSDM_DMAError;
1068 hdfsf->hdmaReg->xferhalfcallback = (hdfsf->hdmaReg->Init.Mode == DMA_CIRCULAR) ? DFSDM_DMARegularHalfConvCplt : NULL;
1069
1070 /*
1071 * DMAスタート
1072 */
1073 if((ercd = dma_start(hdfsf->hdmaReg, (uint32_t)(hdfsf->base+TOFF_DFSDM_FLTRDATAR+2), (uint32_t)pData, Length)) != E_OK)
1074 hdfsf->state = DFSDM_FILTER_STATE_ERROR; /* DMAスタートエラー */
1075 else /* レギュラー変換スタート */
1076 DFSDM_RegConvStart(hdfsf);
1077 return ercd;
1078 }
1079 else
1080 return E_OBJ;
1081}
1082
1083/*
1084 * DFSDMフィルターレギュラー変換停止
1085 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1086 * return 正常終了時、E_OK
1087 */
1088ER
1089dfsdm_filterRegularStop(DFSDM_Filter_Handle_t *hdfsf)
1090{
1091 ER ercd = E_OK;
1092
1093 if(hdfsf == NULL)
1094 return E_PAR;
1095
1096 /*
1097 * DFSDMフィルターの状態チェック
1098 */
1099 if(hdfsf->state != DFSDM_FILTER_STATE_REG && hdfsf->state != DFSDM_FILTER_STATE_REG_INJ)
1100 return E_OBJ;
1101
1102 /*
1103 * DMA停止
1104 */
1105 if((ercd = dma_end(hdfsf->hdmaReg)) != E_OK) /* Set DFSDM filter in error state */
1106 hdfsf->state = DFSDM_FILTER_STATE_ERROR;
1107 else /* レギュラー変換停止 */
1108 DFSDM_RegConvStop(hdfsf);
1109 return ercd;
1110}
1111
1112/*
1113 * DFSDMフィルターレギュラー変換値取得
1114 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1115 * parameter2 Channel DFSDMチャネル番号設定用ポインタ
1116 * return レギュラー変換値
1117 */
1118int32_t
1119dfsdm_filterGetRegularValue(DFSDM_Filter_Handle_t *hdfsf, uint32_t *Channel)
1120{
1121 uint32_t reg = 0;
1122
1123 if(hdfsf == NULL || Channel == NULL)
1124 return 0;
1125
1126 /*
1127 * レギュラー変換値とチャネル番号取出し
1128 */
1129 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTRDATAR));
1130
1131 /* Extract channel and regular conversion value */
1132 *Channel = (reg & DFSDM_FLTRDATAR_RDATACH);
1133 return (int32_t)((reg & DFSDM_FLTRDATAR_RDATA) >> 18);
1134}
1135
1136/*
1137 * DFSDMフィルターインジェクト変換スタート(32BIT変換)
1138 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1139 * paramter 2 pData 変換データ設定領域のポインタ
1140 * parameter3 Length 領域長
1141 * return 正常終了時、E_OK
1142 */
1143ER
1144dfsdm_filterInjectedStart(DFSDM_Filter_Handle_t *hdfsf, int32_t *pData, uint32_t Length)
1145{
1146 if(hdfsf == NULL || pData == NULL || Length == 0)
1147 return E_PAR;
1148
1149 /*
1150 * 初期設定値の確認
1151 */
1152 if((hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER) && \
1153 (hdfsf->hdmaInj->Init.Mode == DMA_NORMAL) && Length > hdfsf->InjConvRemaining)
1154 return E_PAR;
1155
1156 if((hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER) && hdfsf->hdmaInj->Init.Mode == DMA_CIRCULAR)
1157 return E_OBJ;
1158
1159 /*
1160 * DMAの有効確認
1161 */
1162 if((sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1)) & DFSDM_FLTCR1_JDMAEN) == 0)
1163 return E_OBJ;
1164
1165 /*
1166 * DFSDMフィルターの状態チェック
1167 */
1168 if(hdfsf->state == DFSDM_FILTER_STATE_READY || hdfsf->state == DFSDM_FILTER_STATE_REG){
1169 ER ercd = E_OK;
1170 /*
1171 * コールバック関数の設定
1172 */
1173 hdfsf->hdmaInj->xfercallback = DFSDM_DMAInjectedConvCplt;
1174 hdfsf->hdmaInj->errorcallback = DFSDM_DMAError;
1175 hdfsf->hdmaInj->xferhalfcallback = (hdfsf->hdmaInj->Init.Mode == DMA_CIRCULAR) ?\
1176 DFSDM_DMAInjectedHalfConvCplt : NULL;
1177
1178 /*
1179 * DMAスタート
1180 */
1181 if((ercd = dma_start(hdfsf->hdmaInj, (uint32_t)(hdfsf->base+TOFF_DFSDM_FLTJDATAR), (uint32_t)pData, Length)) != E_OK)
1182 hdfsf->state = DFSDM_FILTER_STATE_ERROR;
1183 else /* インジェクト変換スタート */
1184 DFSDM_InjConvStart(hdfsf);
1185 return ercd;
1186 }
1187 else
1188 return E_OBJ;
1189}
1190
1191/*
1192 * DFSDMフィルターインジェクト変換スタート(16BIT変換)
1193 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1194 * paramter 2 pData 変換データ設定領域のポインタ
1195 * parameter3 Length 領域長
1196 * return 正常終了時、E_OK
1197 */
1198ER
1199dfsdm_filterInjectedMsbStart(DFSDM_Filter_Handle_t *hdfsf, int16_t *pData, uint32_t Length)
1200{
1201 if(hdfsf == NULL || pData == NULL || Length == 0)
1202 return E_PAR;
1203
1204 /*
1205 * 初期設定値の確認
1206 */
1207 if((hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER) && \
1208 (hdfsf->hdmaInj->Init.Mode == DMA_NORMAL) && (Length > hdfsf->InjConvRemaining)){
1209 return E_PAR;
1210 }
1211 else if((hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER) && \
1212 (hdfsf->hdmaInj->Init.Mode == DMA_CIRCULAR)){
1213 return E_OBJ;
1214 }
1215
1216 /*
1217 * DMAの有効確認
1218 */
1219 if((sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1)) & DFSDM_FLTCR1_JDMAEN) == 0)
1220 return E_OBJ;
1221
1222 /*
1223 * DFSDMフィルターの状態チェック
1224 */
1225 if(hdfsf->state == DFSDM_FILTER_STATE_READY || hdfsf->state == DFSDM_FILTER_STATE_REG){
1226 ER ercd = E_OK;
1227 /*
1228 * コールバック関数の設定
1229 */
1230 hdfsf->hdmaInj->xfercallback = DFSDM_DMAInjectedConvCplt;
1231 hdfsf->hdmaInj->errorcallback = DFSDM_DMAError;
1232 hdfsf->hdmaInj->xferhalfcallback = (hdfsf->hdmaInj->Init.Mode == DMA_CIRCULAR) ? DFSDM_DMAInjectedHalfConvCplt : NULL;
1233
1234 /*
1235 * DMAスタート
1236 */
1237 if((ercd = dma_start(hdfsf->hdmaInj, (uint32_t)(hdfsf->base+TOFF_DFSDM_FLTJDATAR+2), (uint32_t)pData, Length)) != E_OK)
1238 hdfsf->state = DFSDM_FILTER_STATE_ERROR;
1239 else
1240 DFSDM_InjConvStart(hdfsf); /* インジェクト変換スタート */
1241 return ercd;
1242 }
1243 else
1244 return E_OBJ;
1245}
1246
1247/*
1248 * DFSDMフィルターインジェクト変換停止
1249 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1250 * return 正常終了時、E_OK
1251 */
1252ER
1253dfsdm_filterInjectedStop(DFSDM_Filter_Handle_t *hdfsf)
1254{
1255 ER ercd = E_OK;
1256
1257 if(hdfsf == NULL)
1258 return E_PAR;
1259
1260 /*
1261 * DFSDMフィルターの状態チェック
1262 */
1263 if(hdfsf->state != DFSDM_FILTER_STATE_INJ && hdfsf->state != DFSDM_FILTER_STATE_REG_INJ)
1264 return E_OBJ;
1265
1266 /*
1267 * DMA停止
1268 */
1269 if((ercd = dma_end(hdfsf->hdmaInj)) != E_OK)
1270 hdfsf->state = DFSDM_FILTER_STATE_ERROR;
1271 else
1272 DFSDM_InjConvStop(hdfsf); /* インジェクト変換停止 */
1273 return ercd;
1274}
1275
1276/*
1277 * DFSDMフィルターインジェクト変換値取得
1278 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1279 * parameter2 Channel DFSDMチャネル番号設定用ポインタ
1280 * return インジェクト変換値
1281 */
1282int32_t
1283dfsdm_filterGetInjectedValue(DFSDM_Filter_Handle_t *hdfsf, uint32_t *Channel)
1284{
1285 uint32_t reg = 0;
1286
1287 if(hdfsf == NULL || Channel == NULL)
1288 return 0;
1289
1290 /*
1291 * インジェクト変換値とチャネルを取得
1292 */
1293 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTRDATAR));
1294
1295 *Channel = (reg & DFSDM_FLTJDATAR_JDATACH);
1296 return (int32_t)((reg & DFSDM_FLTJDATAR_JDATA) >> 8);
1297}
1298
1299/*
1300 * アナルグウォッチドックスタート
1301 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1302 * paramter 2 awdParam アナルグウォッチドック設定構造体へのポインタ
1303 * return 正常終了時、E_OK
1304 */
1305ER
1306dfsdm_filterAwdStart(DFSDM_Filter_Handle_t *hdfsf, DFSDM_Filter_AwdParamTypeDef *awdParam)
1307{
1308 if(hdfsf == NULL)
1309 return E_PAR;
1310 if(awdParam->DataSource != DFSDM_FILTER_AWD_FILTER_DATA &&
1311 awdParam->DataSource != DFSDM_FILTER_AWD_CHANNEL_DATA)
1312 return E_PAR;
1313 if(awdParam->Channel == 0 || awdParam->Channel > 0x000F00FF)
1314 return E_PAR;
1315 if(awdParam->HighThreshold < -8388608 && awdParam->HighThreshold > 8388607)
1316 return E_PAR;
1317 if(awdParam->LowThreshold < -8388608 && awdParam->LowThreshold > 8388607)
1318 return E_PAR;
1319 if(awdParam->HighBreakSignal > 0xF)
1320 return E_PAR;
1321 if(awdParam->LowBreakSignal > 0xF)
1322 return E_PAR;
1323
1324 /*
1325 * DFSDMフィルター状態チェック
1326 */
1327 if(hdfsf->state == DFSDM_FILTER_STATE_RESET || hdfsf->state == DFSDM_FILTER_STATE_ERROR)
1328 return E_OBJ;
1329
1330 /*
1331 * アナルグウォッチドック・データソース設定
1332 */
1333 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_AWFSEL);
1334 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), awdParam->DataSource);
1335
1336 /*
1337 * スレッシュホールド、ブレークシグナル設定
1338 */
1339 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWHTR), (DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH));
1340 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWHTR), ((awdParam->HighThreshold << 8) |
1341 awdParam->HighBreakSignal));
1342 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWLTR), (DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL));
1343 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWLTR), ((awdParam->LowThreshold << 8) |
1344 awdParam->LowBreakSignal));
1345
1346 /*
1347 * チャネルと割込み設定
1348 */
1349 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_AWDCH);
1350 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), (((awdParam->Channel & DFSDM_LSB_MASK) << 16) |
1351 DFSDM_FLTCR2_AWDIE));
1352 return E_OK;
1353}
1354
1355/*
1356 * アナルグウォッチドック停止
1357 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1358 * return 正常終了時、E_OK
1359 */
1360ER
1361dfsdm_filterAwdStop(DFSDM_Filter_Handle_t *hdfsf)
1362{
1363 if(hdfsf == NULL)
1364 return E_PAR;
1365
1366 /*
1367 * DFSDMフィルター状態チェック
1368 */
1369 if(hdfsf->state == DFSDM_FILTER_STATE_RESET || hdfsf->state == DFSDM_FILTER_STATE_ERROR)
1370 return E_OBJ;
1371
1372 /*
1373 * チャネルと割込みのリセット
1374 */
1375 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), (DFSDM_FLTCR2_AWDCH | DFSDM_FLTCR2_AWDIE));
1376
1377 /*
1378 * アナログウォッチドッグフラグクリア
1379 */
1380 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWCFR), (DFSDM_FLTAWCFR_CLRAWHTF | DFSDM_FLTAWCFR_CLRAWLTF));
1381
1382 /*
1383 * スレッシュホールドとブレークシグナルをリセット
1384 */
1385 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWHTR), (DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH));
1386 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWLTR), (DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL));
1387
1388 /*
1389 * データソースをリセット
1390 */
1391 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR1), DFSDM_FLTCR1_AWFSEL);
1392 return E_OK;
1393}
1394
1395/*
1396 * DFSDMフィルター・エクストリーム検出スタート
1397 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1398 * parameter2 Channel チャネル番号
1399 * return 正常終了時、E_OK
1400 */
1401ER
1402dfsdm_filterExdStart(DFSDM_Filter_Handle_t *hdfsf, uint32_t Channel)
1403{
1404 if(hdfsf == NULL)
1405 return E_PAR;
1406
1407 /*
1408 * DFSDMフィルター状態チェック
1409 */
1410 if(hdfsf->state == DFSDM_FILTER_STATE_RESET || hdfsf->state == DFSDM_FILTER_STATE_ERROR)
1411 return E_OBJ;
1412
1413 /*
1414 * エクストリーム検出チャネル設定
1415 */
1416 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_EXCH);
1417 sil_orw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), ((Channel & DFSDM_LSB_MASK) << 8));
1418 return E_OK;
1419}
1420
1421/*
1422 * DFSDMフィルター・エクストリーム検出停止
1423 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1424 * return 正常終了時、E_OK
1425 */
1426ER
1427dfsdm_filterExdStop(DFSDM_Filter_Handle_t *hdfsf)
1428{
1429 volatile uint32_t reg;
1430
1431 if(hdfsf == NULL)
1432 return E_PAR;
1433
1434 /*
1435 * DFSDMフィルター状態チェック
1436 */
1437 if(hdfsf->state == DFSDM_FILTER_STATE_RESET || hdfsf->state == DFSDM_FILTER_STATE_ERROR)
1438 return E_OBJ;
1439
1440 /*
1441 * エクストリーム検出チャネルリセット
1442 */
1443 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_EXCH);
1444
1445 /*
1446 * エクストリーム検出値取得
1447 */
1448 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTEXMAX));
1449 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTEXMIN));
1450 ((void)(reg));
1451 return E_OK;
1452}
1453
1454/*
1455 * DFSDMフィルター・エクストリーム検出最大値取得
1456 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1457 * parameter2 Chnnel チャネル保存領域のポインタ
1458 * return 最大値
1459 */
1460int32_t
1461dfsdm_filterGetExdMaxValue(DFSDM_Filter_Handle_t *hdfsf, uint32_t *Channel)
1462{
1463 uint32_t reg = 0;
1464
1465 if(hdfsf == NULL || Channel == NULL)
1466 return E_PAR;
1467
1468 /*
1469 * チャネルと最大値取得
1470 */
1471 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTEXMAX));
1472 *Channel = (reg & DFSDM_FLTEXMAX_EXMAXCH);
1473 return (int32_t)((reg & DFSDM_FLTEXMAX_EXMAX) >> 8);
1474}
1475
1476/*
1477 * DFSDMフィルター・エクストリーム検出最小値取得
1478 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1479 * parameter2 Chnnel チャネル保存領域のポインタ
1480 * return 最小値
1481 */
1482int32_t
1483dfsdm_filterGetExdMinValue(DFSDM_Filter_Handle_t *hdfsf, uint32_t *Channel)
1484{
1485 uint32_t reg = 0;
1486
1487 if(hdfsf == NULL || Channel == NULL)
1488 return E_PAR;
1489
1490 /*
1491 * チャネルと最小値取得
1492 */
1493 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTEXMIN));
1494 *Channel = (reg & DFSDM_FLTEXMIN_EXMINCH);
1495 return (int32_t)((reg & DFSDM_FLTEXMIN_EXMIN) >> 8);
1496}
1497
1498/*
1499 * 変換時間取得
1500 * parameter1 hdfsc DFSDMフィルターハンドラへのポインタ
1501 * return 時間(秒)
1502 */
1503uint32_t
1504dfsdm_filterGetConvTimeValue(DFSDM_Filter_Handle_t *hdfsf)
1505{
1506 uint32_t reg = 0;
1507
1508 if(hdfsf == NULL)
1509 return E_PAR;
1510
1511 /*
1512 * 変換時間レジスタ値取得
1513 */
1514 reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCNVTIMR));
1515 return (uint32_t)((reg & DFSDM_FLTCNVTIMR_CNVCNT) >> 4);
1516}
1517
1518
1519/*
1520 * DFSDMフィルター割込みハンドラ
1521 */
1522void dfsdm_irqhandler(DFSDM_Filter_Handle_t *hdfsf)
1523{
1524 DFSDM_Channel_Handle_t *hdfsc;
1525 uint32_t isr = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTISR));
1526 uint32_t cr2 = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2));
1527
1528 /*
1529 * レギュラー変換オーバーランエラー
1530 */
1531 if(((isr & cr2) & DFSDM_FLTISR_ROVRF) != 0){
1532 /*
1533 * オーバーラン要因クリア
1534 */
1535 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTICR), DFSDM_FLTICR_CLRROVRF);
1536
1537 /*
1538 * エラー設定とコールバック
1539 */
1540 hdfsf->errorcode = DFSDM_FILTER_ERROR_REGULAR_OVERRUN;
1541 if(hdfsf->errorcallback != NULL)
1542 hdfsf->errorcallback(hdfsf);
1543 }
1544 /*
1545 * インジェクト変換オーバーランエラー
1546 */
1547 else if(((isr & cr2) & DFSDM_FLTISR_JOVRF) != 0){
1548 /*
1549 * オーバーラン要因クリア
1550 */
1551 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTICR), DFSDM_FLTICR_CLRJOVRF);
1552
1553 /*
1554 * エラー設定とコールバック
1555 */
1556 hdfsf->errorcode = DFSDM_FILTER_ERROR_INJECTED_OVERRUN;
1557 if(hdfsf->errorcallback != NULL)
1558 hdfsf->errorcallback(hdfsf);
1559 }
1560 /*
1561 * レギュラー変換終了
1562 */
1563 else if(((isr & cr2) & DFSDM_FLTISR_REOCF) != 0){
1564 /*
1565 * コールバック
1566 */
1567 if(hdfsf->regconvcallback != NULL)
1568 hdfsf->regconvcallback(hdfsf);
1569
1570 /*
1571 * 非継続モード、かつ、ソフトウェアトリガの場合
1572 */
1573 if((hdfsf->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) &&
1574 (hdfsf->Init.RegTrigger == DFSDM_FILTER_SW_TRIGGER)){
1575 /*
1576 * レギュラー変換割込み停止
1577 */
1578 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_REOCIE);
1579
1580 /*
1581 * DFSDMフィルター状態更新
1582 */
1583 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_REG) ? DFSDM_FILTER_STATE_READY : DFSDM_FILTER_STATE_INJ;
1584 }
1585 }
1586 /*
1587 * インジェクト変換終了
1588 */
1589 else if(((isr & cr2) & DFSDM_FLTISR_JEOCF) != 0){
1590 /*
1591 * コールバック
1592 */
1593 if(hdfsf->injconvcallback != NULL)
1594 hdfsf->injconvcallback(hdfsf);
1595
1596 /*
1597 * 残りのインジェクト変換更新
1598 */
1599 if(--hdfsf->InjConvRemaining == 0){
1600 /*
1601 * ソフトウェアトリガなら、インジェクト変換停止
1602 */
1603 if(hdfsf->Init.InjTrigger == DFSDM_FILTER_SW_TRIGGER){
1604 sil_andw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTCR2), DFSDM_FLTCR2_JEOCIE);
1605 hdfsf->state = (hdfsf->state == DFSDM_FILTER_STATE_INJ) ? DFSDM_FILTER_STATE_READY : DFSDM_FILTER_STATE_REG;
1606 }
1607 /*
1608 * インジェクト変換モード更新
1609 */
1610 hdfsf->InjConvRemaining = (hdfsf->Init.InjScanMode == DFSDM_ENABLE) ? hdfsf->InjectedChannelsNbr : 1;
1611 }
1612 }
1613 /*
1614 * アナログウォッチドッグ発生
1615 */
1616 else if(((isr & cr2) &DFSDM_FLTISR_AWDF) != 0){
1617 uint32_t reg = sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWSR));
1618 uint32_t threshold = 0;
1619 uint32_t channel = 0;
1620
1621 /*
1622 * チャネル番号とスレッシュホールド取得
1623 */
1624 threshold = ((reg & DFSDM_FLTAWSR_AWLTF) != 0) ? DFSDM_AWD_LOW_THRESHOLD : DFSDM_AWD_HIGH_THRESHOLD;
1625 if(threshold == DFSDM_AWD_HIGH_THRESHOLD){
1626 reg = reg >> 8;
1627 }
1628 while((reg & 1) == 0){
1629 channel++;
1630 reg = reg >> 1;
1631 }
1632 /*
1633 * アナルグウォッチドッグ・フラグクリア
1634 */
1635 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTAWCFR), (threshold == DFSDM_AWD_HIGH_THRESHOLD) ? \
1636 (1 << (8 + channel)) : (1 << channel));
1637
1638 /*
1639 * アナルグウォッチドッグ・コールバック
1640 */
1641 if(hdfsf->awdconvcallback != NULL)
1642 hdfsf->awdconvcallback(hdfsf);
1643 }
1644 /*
1645 * クロックアブセンス発生
1646 */
1647 else if(hdfsf->base == TADR_DFSDM1_FILTER0_BASE &&
1648 (isr & DFSDM_FLTISR_CKABF) != 0 && (cr2 & DFSDM_FLTCR2_CKABIE) != 0){
1649 uint32_t reg = (sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTISR)) & DFSDM_FLTISR_CKABF) >> 16;
1650 uint32_t channel = 0;
1651
1652 while(channel < DFSDM1_CHANNEL_NUMBER){
1653 /*
1654 * 有効チャネルサーチ
1655 */
1656 if(((reg & 1) != 0) && (Dfsdm1ChannelHandle[channel] != NULL)){
1657 /*
1658 * クロックアブセンス・イネーブルのチャネルをチェック
1659 */
1660 if((sil_rew_mem((uint32_t *)(Dfsdm1ChannelHandle[channel]->base+TOFF_DFSDM_CHCFGR1)) & DFSDM_CHCFGR1_CKABEN) != 0){
1661 /*
1662 * クロックアブセンス・フラグクリア
1663 */
1664 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTICR), (1 << (16 + channel)));
1665
1666 /*
1667 * 対応チャネルのコールバック
1668 */
1669 hdfsc = Dfsdm1ChannelHandle[channel];
1670 if(hdfsc != NULL && hdfsc->ckabcallback != NULL)
1671 hdfsc->ckabcallback(hdfsc);
1672 }
1673 }
1674 channel++;
1675 reg = reg >> 1;
1676 }
1677 }
1678 /*
1679 * ショートサーキット・デテクション発生
1680 */
1681 else if(hdfsf->base == TADR_DFSDM1_FILTER0_BASE &&
1682 (isr & DFSDM_FLTISR_SCDF) != 0 && (cr2 & DFSDM_FLTCR2_SCDIE) != 0){
1683 uint32_t reg = 0;
1684 uint32_t channel = 0;
1685
1686 /*
1687 * チャネル番号取得
1688 */
1689 reg = (sil_rew_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTISR)) & DFSDM_FLTISR_SCDF) >> 24;
1690 while((reg & 1) == 0){
1691 channel++;
1692 reg = reg >> 1;
1693 }
1694
1695 /*
1696 * ショートサーキット・デテクションフラグクリア
1697 */
1698 sil_wrw_mem((uint32_t *)(hdfsf->base+TOFF_DFSDM_FLTICR), (1 << (24 + channel)));
1699
1700 /*
1701 * ショートサーキット・デテクション・コールバック
1702 */
1703 hdfsc = Dfsdm1ChannelHandle[channel];
1704 if(hdfsc != NULL && hdfsc->scdcallback != NULL)
1705 hdfsc->scdcallback(hdfsc);
1706 }
1707}
1708
Note: See TracBrowser for help on using the repository browser.