X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=metawatch%2Fmw_main.c;h=4ba6c542845b7dd1f177e62a2f09579f458d4aa5;hp=fa1f98e41bba605d2059e0918b06d23fa9f0a0db;hb=1b5790095c23913d02531727e47b79af3568e0b1;hpb=3e320aaa4175a0ed469581f1dea2eac35b390878 diff --git a/metawatch/mw_main.c b/metawatch/mw_main.c index fa1f98e..4ba6c54 100644 --- a/metawatch/mw_main.c +++ b/metawatch/mw_main.c @@ -3,6 +3,9 @@ #include #include +#include "F5xx_F6xx_Core_Lib/HAL_PMM.h" +#include "F5xx_F6xx_Core_Lib/HAL_UCS.h" + #include "mw_main.h" #include "mw_uart.h" @@ -17,10 +20,32 @@ #include "oswald_main.h" #include "oswald_hal.h" -#include "bluetooth_init_cc256x.h" uint16_t _event_src = 0; +#define HARDWARE_REVISION_ADDRESS (0x1a07) + +unsigned char GetMsp430HardwareRevision(void) +{ + unsigned char *pDeviceType = (unsigned char *)(unsigned char *)HARDWARE_REVISION_ADDRESS; + + return pDeviceType[0]+'1'; +} + +uint8_t DetermineErrata(void) +{ + unsigned char Revision = GetMsp430HardwareRevision(); + + switch (Revision) { + case 'F': + case 'H': + return 0; + break; + default: + return 1; + break; + } +} static void set16mhz(void) { @@ -46,6 +71,8 @@ static void setup_clocks(void) { unsigned long i; + SetVCore(PMMCOREV_2); + /* use external oscillator */ P7SEL |= BIT0 + BIT1; if ((UCSCTL6 & XT1DRIVE_3) != XT1DRIVE_3) { @@ -62,6 +89,34 @@ static void setup_clocks(void) UCSCTL8 |= SMCLKREQEN; + // setup for quick wake up from interrupt and + // minimal power consumption in sleep mode + DISABLE_SVSL(); // SVS Low side is turned off + DISABLE_SVSL_RESET(); + + DISABLE_SVML(); // Monitor low side is turned off + DISABLE_SVML_INTERRUPT(); + + DISABLE_SVMH(); // Monitor high side is turned off + DISABLE_SVMH_INTERRUPT(); + + ENABLE_SVSH(); // SVS High side is turned on + ENABLE_SVSH_RESET(); // Enable POR on SVS Event + + SVSH_ENABLED_IN_LPM_FULL_PERF(); // SVS high side Full perf mode, + // stays on in LPM3,enhanced protect + + // Wait until high side, low side settled + while ((PMMIFG & SVSMLDLYIFG) == 0 && (PMMIFG & SVSMHDLYIFG) == 0) + nop(); + CLEAR_PMM_IFGS(); + + // Errata PMM17 + if (DetermineErrata()) { + *(unsigned int*)(0x0110) = 0x9602; + *(unsigned int*)(0x0112) |= 0x0800; + } + /* enable oscillator fault NMI IRQ */ // SFRIE1 = OFIE; } @@ -112,7 +167,8 @@ static void setup_pins(void) DISABLE_LCD_LED(); // frontlight CONFIG_DEBUG_PINS(); CONFIG_ACCELEROMETER_PINS(); - DISABLE_ACCELEROMETER_POWER(); // starts from config 5 and later + //DISABLE_ACCELEROMETER_POWER(); // starts from config 5 and later + ENABLE_ACCELEROMETER_POWER(); // starts from config 5 and later HARDWARE_CFG_SENSE_INIT(); @@ -183,16 +239,22 @@ __interrupt void RTC_ISR (void) { switch (RTCIV) { case RTCIV_NONE: + debug_uart_tx("RTC none IRQ\n"); break; case RTCIV_RTCRDYIFG: case RTCIV_RTCTEVIFG: case RTCIV_RTCAIFG: case RTCIV_RT0PSIFG: + debug_uart_tx("RTC misc IRQ\n"); break; case RTCIV_RT1PSIFG: RTCPS1CTL &= ~RT1PSIFG; _event_src |= RTC_1HZ_EVENT; LPM3_EXIT; + nop(); +#if defined MW_DEVBOARD_V2 + LED7_TOGGLE(); +#endif break; default: break; @@ -245,7 +307,6 @@ static void dbg_out_rtc(void) char clk_str[16]; snprintf(clk_str, 16, "%02d:%02d.%02d %d\n", RTCHOUR, RTCMIN, RTCSEC, RTCDOW); debug_uart_tx(clk_str); - // bt_l2cap_send_channel(0x40, clk_str, strlen(clk_str)); } #endif @@ -392,13 +453,6 @@ static void handle_uart_rx_event(void) nop(); } else if (c == '-') { nop(); - } else if (c == 't') { - int i; - debug_uart_tx("cc256x ini content:\n"); - for (i=0; i<16; i++) { - snprintf(tstr, 16, "0x%04x 0x%02x\n", i, cc256x_init_script[i]); - debug_uart_tx(tstr); - } } else if (c == 'H') { uint8_t dclass[3]; dclass[0] = BT_MW_DEVICE_CLASS & 0xff; @@ -441,16 +495,16 @@ static void handle_uart_rx_event(void) void start_timer(int cycles) { TA0EX0 = TAIDEX_0; - TA0CTL = TASSEL_1 | TACLR | MC__STOP; // SMCLK, clear TAR - TA0CCTL0 = CCIE; // CCR0 interrupt enabled + TA0CTL = TASSEL_1 | TACLR | MC__STOP; // SMCLK, clear TAR + TA0CCTL0 = CCIE; // CCR0 interrupt enabled TA0CCR0 = cycles; - TA0CTL |= MC_1; // Start Timer_A in continuous mode + TA0CTL |= MC_1; // Start Timer_A in continuous mode } void stop_timer(void) { - TA0CCTL0 &= ~CCIE; // CCR0 interrupt enabled - TA0CTL = MC__STOP; // Start Timer_A in continuous mode + TA0CCTL0 &= ~CCIE; // CCR0 interrupt enabled + TA0CTL = MC__STOP; // Start Timer_A in continuous mode } // Timer A0 interrupt service routine @@ -483,11 +537,13 @@ uint8_t handle_event(void) oswald_one_second_tick(); #if defined MW_DEVBOARD_V2 dbg_out_rtc(); - LED7_TOGGLE(); #endif } else if (_event_src & BT_UART_RCV_EVENT) { _event_src &= ~BT_UART_RCV_EVENT; handle_bt_uart_rx_event(); + } else if (_event_src & BT_UART_WAKEUP_EVENT) { + _event_src &= ~BT_UART_WAKEUP_EVENT; + bt_hci_ehcill_wake(); } else if (_event_src & DBG_UART_RCV_EVENT) { _event_src &= ~DBG_UART_RCV_EVENT; #if defined MW_DEVBOARD_V2 @@ -518,29 +574,28 @@ uint8_t handle_event(void) #pragma vector=BUTTON_PORT_VECTOR __interrupt void BUTTON_ISR (void) { + LPM3_EXIT; BUTTON_PORT_IFG &= ~ALL_BUTTONS; // BUTTON_PORT_IE &= ~INT_EDGE_SEL_BUTTONS; _event_src |= BUTTON_EVENT; //_button_state = (BUTTON_PORT_IN & ALL_BUTTONS); - LPM3_EXIT; } #pragma vector=PORT1_VECTOR __interrupt void PORT1_GPIO_ISR (void) { if (P1IFG & BT_IO_CTS) { + LPM3_EXIT; + P1IE &= ~BT_IO_CTS; P1IFG &= ~BT_IO_CTS; - debug_uart_tx("BT CTS irq\n"); - bt_hci_ehcill_wake(); - + _event_src |= BT_UART_WAKEUP_EVENT; + // bt_hci_ehcill_wake(); + } else if (P1IFG & ACCELEROMETER_INT_PIN) { LPM3_EXIT; - }; - if (P1IFG & ACCELEROMETER_INT_PIN) { P1IFG &= ~ACCELEROMETER_INT_PIN; // debug_uart_tx("ACC irq\n"); _event_src |= ACCEL_EVENT; - LPM3_EXIT; } } @@ -556,15 +611,13 @@ __interrupt void UNEXP_ISR (void) int main(void) { - int idle = 0; - setup_wdt(); setup_pins(); setup_clocks(); setup_rtc(); /* enable interrupts, we will need them! */ - __eint(); + __enable_interrupt(); #if defined MW_DEVBOARD_V2 init_debug_uart(); @@ -578,32 +631,25 @@ int main(void) mw_init_adc(); mw_init_vibrate_pwm(); -#if 0 - RTCYEAR = (unsigned int) 2013; - RTCMON = (unsigned int) 1; - RTCDAY = (unsigned int) 1; - RTCDOW = (unsigned int) 2; - RTCHOUR = (unsigned int) 01; - RTCMIN = (unsigned int) 0; - RTCSEC = (unsigned int) 0; -#endif - oswald_set_time(RTCHOUR, RTCMIN, RTCSEC, TRUE); oswald_set_date(RTCDAY, RTCMON, RTCYEAR, TRUE); oswald_init(); while (1) { /* handle pending events */ - if (handle_event()) - idle++; - else - idle = 0; + handle_event(); /* enter LPM3 sleep mode waiting for interrupt */ - if (idle > 100) { - idle = 0; - // debug_uart_tx("z"); - LPM3; + /* errata PMM11 + PMM12 - divide MCLK before going to sleep */ + if (DetermineErrata()) { + MCLK_DIV(2); + nop(); + } + LPM3; + nop(); + if (DetermineErrata()) { + __delay_cycles(100); + MCLK_DIV(1); } };