boart test board

Dependencies:   USBDevice mbed-dev lwip

Fork of USBSerial_HelloWorld by Compass Yap

Committer:
ua1arn
Date:
Tue Jul 24 23:24:53 2018 +0000
Revision:
19:8b7595ced647
Parent:
18:c276f3d01630
Child:
20:4b2a3c310b61
added sdram init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ua1arn 19:8b7595ced647 1 #include "mbed.h"
ua1arn 17:8279856460a8 2 #include "platform/mbed_critical.h"
ua1arn 17:8279856460a8 3 #include "platform/mbed_power_mgmt.h"
ua1arn 17:8279856460a8 4
ua1arn 17:8279856460a8 5 #include "platform/platform.h"
ua1arn 17:8279856460a8 6 #include "hal/pinmap.h"
ua1arn 17:8279856460a8 7
ua1arn 19:8b7595ced647 8
ua1arn 19:8b7595ced647 9
ua1arn 19:8b7595ced647 10 #define SDRAM_TIMEOUT ((uint32_t)0xFFFF)
ua1arn 19:8b7595ced647 11
ua1arn 19:8b7595ced647 12 #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
ua1arn 19:8b7595ced647 13 #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)
ua1arn 19:8b7595ced647 14 #define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002)
ua1arn 19:8b7595ced647 15 #define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004)
ua1arn 19:8b7595ced647 16 #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
ua1arn 19:8b7595ced647 17 #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)
ua1arn 19:8b7595ced647 18 #define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020)
ua1arn 19:8b7595ced647 19 #define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
ua1arn 19:8b7595ced647 20 #define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
ua1arn 19:8b7595ced647 21 #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
ua1arn 19:8b7595ced647 22 #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)
ua1arn 19:8b7595ced647 23
ua1arn 19:8b7595ced647 24 #define REFRESH_COUNT ((uint32_t)0x056A) /* SDRAM refresh counter (90MHz SDRAM clock) */
ua1arn 19:8b7595ced647 25
ua1arn 19:8b7595ced647 26 /**
ua1arn 19:8b7595ced647 27 * @brief Perform the SDRAM exernal memory inialization sequence
ua1arn 19:8b7595ced647 28 * @param hsdram: SDRAM handle
ua1arn 19:8b7595ced647 29 * @param Command: Pointer to SDRAM command structure
ua1arn 19:8b7595ced647 30 * @retval None
ua1arn 19:8b7595ced647 31 */
ua1arn 19:8b7595ced647 32 static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
ua1arn 19:8b7595ced647 33 {
ua1arn 19:8b7595ced647 34 __IO uint32_t tmpmrd =0;
ua1arn 19:8b7595ced647 35 /* Step 3: Configure a clock configuration enable command */
ua1arn 19:8b7595ced647 36 Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
ua1arn 19:8b7595ced647 37 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
ua1arn 19:8b7595ced647 38 Command->AutoRefreshNumber = 1;
ua1arn 19:8b7595ced647 39 Command->ModeRegisterDefinition = 0;
ua1arn 19:8b7595ced647 40
ua1arn 19:8b7595ced647 41 /* Send the command */
ua1arn 19:8b7595ced647 42 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
ua1arn 19:8b7595ced647 43
ua1arn 19:8b7595ced647 44 /* Step 4: Insert 100 ms delay */
ua1arn 19:8b7595ced647 45 wait((float)0.1);
ua1arn 19:8b7595ced647 46
ua1arn 19:8b7595ced647 47 /* Step 5: Configure a PALL (precharge all) command */
ua1arn 19:8b7595ced647 48 Command->CommandMode = FMC_SDRAM_CMD_PALL;
ua1arn 19:8b7595ced647 49 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
ua1arn 19:8b7595ced647 50 Command->AutoRefreshNumber = 1;
ua1arn 19:8b7595ced647 51 Command->ModeRegisterDefinition = 0;
ua1arn 19:8b7595ced647 52
ua1arn 19:8b7595ced647 53 /* Send the command */
ua1arn 19:8b7595ced647 54 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
ua1arn 19:8b7595ced647 55
ua1arn 19:8b7595ced647 56 /* Step 6 : Configure a Auto-Refresh command */
ua1arn 19:8b7595ced647 57 Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
ua1arn 19:8b7595ced647 58 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
ua1arn 19:8b7595ced647 59 Command->AutoRefreshNumber = 4;
ua1arn 19:8b7595ced647 60 Command->ModeRegisterDefinition = 0;
ua1arn 19:8b7595ced647 61
ua1arn 19:8b7595ced647 62 /* Send the command */
ua1arn 19:8b7595ced647 63 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
ua1arn 19:8b7595ced647 64
ua1arn 19:8b7595ced647 65 /* Step 7: Program the external memory mode register */
ua1arn 19:8b7595ced647 66 tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
ua1arn 19:8b7595ced647 67 SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
ua1arn 19:8b7595ced647 68 SDRAM_MODEREG_CAS_LATENCY_2 |
ua1arn 19:8b7595ced647 69 SDRAM_MODEREG_OPERATING_MODE_STANDARD |
ua1arn 19:8b7595ced647 70 SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
ua1arn 19:8b7595ced647 71
ua1arn 19:8b7595ced647 72 Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
ua1arn 19:8b7595ced647 73 Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
ua1arn 19:8b7595ced647 74 Command->AutoRefreshNumber = 1;
ua1arn 19:8b7595ced647 75 Command->ModeRegisterDefinition = tmpmrd;
ua1arn 19:8b7595ced647 76
ua1arn 19:8b7595ced647 77 /* Send the command */
ua1arn 19:8b7595ced647 78 HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
ua1arn 19:8b7595ced647 79
ua1arn 19:8b7595ced647 80 /* Step 8: Set the refresh rate counter */
ua1arn 19:8b7595ced647 81 /* (15.62 us x Freq) - 20 */
ua1arn 19:8b7595ced647 82 /* Set the device refresh counter */
ua1arn 19:8b7595ced647 83 HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
ua1arn 19:8b7595ced647 84 }
ua1arn 19:8b7595ced647 85
ua1arn 18:c276f3d01630 86 typedef class fmc
ua1arn 17:8279856460a8 87 {
ua1arn 17:8279856460a8 88 public:
ua1arn 17:8279856460a8 89
ua1arn 18:c276f3d01630 90 ~fmc() {
ua1arn 17:8279856460a8 91 core_util_critical_section_enter();
ua1arn 17:8279856460a8 92 unlock_deep_sleep();
ua1arn 17:8279856460a8 93 core_util_critical_section_exit();
ua1arn 17:8279856460a8 94 }
ua1arn 17:8279856460a8 95
ua1arn 18:c276f3d01630 96 fmc() :
ua1arn 17:8279856460a8 97 _deep_sleep_locked(false) {
ua1arn 17:8279856460a8 98 core_util_critical_section_enter();
ua1arn 18:c276f3d01630 99
ua1arn 17:8279856460a8 100 __HAL_RCC_GPIOC_CLK_ENABLE();
ua1arn 17:8279856460a8 101 __HAL_RCC_GPIOD_CLK_ENABLE();
ua1arn 17:8279856460a8 102 __HAL_RCC_GPIOE_CLK_ENABLE();
ua1arn 17:8279856460a8 103 __HAL_RCC_GPIOF_CLK_ENABLE();
ua1arn 17:8279856460a8 104 __HAL_RCC_GPIOG_CLK_ENABLE();
ua1arn 17:8279856460a8 105
ua1arn 18:c276f3d01630 106
ua1arn 18:c276f3d01630 107 /** FMC GPIO Configuration
ua1arn 18:c276f3d01630 108 PF0 ------> FMC_A0
ua1arn 18:c276f3d01630 109 PF1 ------> FMC_A1
ua1arn 18:c276f3d01630 110 PF2 ------> FMC_A2
ua1arn 18:c276f3d01630 111 PF3 ------> FMC_A3
ua1arn 18:c276f3d01630 112 PF4 ------> FMC_A4
ua1arn 18:c276f3d01630 113 PF5 ------> FMC_A5
ua1arn 18:c276f3d01630 114 PC0 ------> FMC_SDNWE
ua1arn 18:c276f3d01630 115 PC2 ------> FMC_SDNE0
ua1arn 18:c276f3d01630 116 PC3 ------> FMC_SDCKE0
ua1arn 18:c276f3d01630 117 PF11 ------> FMC_SDNRAS
ua1arn 18:c276f3d01630 118 PF12 ------> FMC_A6
ua1arn 18:c276f3d01630 119 PF13 ------> FMC_A7
ua1arn 18:c276f3d01630 120 PF14 ------> FMC_A8
ua1arn 18:c276f3d01630 121 PF15 ------> FMC_A9
ua1arn 18:c276f3d01630 122 PG0 ------> FMC_A10
ua1arn 18:c276f3d01630 123 PG1 ------> FMC_A11
ua1arn 18:c276f3d01630 124 PE7 ------> FMC_D4
ua1arn 18:c276f3d01630 125 PE8 ------> FMC_D5
ua1arn 18:c276f3d01630 126 PE9 ------> FMC_D6
ua1arn 18:c276f3d01630 127 PE10 ------> FMC_D7
ua1arn 18:c276f3d01630 128 PE11 ------> FMC_D8
ua1arn 18:c276f3d01630 129 PE12 ------> FMC_D9
ua1arn 18:c276f3d01630 130 PE13 ------> FMC_D10
ua1arn 18:c276f3d01630 131 PE14 ------> FMC_D11
ua1arn 18:c276f3d01630 132 PE15 ------> FMC_D12
ua1arn 18:c276f3d01630 133 PD8 ------> FMC_D13
ua1arn 18:c276f3d01630 134 PD9 ------> FMC_D14
ua1arn 18:c276f3d01630 135 PD10 ------> FMC_D15
ua1arn 18:c276f3d01630 136 PD14 ------> FMC_D0
ua1arn 18:c276f3d01630 137 PD15 ------> FMC_D1
ua1arn 18:c276f3d01630 138 PG4 ------> FMC_BA0
ua1arn 18:c276f3d01630 139 PG5 ------> FMC_BA1
ua1arn 18:c276f3d01630 140 PG8 ------> FMC_SDCLK
ua1arn 18:c276f3d01630 141 PD0 ------> FMC_D2
ua1arn 18:c276f3d01630 142 PD1 ------> FMC_D3
ua1arn 18:c276f3d01630 143 PG15 ------> FMC_SDNCAS
ua1arn 18:c276f3d01630 144 PE0 ------> FMC_NBL0
ua1arn 18:c276f3d01630 145 PE1 ------> FMC_NBL1
ua1arn 18:c276f3d01630 146 */
ua1arn 18:c276f3d01630 147 pin_function(PF_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A0
ua1arn 18:c276f3d01630 148 pin_function(PF_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A1
ua1arn 18:c276f3d01630 149 pin_function(PF_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A2
ua1arn 18:c276f3d01630 150 pin_function(PF_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A3
ua1arn 18:c276f3d01630 151 pin_function(PF_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A4
ua1arn 18:c276f3d01630 152 pin_function(PF_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A5
ua1arn 18:c276f3d01630 153 pin_function(PF_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A6
ua1arn 18:c276f3d01630 154 pin_function(PF_13, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A7
ua1arn 18:c276f3d01630 155 pin_function(PF_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A8
ua1arn 18:c276f3d01630 156 pin_function(PF_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A9
ua1arn 18:c276f3d01630 157 pin_function(PG_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A10
ua1arn 18:c276f3d01630 158 pin_function(PG_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_A11
ua1arn 19:8b7595ced647 159
ua1arn 19:8b7595ced647 160 pin_function(PD_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D0
ua1arn 19:8b7595ced647 161 pin_function(PD_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D1
ua1arn 19:8b7595ced647 162 pin_function(PD_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D2
ua1arn 19:8b7595ced647 163 pin_function(PD_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D3
ua1arn 18:c276f3d01630 164 pin_function(PE_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D4
ua1arn 18:c276f3d01630 165 pin_function(PE_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D5
ua1arn 18:c276f3d01630 166 pin_function(PE_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D6
ua1arn 18:c276f3d01630 167 pin_function(PE_10, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D7
ua1arn 18:c276f3d01630 168 pin_function(PE_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D8
ua1arn 18:c276f3d01630 169 pin_function(PE_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D9
ua1arn 18:c276f3d01630 170 pin_function(PE_13, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D10
ua1arn 18:c276f3d01630 171 pin_function(PE_14, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D11
ua1arn 18:c276f3d01630 172 pin_function(PE_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D12
ua1arn 18:c276f3d01630 173 pin_function(PD_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D13
ua1arn 18:c276f3d01630 174 pin_function(PD_9, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D14
ua1arn 18:c276f3d01630 175 pin_function(PD_10, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_D15
ua1arn 19:8b7595ced647 176
ua1arn 18:c276f3d01630 177 pin_function(PG_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_BA0
ua1arn 18:c276f3d01630 178 pin_function(PG_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_BA1
ua1arn 18:c276f3d01630 179 pin_function(PG_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDCLK
ua1arn 19:8b7595ced647 180
ua1arn 18:c276f3d01630 181 pin_function(PG_15, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDNCAS
ua1arn 19:8b7595ced647 182 pin_function(PC_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDNWE
ua1arn 19:8b7595ced647 183 pin_function(PC_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDNE0
ua1arn 19:8b7595ced647 184 pin_function(PC_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDCKE0
ua1arn 19:8b7595ced647 185 pin_function(PF_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_SDNRAS
ua1arn 18:c276f3d01630 186 pin_function(PE_0, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_NBL0
ua1arn 18:c276f3d01630 187 pin_function(PE_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)); // FMC_NBL1
ua1arn 17:8279856460a8 188
ua1arn 17:8279856460a8 189 __HAL_RCC_FMC_CLK_ENABLE();
ua1arn 18:c276f3d01630 190
ua1arn 19:8b7595ced647 191 FMC_SDRAM_TimingTypeDef SdramTiming = { 0 };
ua1arn 18:c276f3d01630 192 /** Perform the SDRAM1 memory initialization sequence
ua1arn 18:c276f3d01630 193 */
ua1arn 19:8b7595ced647 194 SDRAM_HandleTypeDef hsdram1 = { 0 };
ua1arn 19:8b7595ced647 195 FMC_SDRAM_CommandTypeDef command = { 0 };
ua1arn 18:c276f3d01630 196
ua1arn 19:8b7595ced647 197 hsdram1.Instance = FMC_Bank5_6;
ua1arn 18:c276f3d01630 198 /* hsdram1.Init */
ua1arn 18:c276f3d01630 199 hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
ua1arn 18:c276f3d01630 200 hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
ua1arn 18:c276f3d01630 201 hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
ua1arn 18:c276f3d01630 202 hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
ua1arn 18:c276f3d01630 203 hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
ua1arn 18:c276f3d01630 204 hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
ua1arn 18:c276f3d01630 205 hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
ua1arn 18:c276f3d01630 206 hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
ua1arn 18:c276f3d01630 207 hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
ua1arn 18:c276f3d01630 208 hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
ua1arn 18:c276f3d01630 209 /* SdramTiming */
ua1arn 18:c276f3d01630 210 SdramTiming.LoadToActiveDelay = 2;
ua1arn 18:c276f3d01630 211 SdramTiming.ExitSelfRefreshDelay = 7;
ua1arn 18:c276f3d01630 212 SdramTiming.SelfRefreshTime = 4;
ua1arn 18:c276f3d01630 213 SdramTiming.RowCycleDelay = 2;
ua1arn 18:c276f3d01630 214 SdramTiming.WriteRecoveryTime = 2;
ua1arn 18:c276f3d01630 215 SdramTiming.RPDelay = 2;
ua1arn 18:c276f3d01630 216 SdramTiming.RCDDelay = 2;
ua1arn 18:c276f3d01630 217
ua1arn 18:c276f3d01630 218 if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) {
ua1arn 18:c276f3d01630 219 //_Error_Handler(__FILE__, __LINE__);
ua1arn 18:c276f3d01630 220 }
ua1arn 19:8b7595ced647 221 /* Program the SDRAM external device */
ua1arn 19:8b7595ced647 222 SDRAM_Initialization_Sequence(&hsdram1, &command);
ua1arn 18:c276f3d01630 223
ua1arn 17:8279856460a8 224 core_util_critical_section_exit();
ua1arn 18:c276f3d01630 225 }
ua1arn 17:8279856460a8 226
ua1arn 17:8279856460a8 227 protected:
ua1arn 17:8279856460a8 228 /** Lock deep sleep only if it is not yet locked */
ua1arn 17:8279856460a8 229 void lock_deep_sleep() {
ua1arn 17:8279856460a8 230 if (_deep_sleep_locked == false) {
ua1arn 17:8279856460a8 231 sleep_manager_lock_deep_sleep();
ua1arn 17:8279856460a8 232 _deep_sleep_locked = true;
ua1arn 17:8279856460a8 233 }
ua1arn 17:8279856460a8 234 }
ua1arn 17:8279856460a8 235
ua1arn 17:8279856460a8 236 /** Unlock deep sleep in case it is locked */
ua1arn 17:8279856460a8 237 void unlock_deep_sleep() {
ua1arn 17:8279856460a8 238 if (_deep_sleep_locked == true) {
ua1arn 17:8279856460a8 239 sleep_manager_unlock_deep_sleep();
ua1arn 17:8279856460a8 240 _deep_sleep_locked = false;
ua1arn 17:8279856460a8 241 }
ua1arn 17:8279856460a8 242 }
ua1arn 17:8279856460a8 243
ua1arn 17:8279856460a8 244 bool _deep_sleep_locked;
ua1arn 17:8279856460a8 245
ua1arn 17:8279856460a8 246 } FMC;
ua1arn 17:8279856460a8 247
ua1arn 17:8279856460a8 248 static FMC fmc;