hello world
Fork of lmic_MOTE_L152RC by
Diff: TARGET_MOTE_L152RC/hal.cpp
- Revision:
- 11:671d85a0f15b
- Parent:
- 8:0faa1bb768b5
--- a/TARGET_MOTE_L152RC/hal.cpp Wed Oct 21 01:03:34 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,328 +0,0 @@ -/* HAL for MOTE_L152RC */ - -#include "mbed.h" -#include "oslmic.h" -#include "debug.h" - -#define RADIO_MOSI PB_15 -#define RADIO_MISO PB_14 -#define RADIO_SCLK PB_13 -#define RADIO_NSS PB_12 -#define RESET_PIN PC_2 - -#define RFSW1 PC_4 //NorAm_Mote RFSwitch_CNTR_1 -#define RFSW2 PC_13 //NorAm_Mote RFSwitch_CNTR_2 - -static DigitalOut nss(RADIO_NSS); -static SPI spi(RADIO_MOSI, RADIO_MISO, RADIO_SCLK); // (mosi, miso, sclk) - -static DigitalInOut rst(RESET_PIN); - -DigitalOut rfsw1(RFSW1); -DigitalOut rfsw2(RFSW2); - -DigitalOut hdr_fem_csd(PC_0); - -static InterruptIn dio0(PC_6); -static InterruptIn dio1(PC_10); -static InterruptIn dio2(PC_11); - -extern RTC_HandleTypeDef RtcHandle; - -// HAL state -static struct { - int irqlevel; -} HAL; - -void radio_irq_handler (u1_t dio); - -static void dio0Irq( void ){ - radio_irq_handler( 0 ); -} -static void dio1Irq( void ){ - radio_irq_handler( 1 ); -} -static void dio2Irq( void ){ - radio_irq_handler( 2 ); -} - -void hal_disableIRQs() -{ - __disable_irq(); - HAL.irqlevel++; -} - -void hal_enableIRQs() -{ - if (--HAL.irqlevel == 0) { - __enable_irq(); - } -} - -void hal_failed () -{ - while (1) - asm("nop"); -} - -static void rtc_wkup_irq(void) -{ - HAL_RTCEx_WakeUpTimerIRQHandler(&RtcHandle); -} - -void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) -{ - /* Clear Wake Up Flag */ - __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); -} - -/*void HAL_RCC_CCSCallback() -{ - for (;;) asm("nop"); -}*/ - - -volatile uint32_t /*rcc_cr_a, rcc_cr_b,*/ rcc_cr_c; -void hal_init (void) -{ - memset(&HAL, 0x00, sizeof(HAL)); - hal_disableIRQs(); - -#if USE_SMTC_RADIO_DRIVER - -#else - // configure input lines - dio0.mode(PullDown); - dio0.rise(dio0Irq); - dio0.enable_irq(); - dio1.mode(PullDown); - dio1.rise(dio1Irq); - dio1.enable_irq(); - dio2.mode(PullDown); - dio2.rise(dio2Irq); - dio2.enable_irq(); - // configure reset line - rst.input(); - // configure spi - spi.frequency(8000000); - spi.format(8, 0); - nss = 1; - //RFSwitch_CNTR_2 = 1; -#endif - - set_time(0); // initialize RTC - - /* Enable Ultra low power mode */ - HAL_PWREx_EnableUltraLowPower(); - - /* Enable the fast wake up from Ultra low power mode */ - HAL_PWREx_EnableFastWakeUp(); - - __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RtcHandle, RTC_FLAG_WUTF); - - NVIC_SetVector(RTC_WKUP_IRQn, (uint32_t)rtc_wkup_irq); - NVIC_EnableIRQ(RTC_WKUP_IRQn); - - hdr_fem_csd = 0; - - hal_enableIRQs(); - - GPIOA->MODER |= 0x01415500; // unused pins as outputs: PA4, PA5, PA6, PA7, PA8, (PA11,PA12 USB) - GPIOB->MODER |= 0x00000401; // unused pins as outputs: PB0(HDR_DIO1), PB5 (PB10 pulled hi by LED), PB3-T_SWO - GPIOC->MODER |= 0x00000041; // unused pins as outputs: PC0(HDR_FEM_CSD), PC3(SPI3_enable) - - -} - -u4_t hal_ticks () -{ - RTC_DateTypeDef dateStruct; - RTC_TimeTypeDef timeStruct; - struct tm timeinfo; - uint16_t sub_seconds; - - RtcHandle.Instance = RTC; - - // Read actual date and time - // Warning: the time must be read first! - HAL_RTC_GetTime(&RtcHandle, &timeStruct, FORMAT_BIN); - HAL_RTC_GetDate(&RtcHandle, &dateStruct, FORMAT_BIN); - sub_seconds = 16384 - timeStruct.SubSeconds; // RTC_SSR counts down - - // Setup a tm structure based on the RTC - timeinfo.tm_wday = dateStruct.WeekDay; - timeinfo.tm_mon = dateStruct.Month - 1; - timeinfo.tm_mday = dateStruct.Date; - timeinfo.tm_year = dateStruct.Year + 100; - timeinfo.tm_hour = timeStruct.Hours; - timeinfo.tm_min = timeStruct.Minutes; - timeinfo.tm_sec = timeStruct.Seconds; - - // Convert to timestamp - time_t t = mktime(&timeinfo); - - // 14: SSR is driven at 16384Hz - t <<= 14; - return t | sub_seconds; -} - -void hal_waitUntil (u4_t time) -{ - while (hal_ticks() < time) - asm("nop"); -} - - -volatile char deep_sleep; -/* return 1 if target time is soon, return 0 if timer was programmed */ -u1_t hal_checkTimer (u4_t time) -{ - int d = time - hal_ticks(); - - HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle); - __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RtcHandle, RTC_FLAG_WUTF); - - if (d < 0x10000) { // less than 4s - deep_sleep = 0; - if (d < 4) - return 1; // very soon - if (d > ms2osticks(100)) { - d -= 13; // HSE_PLL startup time - deep_sleep = 1; - } - // 61.035us steps - HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, d, RTC_WAKEUPCLOCK_RTCCLK_DIV2); - } else if (d < 0x20000) { // less than 8s - d -= 6; // HSE_PLL startup time - deep_sleep = 1; - // 122us steps - HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, d >> 1, RTC_WAKEUPCLOCK_RTCCLK_DIV4); - } else if (d < 0x40000) { // less than 16s - deep_sleep = 1; - // 244us steps - HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, d >> 2, RTC_WAKEUPCLOCK_RTCCLK_DIV8); - } else if (d < 0x80000) { // less than 32s - deep_sleep = 1; - // 488us steps - HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, d >> 3, RTC_WAKEUPCLOCK_RTCCLK_DIV16); - } else { - deep_sleep = 1; - // 1s steps to 18hours - HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, d >> 14, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); - /* RTC_WAKEUPCLOCK_CK_SPRE_17BITS: 18h to 36h */ - /*for (;;) - asm("nop");*/ - } - - return 0; -} - -//#define SLEEP_DEBUG 1 - -void hal_sleep () -{ -#ifdef SLEEP_DEBUG - u4_t start_tick, end_tick; - volatile uint32_t time_asleep; -#endif /* SLEEP_DEBUG */ - -#ifdef USE_DEBUGGER - HAL_EnableDBGStopMode(); - if (!DBGMCU->CR & DBGMCU_CR_DBG_STOP) - for (;;) asm("nop"); -#endif /* USE_DEBUGGER */ - - //printf("%x cr:%06x isr:%04x %d\r\n", RtcHandle.Instance->WUTR, RtcHandle.Instance->CR, RtcHandle.Instance->ISR, deep_sleep); - //debug_done(); - - if (deep_sleep) - debug_done(); // wait here if debug still printing - - if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(&RtcHandle, RTC_FLAG_WUTF) == 0) { - // set gpio for sleep -#ifdef SLEEP_DEBUG - start_tick = hal_ticks(); -#endif /* SLEEP_DEBUG */ - - - if (deep_sleep) { -#ifndef USE_DEBUGGER - /* PA13 to undriven JTMS/SWDIO pin (from AF0 to GPIO), and PA2 */ - GPIOA->MODER &= 0xf7ffffdf; - GPIOB->MODER &= 0xffffdfff; // PB6 UART_TX to input -#endif - deepsleep(); // blocks until waking -#ifndef USE_DEBUGGER - /* PA13 back to JTMS/SWDIO pin (from GPIO to AF0), and PA2 */ - GPIOA->MODER |= 0x08000020; - GPIOB->MODER |= 0x00002000; // PB6 input to UART_TX -#endif - } else - sleep(); // blocks until waking - -#ifdef SLEEP_DEBUG - end_tick = hal_ticks(); - time_asleep = end_tick - start_tick; - printf("%u = %u - %u\r\n", time_asleep, end_tick, start_tick); -#endif /* SLEEP_DEBUG */ - // restore gpio from sleep - } -} - -void hal_pin_nss (u1_t val) -{ - nss = val; -} - -u1_t hal_spi (u1_t out) -{ - return spi.write(out); -} - -// 0=RX 1=TX -/*void hal_pin_rxtx (u1_t val) -{ - rxtx = !val; -}*/ -#define OPMODE_LORA 0x80 -#define OPMODE_MASK 0x07 -#define OPMODE_SLEEP 0x00 -#define OPMODE_STANDBY 0x01 -#define OPMODE_FSTX 0x02 -#define OPMODE_TX 0x03 -#define OPMODE_FSRX 0x04 -#define OPMODE_RX 0x05 -#define OPMODE_RX_SINGLE 0x06 -#define OPMODE_CAD 0x07 -void hal_opmode(u1_t mode, u1_t pa_boost) -{ - if (mode == OPMODE_TX) { // start of transmission - if (pa_boost) { - rfsw2 = 0; - rfsw1 = 1; - } else { - rfsw2 = 1; - rfsw1 = 0; - } - hdr_fem_csd = 0; // debug - } else if (mode == OPMODE_RX || mode == OPMODE_RX_SINGLE || mode == OPMODE_CAD) { // start of reception - rfsw2 = 1; - rfsw1 = 1; - hdr_fem_csd = 1; // debug - } else { // RF switch shutdown - rfsw2 = 0; - rfsw1 = 0; - hdr_fem_csd = 0; // debug - } -} - -void hal_pin_rst (u1_t val) -{ - if (val == 0 || val == 1) { // drive pin - rst.output(); - rst = val; - } else { // keep pin floating - rst.input(); - } -} -