1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
|
/****************************************************************************
*
* Copyright(c) 2012 Yamaha Corporation. All rights reserved.
*
* Module : mcresctrl.h
*
* Description : MC Driver resource control header
*
* Version : 1.0.2 2012.12.27
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
****************************************************************************/
#ifndef _MCRESCTRL_H_
#define _MCRESCTRL_H_
#include "mcdevif.h"
#include "mcpacking.h"
#define MCDRV_BURST_WRITE_ENABLE (0x01)
/* Slave Address */
#define MCDRV_SLAVEADDR_ANA (0x3A)
#define MCDRV_SLAVEADDR_DIG (0x11)
/* DEV_ID */
#define MCDRV_DEVID_ANA (0x90)
#define MCDRV_DEVID_DIG (0x80)
#define MCDRV_DEVID_MASK (0xF8)
#define MCDRV_VERID_MASK (0x07)
/* eState setting */
enum MCDRV_STATE {
eMCDRV_STATE_NOTINIT,
eMCDRV_STATE_READY
};
/* volume setting */
#define MCDRV_LOGICAL_VOL_MUTE (-24576) /* -96dB */
#define MCDRV_REG_MUTE (0x00)
/* DIO port setting */
enum MCDRV_DIO_PORT_NO {
eMCDRV_DIO_0 = 0,
eMCDRV_DIO_1,
eMCDRV_DIO_2,
eMCDRV_DIO_3
};
/* Path destination setting */
enum MCDRV_DST_CH {
eMCDRV_DST_CH0 = 0,
eMCDRV_DST_CH1,
eMCDRV_DST_CH2,
eMCDRV_DST_CH3
};
enum MCDRV_DST_TYPE {
eMCDRV_DST_MUSICOUT = 0,
eMCDRV_DST_EXTOUT,
eMCDRV_DST_HIFIOUT,
eMCDRV_DST_VBOXMIXIN,
eMCDRV_DST_AE0,
eMCDRV_DST_AE1,
eMCDRV_DST_AE2,
eMCDRV_DST_AE3,
eMCDRV_DST_DAC0,
eMCDRV_DST_DAC1,
eMCDRV_DST_VOICEOUT,
eMCDRV_DST_VBOXIOIN,
eMCDRV_DST_VBOXHOSTIN,
eMCDRV_DST_HOSTOUT,
eMCDRV_DST_ADIF0,
eMCDRV_DST_ADIF1,
eMCDRV_DST_ADIF2,
eMCDRV_DST_ADC0,
eMCDRV_DST_ADC1,
eMCDRV_DST_SP,
eMCDRV_DST_HP,
eMCDRV_DST_RCV,
eMCDRV_DST_LOUT1,
eMCDRV_DST_LOUT2,
eMCDRV_DST_BIAS
};
/* Register accsess availability */
enum MCDRV_REG_ACCSESS {
eMCDRV_ACCESS_DENY = 0,
eMCDRV_CAN_READ = 0x01,
eMCDRV_CAN_WRITE = 0x02,
eMCDRV_READ_WRITE = eMCDRV_CAN_READ | eMCDRV_CAN_WRITE
};
/* UpdateReg parameter */
enum MCDRV_UPDATE_MODE {
eMCDRV_UPDATE_NORMAL,
eMCDRV_UPDATE_FORCE,
eMCDRV_UPDATE_DUMMY
};
/* ePacketBufAlloc setting */
enum MCDRV_PACKETBUF_ALLOC {
eMCDRV_PACKETBUF_FREE,
eMCDRV_PACKETBUF_ALLOCATED
};
/* Power management mode */
enum MCDRV_PMODE {
eMCDRV_APM_ON,
eMCDRV_APM_OFF
};
/* DSP Start */
#define MCDRV_DSP_START_E (0x01)
#define MCDRV_DSP_START_B (0x02)
#define MCDRV_DSP_START_M (0x04)
#define MCDRV_DSP_START_F (0x08)
#define MCDRV_DSP_START_C (0x10)
/* Register available num */
#define MCDRV_REG_NUM_IF (59)
#define MCDRV_REG_NUM_A (68)
#define MCDRV_REG_NUM_MA (85)
#define MCDRV_REG_NUM_MB (86)
#define MCDRV_REG_NUM_B (72)
#define MCDRV_REG_NUM_E (101)
#define MCDRV_REG_NUM_C (160)
#define MCDRV_REG_NUM_F (128)
#define MCDRV_REG_NUM_ANA (116)
#define MCDRV_REG_NUM_CD (53)
/* control packet for serial host interface */
#define MCDRV_MAX_CTRL_DATA_NUM (MCDRV_MAX_PACKETS*4)
struct MCDRV_SERIAL_CTRL_PACKET {
UINT8 abData[MCDRV_MAX_CTRL_DATA_NUM];
UINT16 wDataNum;
};
/* for AEC */
struct MCDRV_AEC_B_DSP {
UINT8 *pbChunkData;
UINT32 dwSize;
};
struct MCDRV_AEC_F_DSP {
UINT8 *pbChunkData;
UINT32 dwSize;
};
struct MCDRV_AEC_C_DSP {
UINT8 *pbChunkData;
UINT32 dwSize;
};
struct MCDRV_AEC_C_DSP_DEBUG {
UINT8 bJtagOn;
};
struct MCDRV_AEC_SYSEQ_EX {
UINT8 bEnable;
struct {
UINT8 bCoef_A0[3];
UINT8 bCoef_A1[3];
UINT8 bCoef_A2[3];
UINT8 bCoef_B1[3];
UINT8 bCoef_B2[3];
} sBand[2];
};
struct MCDRV_AEC_E2_CONFIG {
UINT8 *pbChunkData;
UINT32 dwSize;
};
struct MCDRV_AEC_CONFIG {
UINT8 bFDspLocate;
};
struct MCDRV_AEC_AUDIOENGINE {
UINT8 bEnable;
UINT8 bAEOnOff;
UINT8 bFDspOnOff;
UINT8 bBDspAE0Src;
UINT8 bBDspAE1Src;
UINT8 bMixerIn0Src;
UINT8 bMixerIn1Src;
UINT8 bMixerIn2Src;
UINT8 bMixerIn3Src;
struct MCDRV_AEC_B_DSP sAecBDsp;
struct MCDRV_AEC_F_DSP sAecFDsp;
};
struct MCDRV_AEC_V_BOX {
UINT8 bEnable;
UINT8 bCDspFuncAOnOff;
UINT8 bCDspFuncBOnOff;
UINT8 bFDspOnOff;
UINT8 bFdsp_Po_Source;
UINT8 bISrc2_VSource;
UINT8 bISrc2_Ch1_VSource;
UINT8 bISrc3_VSource;
UINT8 bLPt2_VSource;
UINT8 bLPt2_Mix_VolO;
UINT8 bLPt2_Mix_VolI;
UINT8 bSrc3_Ctrl;
UINT8 bSrc2_Fs;
UINT8 bSrc2_Thru;
UINT8 bSrc3_Fs;
UINT8 bSrc3_Thru;
struct MCDRV_AEC_C_DSP sAecCDspA;
struct MCDRV_AEC_C_DSP sAecCDspB;
struct MCDRV_AEC_F_DSP sAecFDsp;
struct MCDRV_AEC_C_DSP_DEBUG sAecCDspDbg;
};
#define MCDRV_AEC_OUTPUT_N (2)
struct MCDRV_AEC_OUTPUT {
UINT8 bLpf_Pre_Thru[MCDRV_AEC_OUTPUT_N];
UINT8 bLpf_Post_Thru[MCDRV_AEC_OUTPUT_N];
UINT8 bDcc_Sel[MCDRV_AEC_OUTPUT_N];
UINT8 bSig_Det_Lvl;
UINT8 bPow_Det_Lvl[MCDRV_AEC_OUTPUT_N];
UINT8 bOsf_Sel[MCDRV_AEC_OUTPUT_N];
UINT8 bSys_Eq_Enb[MCDRV_AEC_OUTPUT_N];
UINT8 bSys_Eq_Coef_A0[MCDRV_AEC_OUTPUT_N][3];
UINT8 bSys_Eq_Coef_A1[MCDRV_AEC_OUTPUT_N][3];
UINT8 bSys_Eq_Coef_A2[MCDRV_AEC_OUTPUT_N][3];
UINT8 bSys_Eq_Coef_B1[MCDRV_AEC_OUTPUT_N][3];
UINT8 bSys_Eq_Coef_B2[MCDRV_AEC_OUTPUT_N][3];
UINT8 bClip_Md[MCDRV_AEC_OUTPUT_N];
UINT8 bClip_Att[MCDRV_AEC_OUTPUT_N];
UINT8 bClip_Rel[MCDRV_AEC_OUTPUT_N];
UINT8 bClip_G[MCDRV_AEC_OUTPUT_N];
UINT8 bOsf_Gain[MCDRV_AEC_OUTPUT_N][2];
UINT8 bDcl_OnOff[MCDRV_AEC_OUTPUT_N];
UINT8 bDcl_Gain[MCDRV_AEC_OUTPUT_N];
UINT8 bDcl_Limit[MCDRV_AEC_OUTPUT_N][2];
UINT8 bRandom_Dither_OnOff[MCDRV_AEC_OUTPUT_N];
UINT8 bRandom_Dither_Level[MCDRV_AEC_OUTPUT_N];
UINT8 bRandom_Dither_POS[MCDRV_AEC_OUTPUT_N];
UINT8 bDc_Dither_OnOff[MCDRV_AEC_OUTPUT_N];
UINT8 bDc_Dither_Level[MCDRV_AEC_OUTPUT_N];
UINT8 bDither_Type[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_On[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Zero[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Time[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Fw[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Attack;
UINT8 bDng_Release;
UINT8 bDng_Target[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Target_LineOut[MCDRV_AEC_OUTPUT_N];
UINT8 bDng_Target_Rc;
struct MCDRV_AEC_SYSEQ_EX sSysEqEx[MCDRV_AEC_OUTPUT_N];
};
#define MCDRV_AEC_INPUT_N (3)
struct MCDRV_AEC_INPUT {
UINT8 bDsf32_L_Type[MCDRV_AEC_INPUT_N];
UINT8 bDsf32_R_Type[MCDRV_AEC_INPUT_N];
UINT8 bDsf4_Sel[MCDRV_AEC_INPUT_N];
UINT8 bDcc_Sel[MCDRV_AEC_INPUT_N];
UINT8 bDng_On[MCDRV_AEC_INPUT_N];
UINT8 bDng_Att[MCDRV_AEC_INPUT_N];
UINT8 bDng_Rel[MCDRV_AEC_INPUT_N];
UINT8 bDng_Fw[MCDRV_AEC_INPUT_N];
UINT8 bDng_Tim[MCDRV_AEC_INPUT_N];
UINT8 bDng_Zero[MCDRV_AEC_INPUT_N][2];
UINT8 bDng_Tgt[MCDRV_AEC_INPUT_N][2];
UINT8 bDepop_Att[MCDRV_AEC_INPUT_N];
UINT8 bDepop_Wait[MCDRV_AEC_INPUT_N];
UINT8 bRef_Sel;
};
struct MCDRV_AEC_PDM {
UINT8 bMode;
UINT8 bStWait;
UINT8 bPdm0_LoadTim;
UINT8 bPdm0_LFineDly;
UINT8 bPdm0_RFineDly;
UINT8 bPdm1_LoadTim;
UINT8 bPdm1_LFineDly;
UINT8 bPdm1_RFineDly;
UINT8 bPdm0_Data_Delay;
UINT8 bPdm1_Data_Delay;
};
struct MCDRV_AEC_E2 {
UINT8 bEnable;
UINT8 bE2_Da_Sel;
UINT8 bE2_Ad_Sel;
UINT8 bE2OnOff;
struct MCDRV_AEC_E2_CONFIG sE2Config;
};
struct MCDRV_AEC_ADJ {
UINT8 bHold;
UINT8 bCnt;
UINT8 bMax[2];
};
struct MCDRV_AEC_EDSP_MISC {
UINT8 bI2SOut_Enb;
UINT8 bChSel;
UINT8 bLoopBack;
};
struct MCDRV_AEC_CONTROL {
UINT8 bCommand;
UINT8 bParam[4];
};
struct MCDRV_AEC_INFO {
struct MCDRV_AEC_CONFIG sAecConfig;
struct MCDRV_AEC_AUDIOENGINE sAecAudioengine;
struct MCDRV_AEC_V_BOX sAecVBox;
struct MCDRV_AEC_OUTPUT sOutput;
struct MCDRV_AEC_INPUT sInput;
struct MCDRV_AEC_PDM sPdm;
struct MCDRV_AEC_E2 sE2;
struct MCDRV_AEC_ADJ sAdj;
struct MCDRV_AEC_EDSP_MISC sEDspMisc;
struct MCDRV_AEC_CONTROL sControl;
};
/* global information */
struct MCDRV_GLOBAL_INFO {
UINT8 bHwId;
enum MCDRV_PACKETBUF_ALLOC ePacketBufAlloc;
UINT8 abRegValIF[MCDRV_REG_NUM_IF];
UINT8 abRegValA[MCDRV_REG_NUM_A];
UINT8 abRegValMA[MCDRV_REG_NUM_MA];
UINT8 abRegValMB[MCDRV_REG_NUM_MB];
UINT8 abRegValB[MCDRV_REG_NUM_B];
UINT8 abRegValE[MCDRV_REG_NUM_E];
UINT8 abRegValC[MCDRV_REG_NUM_C];
UINT8 abRegValF[MCDRV_REG_NUM_F];
UINT8 abRegValANA[MCDRV_REG_NUM_ANA];
UINT8 abRegValCD[MCDRV_REG_NUM_CD];
struct MCDRV_INIT_INFO sInitInfo;
struct MCDRV_INIT2_INFO sInit2Info;
struct MCDRV_CLOCKSW_INFO sClockSwInfo;
struct MCDRV_PATH_INFO sPathInfo;
struct MCDRV_PATH_INFO sPathInfoVirtual;
struct MCDRV_VOL_INFO sVolInfo;
struct MCDRV_DIO_INFO sDioInfo;
struct MCDRV_DIOPATH_INFO sDioPathInfo;
struct MCDRV_SWAP_INFO sSwapInfo;
struct MCDRV_HSDET_INFO sHSDetInfo;
struct MCDRV_HSDET2_INFO sHSDet2Info;
struct MCDRV_AEC_INFO sAecInfo;
SINT32(*pcbfunc)(SINT32, UINT32, UINT32);
struct MCDRV_GP_MODE sGpMode;
UINT8 abGpMask[3];
UINT8 abGpPad[3];
UINT8 bClkSel;
UINT8 bEClkSel;
UINT8 bCClkSel;
UINT8 bFClkSel;
UINT8 bPlugDetDB;
struct MCDRV_SERIAL_CTRL_PACKET sCtrlPacket;
UINT16 wCurSlaveAddr;
UINT16 wCurRegType;
UINT16 wCurRegAddr;
UINT16 wDataContinueCount;
UINT16 wPrevAddrIndex;
enum MCDRV_PMODE eAPMode;
};
SINT32 McResCtrl_SetHwId(UINT8 bHwId_dig, UINT8 bHwId_ana);
void McResCtrl_Init(void);
void McResCtrl_InitABlockReg(void);
void McResCtrl_InitMBlockReg(void);
void McResCtrl_InitEReg(void);
void McResCtrl_UpdateState(enum MCDRV_STATE eState);
enum MCDRV_STATE McResCtrl_GetState(void);
UINT8 McResCtrl_GetRegVal(UINT16 wRegType, UINT16 wRegAddr);
void McResCtrl_SetRegVal(UINT16 wRegType,
UINT16 wRegAddr, UINT8 bRegVal);
void McResCtrl_SetInitInfo(
const struct MCDRV_INIT_INFO *psInitInfo,
const struct MCDRV_INIT2_INFO *psInit2Info);
void McResCtrl_GetInitInfo(struct MCDRV_INIT_INFO *psInitInfo,
struct MCDRV_INIT2_INFO *psInit2Info);
void McResCtrl_SetClockSwInfo(
const struct MCDRV_CLOCKSW_INFO *psClockSwInfo);
void McResCtrl_GetClockSwInfo(
struct MCDRV_CLOCKSW_INFO *psClockSwInfo);
SINT32 McResCtrl_SetPathInfo(
const struct MCDRV_PATH_INFO *psPathInfo);
void McResCtrl_GetPathInfo(struct MCDRV_PATH_INFO *psPathInfo);
void McResCtrl_GetPathInfoVirtual(
struct MCDRV_PATH_INFO *psPathInfo);
void McResCtrl_SetVolInfo(const struct MCDRV_VOL_INFO *psVolInfo);
void McResCtrl_GetVolInfo(struct MCDRV_VOL_INFO *psVolInfo);
void McResCtrl_SetDioInfo(const struct MCDRV_DIO_INFO *psDioInfo,
UINT32 dUpdateInfo);
void McResCtrl_GetDioInfo(struct MCDRV_DIO_INFO *psDioInfo);
void McResCtrl_SetDioPathInfo(
const struct MCDRV_DIOPATH_INFO *psDioPathInfo,
UINT32 dUpdateInfo);
void McResCtrl_GetDioPathInfo(
struct MCDRV_DIOPATH_INFO *psDioPathInfo);
void McResCtrl_SetSwap(
const struct MCDRV_SWAP_INFO *psSwapInfo,
UINT32 dUpdateInfo);
void McResCtrl_GetSwap(struct MCDRV_SWAP_INFO *psSwapInfo);
void McResCtrl_SetHSDet(
const struct MCDRV_HSDET_INFO *psHSDetInfo,
const struct MCDRV_HSDET2_INFO *psHSDet2Info,
UINT32 dUpdateInfo);
void McResCtrl_GetHSDet(struct MCDRV_HSDET_INFO *psHSDetInfo,
struct MCDRV_HSDET2_INFO *psHSDet2Info);
void McResCtrl_SetAecInfo(
const struct MCDRV_AEC_INFO *psAecInfo);
void McResCtrl_ReplaceAecInfo(
const struct MCDRV_AEC_INFO *psAecInfo);
void McResCtrl_GetAecInfo(struct MCDRV_AEC_INFO *psAecInfo);
void McResCtrl_SetDSPCBFunc(
SINT32 (*pcbfunc)(SINT32, UINT32, UINT32));
void McResCtrl_GetDSPCBFunc(
SINT32 (**pcbfunc)(SINT32, UINT32, UINT32));
void McResCtrl_SetGPMode(const struct MCDRV_GP_MODE *psGpMode);
void McResCtrl_GetGPMode(struct MCDRV_GP_MODE *psGpMode);
void McResCtrl_SetGPMask(UINT8 bMask, UINT32 dPadNo);
UINT8 McResCtrl_GetGPMask(UINT32 dPadNo);
void McResCtrl_SetGPPad(UINT8 bPad, UINT32 dPadNo);
UINT8 McResCtrl_GetGPPad(UINT32 dPadNo);
void McResCtrl_SetClkSel(UINT8 bClkSel);
UINT8 McResCtrl_GetClkSel(void);
void McResCtrl_SetEClkSel(UINT8 bEClkSel);
UINT8 McResCtrl_GetEClkSel(void);
void McResCtrl_SetCClkSel(UINT8 bCClkSel);
UINT8 McResCtrl_GetCClkSel(void);
void McResCtrl_SetFClkSel(UINT8 bFClkSel);
UINT8 McResCtrl_GetFClkSel(void);
void McResCtrl_SetPlugDetDB(UINT8 bPlugDetDB);
UINT8 McResCtrl_GetPlugDetDB(void);
void McResCtrl_GetVolReg(struct MCDRV_VOL_INFO *psVolInfo);
SINT16 McResCtrl_GetDigitalVolReg(SINT32 sdVol);
void McResCtrl_GetPowerInfo(struct MCDRV_POWER_INFO *psPowerInfo);
void McResCtrl_GetPowerInfoRegAccess(
const struct MCDRV_REG_INFO *psRegInfo,
struct MCDRV_POWER_INFO *psPowerInfo);
void McResCtrl_GetCurPowerInfo(
struct MCDRV_POWER_INFO *psPowerInfo);
UINT8 McResCtrl_IsD1SrcUsed(UINT32 dSrcOnOff);
UINT8 McResCtrl_IsD2SrcUsed(UINT32 dSrcOnOff);
UINT8 McResCtrl_IsASrcUsed(UINT32 dSrcOnOff);
UINT8 McResCtrl_HasSrc(enum MCDRV_DST_TYPE eType,
enum MCDRV_DST_CH eCh);
UINT32 McResCtrl_GetSource(enum MCDRV_DST_TYPE eType,
enum MCDRV_DST_CH eCh);
UINT8 McResCtrl_GetDspStart(void);
enum MCDRV_REG_ACCSESS McResCtrl_GetRegAccess(
const struct MCDRV_REG_INFO *psRegInfo);
enum MCDRV_PMODE McResCtrl_GetAPMode(void);
struct MCDRV_PACKET *McResCtrl_AllocPacketBuf(void);
void McResCtrl_ReleasePacketBuf(void);
void McResCtrl_InitRegUpdate(void);
void McResCtrl_AddRegUpdate(UINT16 wRegType,
UINT16 wAddress,
UINT8 bData,
enum MCDRV_UPDATE_MODE eUpdateMode);
void McResCtrl_ExecuteRegUpdate(void);
SINT32 McResCtrl_WaitEvent(UINT32 dEvent, UINT32 dParam);
UINT8 McResCtrl_IsEnableIRQ(void);
#endif /* _MCRESCTRL_H_ */
|