Simulated the CD changer of a Saab to implement a bluetooth connection to the car stereo. Control of playback device (phone) with steering wheel buttons. Needs a RN52 bluetooth transciever and a CAN transiever. So far only audio playback and control via steering wheel buttons implemented. Hands free calling planned.
PowerControl/PowerControl.h@11:74844f6ca8cf, 2016-01-28 (annotated)
- Committer:
- petter
- Date:
- Thu Jan 28 21:22:08 2016 +0000
- Revision:
- 11:74844f6ca8cf
Added power saving, added RN52 timeout.; Added errors in display and track metadata
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
petter | 11:74844f6ca8cf | 1 | /* mbed PowerControl Library |
petter | 11:74844f6ca8cf | 2 | * Copyright (c) 2010 Michael Wei |
petter | 11:74844f6ca8cf | 3 | */ |
petter | 11:74844f6ca8cf | 4 | |
petter | 11:74844f6ca8cf | 5 | #ifndef MBED_POWERCONTROL_H |
petter | 11:74844f6ca8cf | 6 | #define MBED_POWERCONTROL_H |
petter | 11:74844f6ca8cf | 7 | |
petter | 11:74844f6ca8cf | 8 | //shouldn't have to include, but fixes weird problems with defines |
petter | 11:74844f6ca8cf | 9 | #include "mbed.h" |
petter | 11:74844f6ca8cf | 10 | |
petter | 11:74844f6ca8cf | 11 | //System Control Register |
petter | 11:74844f6ca8cf | 12 | // bit 0: Reserved |
petter | 11:74844f6ca8cf | 13 | // bit 1: Sleep on Exit |
petter | 11:74844f6ca8cf | 14 | #define LPC1768_SCR_SLEEPONEXIT 0x2 |
petter | 11:74844f6ca8cf | 15 | // bit 2: Deep Sleep |
petter | 11:74844f6ca8cf | 16 | #define LPC1768_SCR_SLEEPDEEP 0x4 |
petter | 11:74844f6ca8cf | 17 | // bit 3: Resereved |
petter | 11:74844f6ca8cf | 18 | // bit 4: Send on Pending |
petter | 11:74844f6ca8cf | 19 | #define LPC1768_SCR_SEVONPEND 0x10 |
petter | 11:74844f6ca8cf | 20 | // bit 5-31: Reserved |
petter | 11:74844f6ca8cf | 21 | |
petter | 11:74844f6ca8cf | 22 | //Power Control Register |
petter | 11:74844f6ca8cf | 23 | // bit 0: Power mode control bit 0 (power-down mode) |
petter | 11:74844f6ca8cf | 24 | #define LPC1768_PCON_PM0 0x1 |
petter | 11:74844f6ca8cf | 25 | // bit 1: Power mode control bit 1 (deep power-down mode) |
petter | 11:74844f6ca8cf | 26 | #define LPC1768_PCON_PM1 0x2 |
petter | 11:74844f6ca8cf | 27 | // bit 2: Brown-out reduced power mode |
petter | 11:74844f6ca8cf | 28 | #define LPC1768_PCON_BODRPM 0x4 |
petter | 11:74844f6ca8cf | 29 | // bit 3: Brown-out global disable |
petter | 11:74844f6ca8cf | 30 | #define LPC1768_PCON_BOGD 0x8 |
petter | 11:74844f6ca8cf | 31 | // bit 4: Brown-out reset disable |
petter | 11:74844f6ca8cf | 32 | #define LPC1768_PCON_BORD 0x10 |
petter | 11:74844f6ca8cf | 33 | // bit 5-7 : Reserved |
petter | 11:74844f6ca8cf | 34 | // bit 8: Sleep Mode Entry Flag |
petter | 11:74844f6ca8cf | 35 | #define LPC1768_PCON_SMFLAG 0x100 |
petter | 11:74844f6ca8cf | 36 | // bit 9: Deep Sleep Entry Flag |
petter | 11:74844f6ca8cf | 37 | #define LPC1768_PCON_DSFLAG 0x200 |
petter | 11:74844f6ca8cf | 38 | // bit 10: Power Down Entry Flag |
petter | 11:74844f6ca8cf | 39 | #define LPC1768_PCON_PDFLAG 0x400 |
petter | 11:74844f6ca8cf | 40 | // bit 11: Deep Power Down Entry Flag |
petter | 11:74844f6ca8cf | 41 | #define LPC1768_PCON_DPDFLAG 0x800 |
petter | 11:74844f6ca8cf | 42 | // bit 12-31: Reserved |
petter | 11:74844f6ca8cf | 43 | |
petter | 11:74844f6ca8cf | 44 | //"Sleep Mode" (WFI). |
petter | 11:74844f6ca8cf | 45 | inline void Sleep(void) |
petter | 11:74844f6ca8cf | 46 | { |
petter | 11:74844f6ca8cf | 47 | __WFI(); |
petter | 11:74844f6ca8cf | 48 | } |
petter | 11:74844f6ca8cf | 49 | |
petter | 11:74844f6ca8cf | 50 | //"Deep Sleep" Mode |
petter | 11:74844f6ca8cf | 51 | inline void DeepSleep(void) |
petter | 11:74844f6ca8cf | 52 | { |
petter | 11:74844f6ca8cf | 53 | SCB->SCR |= LPC1768_SCR_SLEEPDEEP; |
petter | 11:74844f6ca8cf | 54 | __WFI(); |
petter | 11:74844f6ca8cf | 55 | } |
petter | 11:74844f6ca8cf | 56 | |
petter | 11:74844f6ca8cf | 57 | //"Power-Down" Mode |
petter | 11:74844f6ca8cf | 58 | inline void PowerDown(void) |
petter | 11:74844f6ca8cf | 59 | { |
petter | 11:74844f6ca8cf | 60 | SCB->SCR |= LPC1768_SCR_SLEEPDEEP; |
petter | 11:74844f6ca8cf | 61 | LPC_SC->PCON &= ~LPC1768_PCON_PM1; |
petter | 11:74844f6ca8cf | 62 | LPC_SC->PCON |= LPC1768_PCON_PM0; |
petter | 11:74844f6ca8cf | 63 | __WFI(); |
petter | 11:74844f6ca8cf | 64 | //reset back to normal |
petter | 11:74844f6ca8cf | 65 | LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0); |
petter | 11:74844f6ca8cf | 66 | } |
petter | 11:74844f6ca8cf | 67 | |
petter | 11:74844f6ca8cf | 68 | //"Deep Power-Down" Mode |
petter | 11:74844f6ca8cf | 69 | inline void DeepPowerDown(void) |
petter | 11:74844f6ca8cf | 70 | { |
petter | 11:74844f6ca8cf | 71 | SCB->SCR |= LPC1768_SCR_SLEEPDEEP; |
petter | 11:74844f6ca8cf | 72 | LPC_SC->PCON |= LPC1768_PCON_PM1 | LPC1768_PCON_PM0; |
petter | 11:74844f6ca8cf | 73 | __WFI(); |
petter | 11:74844f6ca8cf | 74 | //reset back to normal |
petter | 11:74844f6ca8cf | 75 | LPC_SC->PCON &= ~(LPC1768_PCON_PM1 | LPC1768_PCON_PM0); |
petter | 11:74844f6ca8cf | 76 | } |
petter | 11:74844f6ca8cf | 77 | |
petter | 11:74844f6ca8cf | 78 | //shut down BOD during power-down/deep sleep |
petter | 11:74844f6ca8cf | 79 | inline void BrownOut_ReducedPowerMode_Enable(void) |
petter | 11:74844f6ca8cf | 80 | { |
petter | 11:74844f6ca8cf | 81 | LPC_SC->PCON |= LPC1768_PCON_BODRPM; |
petter | 11:74844f6ca8cf | 82 | } |
petter | 11:74844f6ca8cf | 83 | |
petter | 11:74844f6ca8cf | 84 | //turn on BOD during power-down/deep sleep |
petter | 11:74844f6ca8cf | 85 | inline void BrownOut_ReducedPowerMode_Disable(void) |
petter | 11:74844f6ca8cf | 86 | { |
petter | 11:74844f6ca8cf | 87 | LPC_SC->PCON &= ~LPC1768_PCON_BODRPM; |
petter | 11:74844f6ca8cf | 88 | } |
petter | 11:74844f6ca8cf | 89 | |
petter | 11:74844f6ca8cf | 90 | //turn off brown out circutry |
petter | 11:74844f6ca8cf | 91 | inline void BrownOut_Global_Disable(void) |
petter | 11:74844f6ca8cf | 92 | { |
petter | 11:74844f6ca8cf | 93 | LPC_SC->PCON |= LPC1768_PCON_BOGD; |
petter | 11:74844f6ca8cf | 94 | } |
petter | 11:74844f6ca8cf | 95 | |
petter | 11:74844f6ca8cf | 96 | //turn on brown out circutry |
petter | 11:74844f6ca8cf | 97 | inline void BrownOut_Global_Enable(void) |
petter | 11:74844f6ca8cf | 98 | { |
petter | 11:74844f6ca8cf | 99 | LPC_SC->PCON &= !LPC1768_PCON_BOGD; |
petter | 11:74844f6ca8cf | 100 | } |
petter | 11:74844f6ca8cf | 101 | |
petter | 11:74844f6ca8cf | 102 | //turn off brown out reset circutry |
petter | 11:74844f6ca8cf | 103 | inline void BrownOut_Reset_Disable(void) |
petter | 11:74844f6ca8cf | 104 | { |
petter | 11:74844f6ca8cf | 105 | LPC_SC->PCON |= LPC1768_PCON_BORD; |
petter | 11:74844f6ca8cf | 106 | } |
petter | 11:74844f6ca8cf | 107 | |
petter | 11:74844f6ca8cf | 108 | //turn on brown outreset circutry |
petter | 11:74844f6ca8cf | 109 | inline void BrownOut_Reset_Enable(void) |
petter | 11:74844f6ca8cf | 110 | { |
petter | 11:74844f6ca8cf | 111 | LPC_SC->PCON &= ~LPC1768_PCON_BORD; |
petter | 11:74844f6ca8cf | 112 | } |
petter | 11:74844f6ca8cf | 113 | //Peripheral Control Register |
petter | 11:74844f6ca8cf | 114 | // bit 0: Reserved |
petter | 11:74844f6ca8cf | 115 | // bit 1: PCTIM0: Timer/Counter 0 power/clock enable |
petter | 11:74844f6ca8cf | 116 | #define LPC1768_PCONP_PCTIM0 0x2 |
petter | 11:74844f6ca8cf | 117 | // bit 2: PCTIM1: Timer/Counter 1 power/clock enable |
petter | 11:74844f6ca8cf | 118 | #define LPC1768_PCONP_PCTIM1 0x4 |
petter | 11:74844f6ca8cf | 119 | // bit 3: PCUART0: UART 0 power/clock enable |
petter | 11:74844f6ca8cf | 120 | #define LPC1768_PCONP_PCUART0 0x8 |
petter | 11:74844f6ca8cf | 121 | // bit 4: PCUART1: UART 1 power/clock enable |
petter | 11:74844f6ca8cf | 122 | #define LPC1768_PCONP_PCUART1 0x10 |
petter | 11:74844f6ca8cf | 123 | // bit 5: Reserved |
petter | 11:74844f6ca8cf | 124 | // bit 6: PCPWM1: PWM 1 power/clock enable |
petter | 11:74844f6ca8cf | 125 | #define LPC1768_PCONP_PCPWM1 0x40 |
petter | 11:74844f6ca8cf | 126 | // bit 7: PCI2C0: I2C interface 0 power/clock enable |
petter | 11:74844f6ca8cf | 127 | #define LPC1768_PCONP_PCI2C0 0x80 |
petter | 11:74844f6ca8cf | 128 | // bit 8: PCSPI: SPI interface power/clock enable |
petter | 11:74844f6ca8cf | 129 | #define LPC1768_PCONP_PCSPI 0x100 |
petter | 11:74844f6ca8cf | 130 | // bit 9: PCRTC: RTC power/clock enable |
petter | 11:74844f6ca8cf | 131 | #define LPC1768_PCONP_PCRTC 0x200 |
petter | 11:74844f6ca8cf | 132 | // bit 10: PCSSP1: SSP interface 1 power/clock enable |
petter | 11:74844f6ca8cf | 133 | #define LPC1768_PCONP_PCSSP1 0x400 |
petter | 11:74844f6ca8cf | 134 | // bit 11: Reserved |
petter | 11:74844f6ca8cf | 135 | // bit 12: PCADC: A/D converter power/clock enable |
petter | 11:74844f6ca8cf | 136 | #define LPC1768_PCONP_PCADC 0x1000 |
petter | 11:74844f6ca8cf | 137 | // bit 13: PCCAN1: CAN controller 1 power/clock enable |
petter | 11:74844f6ca8cf | 138 | #define LPC1768_PCONP_PCCAN1 0x2000 |
petter | 11:74844f6ca8cf | 139 | // bit 14: PCCAN2: CAN controller 2 power/clock enable |
petter | 11:74844f6ca8cf | 140 | #define LPC1768_PCONP_PCCAN2 0x4000 |
petter | 11:74844f6ca8cf | 141 | // bit 15: PCGPIO: GPIOs power/clock enable |
petter | 11:74844f6ca8cf | 142 | #define LPC1768_PCONP_PCGPIO 0x8000 |
petter | 11:74844f6ca8cf | 143 | // bit 16: PCRIT: Repetitive interrupt timer power/clock enable |
petter | 11:74844f6ca8cf | 144 | #define LPC1768_PCONP_PCRIT 0x10000 |
petter | 11:74844f6ca8cf | 145 | // bit 17: PCMCPWM: Motor control PWM power/clock enable |
petter | 11:74844f6ca8cf | 146 | #define LPC1768_PCONP_PCMCPWM 0x20000 |
petter | 11:74844f6ca8cf | 147 | // bit 18: PCQEI: Quadrature encoder interface power/clock enable |
petter | 11:74844f6ca8cf | 148 | #define LPC1768_PCONP_PCQEI 0x40000 |
petter | 11:74844f6ca8cf | 149 | // bit 19: PCI2C1: I2C interface 1 power/clock enable |
petter | 11:74844f6ca8cf | 150 | #define LPC1768_PCONP_PCI2C1 0x80000 |
petter | 11:74844f6ca8cf | 151 | // bit 20: Reserved |
petter | 11:74844f6ca8cf | 152 | // bit 21: PCSSP0: SSP interface 0 power/clock enable |
petter | 11:74844f6ca8cf | 153 | #define LPC1768_PCONP_PCSSP0 0x200000 |
petter | 11:74844f6ca8cf | 154 | // bit 22: PCTIM2: Timer 2 power/clock enable |
petter | 11:74844f6ca8cf | 155 | #define LPC1768_PCONP_PCTIM2 0x400000 |
petter | 11:74844f6ca8cf | 156 | // bit 23: PCTIM3: Timer 3 power/clock enable |
petter | 11:74844f6ca8cf | 157 | #define LPC1768_PCONP_PCQTIM3 0x800000 |
petter | 11:74844f6ca8cf | 158 | // bit 24: PCUART2: UART 2 power/clock enable |
petter | 11:74844f6ca8cf | 159 | #define LPC1768_PCONP_PCUART2 0x1000000 |
petter | 11:74844f6ca8cf | 160 | // bit 25: PCUART3: UART 3 power/clock enable |
petter | 11:74844f6ca8cf | 161 | #define LPC1768_PCONP_PCUART3 0x2000000 |
petter | 11:74844f6ca8cf | 162 | // bit 26: PCI2C2: I2C interface 2 power/clock enable |
petter | 11:74844f6ca8cf | 163 | #define LPC1768_PCONP_PCI2C2 0x4000000 |
petter | 11:74844f6ca8cf | 164 | // bit 27: PCI2S: I2S interface power/clock enable |
petter | 11:74844f6ca8cf | 165 | #define LPC1768_PCONP_PCI2S 0x8000000 |
petter | 11:74844f6ca8cf | 166 | // bit 28: Reserved |
petter | 11:74844f6ca8cf | 167 | // bit 29: PCGPDMA: GP DMA function power/clock enable |
petter | 11:74844f6ca8cf | 168 | #define LPC1768_PCONP_PCGPDMA 0x20000000 |
petter | 11:74844f6ca8cf | 169 | // bit 30: PCENET: Ethernet block power/clock enable |
petter | 11:74844f6ca8cf | 170 | #define LPC1768_PCONP_PCENET 0x40000000 |
petter | 11:74844f6ca8cf | 171 | // bit 31: PCUSB: USB interface power/clock enable |
petter | 11:74844f6ca8cf | 172 | #define LPC1768_PCONP_PCUSB 0x80000000 |
petter | 11:74844f6ca8cf | 173 | |
petter | 11:74844f6ca8cf | 174 | //Powers Up specified Peripheral(s) |
petter | 11:74844f6ca8cf | 175 | inline unsigned int Peripheral_PowerUp(unsigned int bitMask) |
petter | 11:74844f6ca8cf | 176 | { |
petter | 11:74844f6ca8cf | 177 | return LPC_SC->PCONP |= bitMask; |
petter | 11:74844f6ca8cf | 178 | } |
petter | 11:74844f6ca8cf | 179 | |
petter | 11:74844f6ca8cf | 180 | //Powers Down specified Peripheral(s) |
petter | 11:74844f6ca8cf | 181 | inline unsigned int Peripheral_PowerDown(unsigned int bitMask) |
petter | 11:74844f6ca8cf | 182 | { |
petter | 11:74844f6ca8cf | 183 | return LPC_SC->PCONP &= ~bitMask; |
petter | 11:74844f6ca8cf | 184 | } |
petter | 11:74844f6ca8cf | 185 | |
petter | 11:74844f6ca8cf | 186 | //returns if the peripheral is on or off |
petter | 11:74844f6ca8cf | 187 | inline bool Peripheral_GetStatus(unsigned int peripheral) |
petter | 11:74844f6ca8cf | 188 | { |
petter | 11:74844f6ca8cf | 189 | return (LPC_SC->PCONP & peripheral) ? true : false; |
petter | 11:74844f6ca8cf | 190 | } |
petter | 11:74844f6ca8cf | 191 | |
petter | 11:74844f6ca8cf | 192 | |
petter | 11:74844f6ca8cf | 193 | // Function to power down magic USB interface chip with new firmware |
petter | 11:74844f6ca8cf | 194 | #define USR_POWERDOWN (0x104) |
petter | 11:74844f6ca8cf | 195 | inline int semihost_powerdown() |
petter | 11:74844f6ca8cf | 196 | { |
petter | 11:74844f6ca8cf | 197 | uint32_t arg; |
petter | 11:74844f6ca8cf | 198 | return __semihost(USR_POWERDOWN, &arg); |
petter | 11:74844f6ca8cf | 199 | } |
petter | 11:74844f6ca8cf | 200 | |
petter | 11:74844f6ca8cf | 201 | #endif |