Subversion Repositories AFRtranscoder

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32f1xx_ll_rtc.c
4
  * @author  MCD Application Team
5
  * @brief   RTC LL module driver.
6
  ******************************************************************************
7
  * @attention
8
  *
9
  * Copyright (c) 2016 STMicroelectronics.
10
  * All rights reserved.
11
  *
12
  * This software is licensed under terms that can be found in the LICENSE file
13
  * in the root directory of this software component.
14
  * If no LICENSE file comes with this software, it is provided AS-IS.
15
  *
16
  ******************************************************************************
17
  */
18
 
19
#if defined(USE_FULL_LL_DRIVER)
20
 
21
/* Includes ------------------------------------------------------------------*/
22
#include "stm32f1xx_ll_rtc.h"
23
#include "stm32f1xx_ll_cortex.h"
24
#ifdef  USE_FULL_ASSERT
25
#include "stm32_assert.h"
26
#else
27
#define assert_param(expr) ((void)0U)
28
#endif
29
 
30
/** @addtogroup STM32F1xx_LL_Driver
31
  * @{
32
  */
33
 
34
#if defined(RTC)
35
 
36
/** @addtogroup RTC_LL
37
  * @{
38
  */
39
 
40
/* Private types -------------------------------------------------------------*/
41
/* Private variables ---------------------------------------------------------*/
42
/* Private constants ---------------------------------------------------------*/
43
/** @addtogroup RTC_LL_Private_Constants
44
  * @{
45
  */
46
/* Default values used for prescaler */
47
#define RTC_ASYNCH_PRESC_DEFAULT     0x00007FFFU
48
 
49
/* Values used for timeout */
50
#define RTC_INITMODE_TIMEOUT         1000U /* 1s when tick set to 1ms */
51
#define RTC_SYNCHRO_TIMEOUT          1000U /* 1s when tick set to 1ms */
52
/**
53
  * @}
54
  */
55
 
56
/* Private macros ------------------------------------------------------------*/
57
/** @addtogroup RTC_LL_Private_Macros
58
  * @{
59
  */
60
 
61
#define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__)   ((__VALUE__) <= 0xFFFFFU)
62
 
63
#define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \
64
                                  || ((__VALUE__) == LL_RTC_FORMAT_BCD))
65
 
66
#define IS_LL_RTC_HOUR24(__HOUR__)            ((__HOUR__) <= 23U)
67
#define IS_LL_RTC_MINUTES(__MINUTES__)        ((__MINUTES__) <= 59U)
68
#define IS_LL_RTC_SECONDS(__SECONDS__)        ((__SECONDS__) <= 59U)
69
#define IS_LL_RTC_CALIB_OUTPUT(__OUTPUT__) (((__OUTPUT__) == LL_RTC_CALIB_OUTPUT_NONE) || \
70
                                            ((__OUTPUT__) == LL_RTC_CALIB_OUTPUT_RTCCLOCK) || \
71
                                            ((__OUTPUT__) == LL_RTC_CALIB_OUTPUT_ALARM) || \
72
                                            ((__OUTPUT__) == LL_RTC_CALIB_OUTPUT_SECOND))
73
/**
74
  * @}
75
  */
76
/* Private function prototypes -----------------------------------------------*/
77
/* Exported functions --------------------------------------------------------*/
78
/** @addtogroup RTC_LL_Exported_Functions
79
  * @{
80
  */
81
 
82
/** @addtogroup RTC_LL_EF_Init
83
  * @{
84
  */
85
 
86
/**
87
  * @brief  De-Initializes the RTC registers to their default reset values.
88
  * @note   This function doesn't reset the RTC Clock source and RTC Backup Data
89
  *         registers.
90
  * @param  RTCx RTC Instance
91
  * @retval An ErrorStatus enumeration value:
92
  *          - SUCCESS: RTC registers are de-initialized
93
  *          - ERROR: RTC registers are not de-initialized
94
  */
95
ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx)
96
{
97
  ErrorStatus status = ERROR;
98
 
99
  /* Check the parameter */
100
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
101
 
102
  /* Disable the write protection for RTC registers */
103
  LL_RTC_DisableWriteProtection(RTCx);
104
 
105
  /* Set Initialization mode */
106
  if (LL_RTC_EnterInitMode(RTCx) != ERROR)
107
  {
108
    LL_RTC_WriteReg(RTCx, CNTL, 0x0000);
109
    LL_RTC_WriteReg(RTCx, CNTH, 0x0000);
110
    LL_RTC_WriteReg(RTCx, PRLH, 0x0000);
111
    LL_RTC_WriteReg(RTCx, PRLL, 0x8000);
112
    LL_RTC_WriteReg(RTCx, CRH,  0x0000);
113
    LL_RTC_WriteReg(RTCx, CRL,  0x0020);
114
 
115
    /* Reset Tamper and alternate functions configuration register */
116
    LL_RTC_WriteReg(BKP, RTCCR, 0x00000000U);
117
    LL_RTC_WriteReg(BKP, CR,    0x00000000U);
118
    LL_RTC_WriteReg(BKP, CSR,   0x00000000U);
119
 
120
    /* Exit Initialization Mode */
121
    if (LL_RTC_ExitInitMode(RTCx) != ERROR)
122
    {
123
      /* Wait till the RTC RSF flag is set */
124
      status = LL_RTC_WaitForSynchro(RTCx);
125
 
126
      /* Clear RSF Flag */
127
      LL_RTC_ClearFlag_RS(RTCx);
128
 
129
      /* Enable the write protection for RTC registers */
130
      LL_RTC_EnableWriteProtection(RTCx);
131
    }
132
  }
133
  else
134
  {
135
    /* Enable the write protection for RTC registers */
136
    LL_RTC_EnableWriteProtection(RTCx);
137
  }
138
 
139
  return status;
140
}
141
 
142
/**
143
  * @brief  Initializes the RTC registers according to the specified parameters
144
  *         in RTC_InitStruct.
145
  * @param  RTCx RTC Instance
146
  * @param  RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains
147
  *         the configuration information for the RTC peripheral.
148
  * @note   The RTC Prescaler register is write protected and can be written in
149
  *         initialization mode only.
150
  * @note   the user should call LL_RTC_StructInit()  or the structure of Prescaler
151
  *         need to be initialized  before RTC init()
152
  * @retval An ErrorStatus enumeration value:
153
  *          - SUCCESS: RTC registers are initialized
154
  *          - ERROR: RTC registers are not initialized
155
  */
156
ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct)
157
{
158
  ErrorStatus status = ERROR;
159
 
160
  /* Check the parameters */
161
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
162
  assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler));
163
  assert_param(IS_LL_RTC_CALIB_OUTPUT(RTC_InitStruct->OutPutSource));
164
  /* Waiting for synchro */
165
  if (LL_RTC_WaitForSynchro(RTCx) != ERROR)
166
  {
167
    /* Set Initialization mode */
168
    if (LL_RTC_EnterInitMode(RTCx) != ERROR)
169
    {
170
      /* Clear Flag Bits */
171
      LL_RTC_ClearFlag_ALR(RTCx);
172
      LL_RTC_ClearFlag_OW(RTCx);
173
      LL_RTC_ClearFlag_SEC(RTCx);
174
 
175
      if (RTC_InitStruct->OutPutSource != LL_RTC_CALIB_OUTPUT_NONE)
176
      {
177
        /* Disable the selected Tamper Pin */
178
        LL_RTC_TAMPER_Disable(BKP);
179
      }
180
      /* Set the signal which will be routed to RTC Tamper Pin */
181
      LL_RTC_SetOutputSource(BKP, RTC_InitStruct->OutPutSource);
182
 
183
      /* Configure Synchronous and Asynchronous prescaler factor */
184
      LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler);
185
 
186
      /* Exit Initialization Mode */
187
      LL_RTC_ExitInitMode(RTCx);
188
 
189
      status = SUCCESS;
190
    }
191
  }
192
  return status;
193
}
194
 
195
/**
196
  * @brief  Set each @ref LL_RTC_InitTypeDef field to default value.
197
  * @param  RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized.
198
  * @retval None
199
  */
200
void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct)
201
{
202
  /* Set RTC_InitStruct fields to default values */
203
  RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT;
204
  RTC_InitStruct->OutPutSource    = LL_RTC_CALIB_OUTPUT_NONE;
205
}
206
 
207
/**
208
  * @brief  Set the RTC current time.
209
  * @param  RTCx RTC Instance
210
  * @param  RTC_Format This parameter can be one of the following values:
211
  *         @arg @ref LL_RTC_FORMAT_BIN
212
  *         @arg @ref LL_RTC_FORMAT_BCD
213
  * @param  RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains
214
  *                        the time configuration information for the RTC.
215
  * @note  The user should call LL_RTC_TIME_StructInit() or the structure
216
  *        of time need to be initialized  before time init()
217
  * @retval An ErrorStatus enumeration value:
218
  *          - SUCCESS: RTC Time register is configured
219
  *          - ERROR: RTC Time register is not configured
220
  */
221
ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
222
{
223
  ErrorStatus status = ERROR;
224
  uint32_t counter_time = 0U;
225
 
226
  /* Check the parameters */
227
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
228
  assert_param(IS_LL_RTC_FORMAT(RTC_Format));
229
 
230
  if (RTC_Format == LL_RTC_FORMAT_BIN)
231
  {
232
    assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours));
233
    assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes));
234
    assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds));
235
  }
236
  else
237
  {
238
    assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
239
    assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)));
240
    assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds)));
241
  }
242
 
243
  /* Enter Initialization mode */
244
  if (LL_RTC_EnterInitMode(RTCx) != ERROR)
245
  {
246
    /* Check the input parameters format */
247
    if (RTC_Format == LL_RTC_FORMAT_BIN)
248
    {
249
      counter_time = (uint32_t)(((uint32_t)RTC_TimeStruct->Hours * 3600U) + \
250
                                ((uint32_t)RTC_TimeStruct->Minutes * 60U) + \
251
                                ((uint32_t)RTC_TimeStruct->Seconds));
252
      LL_RTC_TIME_Set(RTCx, counter_time);
253
    }
254
    else
255
    {
256
      counter_time = (((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)) * 3600U) + \
257
                      ((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)) * 60U) + \
258
                      ((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds))));
259
      LL_RTC_TIME_Set(RTCx, counter_time);
260
    }
261
    status = SUCCESS;
262
  }
263
  /* Exit Initialization mode */
264
  LL_RTC_ExitInitMode(RTCx);
265
 
266
  return status;
267
}
268
 
269
/**
270
  * @brief  Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec).
271
  * @param  RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized.
272
  * @retval None
273
  */
274
void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct)
275
{
276
  /* Time = 00h:00min:00sec */
277
  RTC_TimeStruct->Hours      = 0U;
278
  RTC_TimeStruct->Minutes    = 0U;
279
  RTC_TimeStruct->Seconds    = 0U;
280
}
281
 
282
/**
283
  * @brief  Set the RTC Alarm.
284
  * @param  RTCx RTC Instance
285
  * @param  RTC_Format This parameter can be one of the following values:
286
  *         @arg @ref LL_RTC_FORMAT_BIN
287
  *         @arg @ref LL_RTC_FORMAT_BCD
288
  * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
289
  *                         contains the alarm configuration parameters.
290
  * @note   the user should call LL_RTC_ALARM_StructInit()  or the structure
291
  *         of Alarm need to be initialized  before Alarm init()
292
  * @retval An ErrorStatus enumeration value:
293
  *          - SUCCESS: ALARM registers are configured
294
  *          - ERROR: ALARM registers are not configured
295
  */
296
ErrorStatus LL_RTC_ALARM_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
297
{
298
  ErrorStatus status = ERROR;
299
  uint32_t counter_alarm = 0U;
300
  /* Check the parameters */
301
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
302
  assert_param(IS_LL_RTC_FORMAT(RTC_Format));
303
 
304
  if (RTC_Format == LL_RTC_FORMAT_BIN)
305
  {
306
    assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
307
    assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
308
    assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
309
  }
310
  else
311
  {
312
    assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
313
    assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
314
    assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
315
  }
316
 
317
  /* Enter Initialization mode */
318
  if (LL_RTC_EnterInitMode(RTCx) != ERROR)
319
  {
320
    /* Check the input parameters format */
321
    if (RTC_Format == LL_RTC_FORMAT_BIN)
322
    {
323
      counter_alarm = (uint32_t)(((uint32_t)RTC_AlarmStruct->AlarmTime.Hours * 3600U) + \
324
                                 ((uint32_t)RTC_AlarmStruct->AlarmTime.Minutes * 60U) + \
325
                                 ((uint32_t)RTC_AlarmStruct->AlarmTime.Seconds));
326
      LL_RTC_ALARM_Set(RTCx, counter_alarm);
327
    }
328
    else
329
    {
330
      counter_alarm = (((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)) * 3600U) + \
331
                       ((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)) * 60U) + \
332
                       ((uint32_t)(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds))));
333
      LL_RTC_ALARM_Set(RTCx, counter_alarm);
334
    }
335
    status = SUCCESS;
336
  }
337
  /* Exit Initialization mode */
338
  LL_RTC_ExitInitMode(RTCx);
339
 
340
  return status;
341
}
342
 
343
/**
344
  * @brief  Set each @ref LL_RTC_AlarmTypeDef of ALARM field to default value (Time = 00h:00mn:00sec /
345
  *         Day = 1st day of the month/Mask = all fields are masked).
346
  * @param  RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
347
  * @retval None
348
  */
349
void LL_RTC_ALARM_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
350
{
351
  /* Alarm Time Settings : Time = 00h:00mn:00sec */
352
  RTC_AlarmStruct->AlarmTime.Hours      = 0U;
353
  RTC_AlarmStruct->AlarmTime.Minutes    = 0U;
354
  RTC_AlarmStruct->AlarmTime.Seconds    = 0U;
355
}
356
 
357
/**
358
  * @brief  Enters the RTC Initialization mode.
359
  * @param  RTCx RTC Instance
360
  * @retval An ErrorStatus enumeration value:
361
  *          - SUCCESS: RTC is in Init mode
362
  *          - ERROR: RTC is not in Init mode
363
  */
364
ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx)
365
{
366
  __IO uint32_t timeout = RTC_INITMODE_TIMEOUT;
367
  ErrorStatus status = SUCCESS;
368
  uint32_t tmp = 0U;
369
 
370
  /* Check the parameter */
371
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
372
 
373
  /* Wait till RTC is in INIT state and if Time out is reached exit */
374
  tmp = LL_RTC_IsActiveFlag_RTOF(RTCx);
375
  while ((timeout != 0U) && (tmp != 1U))
376
  {
377
    if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
378
    {
379
      timeout --;
380
    }
381
    tmp = LL_RTC_IsActiveFlag_RTOF(RTCx);
382
    if (timeout == 0U)
383
    {
384
      status = ERROR;
385
    }
386
  }
387
 
388
  /* Disable the write protection for RTC registers */
389
  LL_RTC_DisableWriteProtection(RTCx);
390
 
391
  return status;
392
}
393
 
394
/**
395
  * @brief  Exit the RTC Initialization mode.
396
  * @note   When the initialization sequence is complete, the calendar restarts
397
  *         counting after 4 RTCCLK cycles.
398
  * @param  RTCx RTC Instance
399
  * @retval An ErrorStatus enumeration value:
400
  *          - SUCCESS: RTC exited from in Init mode
401
  *          - ERROR: Not applicable
402
  */
403
ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx)
404
{
405
  __IO uint32_t timeout = RTC_INITMODE_TIMEOUT;
406
  ErrorStatus status = SUCCESS;
407
  uint32_t tmp = 0U;
408
 
409
  /* Check the parameter */
410
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
411
 
412
  /* Disable initialization mode */
413
  LL_RTC_EnableWriteProtection(RTCx);
414
 
415
  /* Wait till RTC is in INIT state and if Time out is reached exit */
416
  tmp = LL_RTC_IsActiveFlag_RTOF(RTCx);
417
  while ((timeout != 0U) && (tmp != 1U))
418
  {
419
    if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
420
    {
421
      timeout --;
422
    }
423
    tmp = LL_RTC_IsActiveFlag_RTOF(RTCx);
424
    if (timeout == 0U)
425
    {
426
      status = ERROR;
427
    }
428
  }
429
  return status;
430
}
431
 
432
/**
433
  * @brief  Set the Time Counter
434
  * @param  RTCx RTC Instance
435
  * @param  TimeCounter this value can be from 0 to 0xFFFFFFFF
436
  * @retval An ErrorStatus enumeration value:
437
  *          - SUCCESS: RTC Counter register configured
438
  *          - ERROR: Not applicable
439
  */
440
ErrorStatus LL_RTC_TIME_SetCounter(RTC_TypeDef *RTCx, uint32_t TimeCounter)
441
{
442
  ErrorStatus status = ERROR;
443
  /* Check the parameter */
444
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
445
 
446
  /* Enter Initialization mode */
447
  if (LL_RTC_EnterInitMode(RTCx) != ERROR)
448
  {
449
    LL_RTC_TIME_Set(RTCx, TimeCounter);
450
    status = SUCCESS;
451
  }
452
  /* Exit Initialization mode */
453
  LL_RTC_ExitInitMode(RTCx);
454
 
455
  return status;
456
}
457
 
458
/**
459
  * @brief  Set Alarm Counter.
460
  * @param  RTCx RTC Instance
461
  * @param  AlarmCounter this value can be from 0 to 0xFFFFFFFF
462
  * @retval An ErrorStatus enumeration value:
463
  *          - SUCCESS: RTC exited from in Init mode
464
  *          - ERROR: Not applicable
465
  */
466
ErrorStatus LL_RTC_ALARM_SetCounter(RTC_TypeDef *RTCx, uint32_t AlarmCounter)
467
{
468
  ErrorStatus status = ERROR;
469
  /* Check the parameter */
470
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
471
 
472
  /* Enter Initialization mode */
473
  if (LL_RTC_EnterInitMode(RTCx) != ERROR)
474
  {
475
    LL_RTC_ALARM_Set(RTCx, AlarmCounter);
476
    status = SUCCESS;
477
  }
478
  /* Exit Initialization mode */
479
  LL_RTC_ExitInitMode(RTCx);
480
 
481
  return status;
482
}
483
 
484
/**
485
  * @brief  Waits until the RTC registers are synchronized with RTC APB clock.
486
  * @note   The RTC Resynchronization mode is write protected, use the
487
  *         @ref LL_RTC_DisableWriteProtection before calling this function.
488
  * @param  RTCx RTC Instance
489
  * @retval An ErrorStatus enumeration value:
490
  *          - SUCCESS: RTC registers are synchronised
491
  *          - ERROR: RTC registers are not synchronised
492
  */
493
ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx)
494
{
495
  __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT;
496
  ErrorStatus status = SUCCESS;
497
  uint32_t tmp = 0U;
498
 
499
  /* Check the parameter */
500
  assert_param(IS_RTC_ALL_INSTANCE(RTCx));
501
 
502
  /* Clear RSF flag */
503
  LL_RTC_ClearFlag_RS(RTCx);
504
 
505
  /* Wait the registers to be synchronised */
506
  tmp = LL_RTC_IsActiveFlag_RS(RTCx);
507
  while ((timeout != 0U) && (tmp != 0U))
508
  {
509
    if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
510
    {
511
      timeout--;
512
    }
513
    tmp = LL_RTC_IsActiveFlag_RS(RTCx);
514
    if (timeout == 0U)
515
    {
516
      status = ERROR;
517
    }
518
  }
519
 
520
  return (status);
521
}
522
 
523
/**
524
  * @}
525
  */
526
 
527
/**
528
  * @}
529
  */
530
 
531
/**
532
  * @}
533
  */
534
 
535
#endif /* defined(RTC) */
536
 
537
/**
538
  * @}
539
  */
540
 
541
#endif /* USE_FULL_LL_DRIVER */