diff options
| author | hathach <[email protected]> | 2018-07-24 00:10:22 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-07-24 00:10:22 +0700 |
| commit | 546f2a1165555819bf3ef09fe1afcfbcbb084dd9 (patch) | |
| tree | aec5ea7425bf7796ed25bdf95ef842e9ab714031 /hw | |
| parent | 5f6cd4903101b0486771efdb2bb435ddf6cf8e7a (diff) | |
nrf52840 example work with boot keyboard
Diffstat (limited to 'hw')
| -rw-r--r-- | hw/bsp/board.h | 1 | ||||
| -rw-r--r-- | hw/bsp/pca10056/board_pca10056.c | 78 |
2 files changed, 60 insertions, 19 deletions
diff --git a/hw/bsp/board.h b/hw/bsp/board.h index 827f22d7e..f9007992f 100644 --- a/hw/bsp/board.h +++ b/hw/bsp/board.h @@ -150,7 +150,6 @@ static inline void board_led_off(uint32_t led_id) board_led_control(led_id, false); } - /** \brief Get the current state of the buttons on the board * \return Bitmask where a '1' means active (pressed), a '0' means inactive. */ diff --git a/hw/bsp/pca10056/board_pca10056.c b/hw/bsp/pca10056/board_pca10056.c index 7b7a43b6e..85e32cf2d 100644 --- a/hw/bsp/pca10056/board_pca10056.c +++ b/hw/bsp/pca10056/board_pca10056.c @@ -44,10 +44,16 @@ /* MACRO TYPEDEF CONSTANT ENUM *------------------------------------------------------------------*/ #define LED_1 13 + #define LED_STATE_ON 0 #define LED_STATE_OFF (1-LED_STATE_ON) +uint8_t _button_pins[] = { 11, 12, 24, 25 }; + +#define BOARD_BUTTON_COUNT arrcount_(_button_pins) + + /*------------------------------------------------------------------*/ /* TUSB HAL MILLISECOND *------------------------------------------------------------------*/ @@ -60,44 +66,72 @@ void SysTick_Handler (void) uint32_t tusb_hal_millis(void) { - //#define tick2ms(tck) ( ( ((uint64_t)(tck)) * 1000) / configTICK_RATE_HZ ) - //return tick2ms( app_timer_cnt_get() ); - return board_tick2ms(system_ticks); } /*------------------------------------------------------------------*/ /* BOARD API *------------------------------------------------------------------*/ + +/* tinyusb function that handles power event (detected, ready, removed) + * We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. + */ +extern void tusb_hal_nrf_power_event(uint32_t event); + void board_init(void) { // Config clock source: XTAL or RC in sdk_config.h NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk); NRF_CLOCK->TASKS_LFCLKSTART = 1UL; + // LED nrf_gpio_cfg_output(LED_1); + // Button + for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) nrf_gpio_cfg_input(_button_pins[i], NRF_GPIO_PIN_PULLUP); + + // Tick init + SysTick_Config(SystemCoreClock/1000); + NVIC_EnableIRQ(SysTick_IRQn); + + // USB power may already be ready at this time -> no event generated + // We need to invoke the handler based on the status initially + uint32_t usb_reg; + #ifdef SOFTDEVICE_PRESENT - // TODO support Softdevice config + uint8_t sd_en = false; + (void) sd_softdevice_is_enabled(&sd_en); + + if ( sd_en ) { + sd_power_usbdetected_enable(true); + sd_power_usbpwrrdy_enable(true); + sd_power_usbremoved_enable(true); + + sd_power_usbregstatus_get(&usb_reg); + }else #else - // Softdevice is not present, init power module and register tusb power event function - // for vusb detect, ready, removed - extern void tusb_hal_nrf_power_event(uint32_t event); + { + // Power module init + const nrfx_power_config_t pwr_cfg = { 0 }; + nrfx_power_init(&pwr_cfg); - // Power module init - const nrfx_power_config_t pwr_cfg = { 0 }; - nrfx_power_init(&pwr_cfg); + // Register tusb function as USB power handler + const nrfx_power_usbevt_config_t config = { .handler = (nrfx_power_usb_event_handler_t) tusb_hal_nrf_power_event }; + nrfx_power_usbevt_init(&config); - // USB Power detection - const nrfx_power_usbevt_config_t config = { .handler = (nrfx_power_usb_event_handler_t) tusb_hal_nrf_power_event }; - nrfx_power_usbevt_init(&config); + nrfx_power_usbevt_enable(); - nrfx_power_usbevt_enable(); + usb_reg = NRF_POWER->USBREGSTATUS; + } #endif - // Tick init - SysTick_Config(SystemCoreClock/1000); - NVIC_EnableIRQ(SysTick_IRQn); + if ( usb_reg & POWER_USBREGSTATUS_VBUSDETECT_Msk ) { + tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_DETECTED); + } + + if ( usb_reg & POWER_USBREGSTATUS_OUTPUTRDY_Msk ) { + tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY); + } } void board_led_control(uint32_t led_id, bool state) @@ -108,7 +142,15 @@ void board_led_control(uint32_t led_id, bool state) uint32_t board_buttons(void) { - return 0; + uint32_t ret = 0; + + for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) + { + // button is active LOW + ret |= ( nrf_gpio_pin_read(_button_pins[i]) ? 0 : BIT_(i)); + } + + return ret; } uint8_t board_uart_getchar(void) |
