add board_button_read()

This commit is contained in:
hathach
2019-04-01 18:31:20 +07:00
parent 2cc4ab2aef
commit 8457d0d14c
15 changed files with 59 additions and 53 deletions

View File

@@ -67,6 +67,11 @@
<file file_name="../../../../../hw/mcu/microchip/samd/asf4/samd21/hpl/sysctrl/hpl_sysctrl.c" /> <file file_name="../../../../../hw/mcu/microchip/samd/asf4/samd21/hpl/sysctrl/hpl_sysctrl.c" />
</folder> </folder>
</folder> </folder>
<folder Name="hal">
<folder Name="src">
<file file_name="../../../../../hw/mcu/microchip/samd/asf4/samd21/hal/src/hal_atomic.c" />
</folder>
</folder>
</folder> </folder>
</folder> </folder>
</folder> </folder>

View File

@@ -135,7 +135,7 @@ void usb_hid_task(void)
if ( board_millis() < start_ms + interval_ms) return; // not enough time if ( board_millis() < start_ms + interval_ms) return; // not enough time
start_ms += interval_ms; start_ms += interval_ms;
uint32_t const btn = board_buttons(); uint32_t const btn = board_button_read();
if ( tud_suspended() && btn ) if ( tud_suspended() && btn )
{ {

View File

@@ -158,7 +158,7 @@ void usb_hid_task(void* params)
if ( board_millis() < start_ms + interval_ms) return; // not enough time if ( board_millis() < start_ms + interval_ms) return; // not enough time
start_ms += interval_ms; start_ms += interval_ms;
uint32_t const btn = board_buttons(); uint32_t const btn = board_button_read();
/*------------- Keyboard -------------*/ /*------------- Keyboard -------------*/
if ( tud_hid_keyboard_ready() ) if ( tud_hid_keyboard_ready() )

View File

@@ -46,6 +46,7 @@
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Board Porting API // Board Porting API
// For simplicity, only one LED and one Button are used
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Initialize on-board peripherals : led, button, uart and USB // Initialize on-board peripherals : led, button, uart and USB
@@ -54,9 +55,9 @@ void board_init(void);
// Turn LED on or off // Turn LED on or off
void board_led_control(bool state); void board_led_control(bool state);
// Get the current state of buttons on the board // Get the current state of button
// \return Bitmask where a '1' means active (pressed), a '0' means inactive. // a '1' means active (pressed), a '0' means inactive.
uint32_t board_buttons(void); uint32_t board_button_read(void);
// Get characters from UART // Get characters from UART
int board_uart_read(uint8_t* buf, int len); int board_uart_read(uint8_t* buf, int len);
@@ -65,28 +66,20 @@ int board_uart_read(uint8_t* buf, int len);
int board_uart_write(void const * buf, int len); int board_uart_write(void const * buf, int len);
#if CFG_TUSB_OS == OPT_OS_NONE #if CFG_TUSB_OS == OPT_OS_NONE
// Get current milliseconds, must be implemented when no RTOS is used
// Get current milliseconds, must be implemented in board.c when no OS is used uint32_t board_millis(void);
uint32_t board_millis(void);
#elif CFG_TUSB_OS == OPT_OS_FREERTOS #elif CFG_TUSB_OS == OPT_OS_FREERTOS
static inline uint32_t board_millis(void)
static inline uint32_t board_millis(void) {
{ return ( ( ((uint64_t) xTaskGetTickCount()) * 1000) / configTICK_RATE_HZ );
return ( ( ((uint64_t) xTaskGetTickCount()) * 1000) / configTICK_RATE_HZ ); }
}
#elif CFG_TUSB_OS == OPT_OS_MYNEWT #elif CFG_TUSB_OS == OPT_OS_MYNEWT
static inline uint32_t board_millis(void)
static inline uint32_t board_millis(void) {
{ return os_time_ticks_to_ms32( os_time_get() );
return os_time_ticks_to_ms32( os_time_get() ); }
}
#elif #elif
#error "Need to implement board_millis() for this OS"
#error "Need to implement board_millis() for this OS"
#endif #endif
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@@ -127,7 +127,7 @@ static bool button_read(uint8_t id)
} }
#endif #endif
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t result = 0; uint32_t result = 0;

View File

@@ -269,7 +269,7 @@ static bool button_read(uint8_t id)
} }
#endif #endif
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t result = 0; uint32_t result = 0;

View File

@@ -121,7 +121,7 @@ void board_led_control(bool state)
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Buttons // Buttons
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
// for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOGetPinValue(buttons[i].port, buttons[i].pin); // for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) GPIOGetPinValue(buttons[i].port, buttons[i].pin);
// return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low // return GPIOGetPinValue(buttons[0].port, buttons[0].pin) ? 0 : 1; // button is active low

View File

@@ -144,7 +144,7 @@ static bool button_read(uint8_t id)
} }
#endif #endif
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t result = 0; uint32_t result = 0;

View File

@@ -180,7 +180,7 @@ static bool button_read(uint8_t id)
} }
#endif #endif
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t result = 0; uint32_t result = 0;

View File

@@ -193,7 +193,7 @@ static bool button_read(uint8_t id)
} }
*/ */
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t result = 0; uint32_t result = 0;

View File

@@ -19,7 +19,8 @@ SRC_C += \
hw/mcu/microchip/samd/asf4/samd21/gcc/system_samd21.c \ hw/mcu/microchip/samd/asf4/samd21/gcc/system_samd21.c \
hw/mcu/microchip/samd/asf4/samd21/hpl/gclk/hpl_gclk.c \ hw/mcu/microchip/samd/asf4/samd21/hpl/gclk/hpl_gclk.c \
hw/mcu/microchip/samd/asf4/samd21/hpl/pm/hpl_pm.c \ hw/mcu/microchip/samd/asf4/samd21/hpl/pm/hpl_pm.c \
hw/mcu/microchip/samd/asf4/samd21/hpl/sysctrl/hpl_sysctrl.c hw/mcu/microchip/samd/asf4/samd21/hpl/sysctrl/hpl_sysctrl.c \
hw/mcu/microchip/samd/asf4/samd21/hal/src/hal_atomic.c
INC += \ INC += \
-I$(TOP)/hw/mcu/microchip/samd/asf4/samd21/ \ -I$(TOP)/hw/mcu/microchip/samd/asf4/samd21/ \

View File

@@ -39,6 +39,7 @@
// MACRO TYPEDEF CONSTANT ENUM DECLARATION // MACRO TYPEDEF CONSTANT ENUM DECLARATION
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
#define LED_PIN 17 #define LED_PIN 17
#define BUTTON_PIN 14
/* Referenced GCLKs, should be initialized firstly */ /* Referenced GCLKs, should be initialized firstly */
#define _GCLK_INIT_1ST (1 << 0 | 1 << 1) #define _GCLK_INIT_1ST (1 << 0 | 1 << 1)
@@ -63,6 +64,10 @@ void board_init(void)
gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT); gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);
gpio_set_pin_level(LED_PIN, 0); gpio_set_pin_level(LED_PIN, 0);
// Button init
gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);
gpio_set_pin_pull_mode(BUTTON_PIN, GPIO_PULL_UP);
#if CFG_TUSB_OS == OPT_OS_NONE #if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer (samd SystemCoreClock may not correct) // 1ms tick timer (samd SystemCoreClock may not correct)
SysTick_Config(CONF_CPU_FREQUENCY / 1000); SysTick_Config(CONF_CPU_FREQUENCY / 1000);
@@ -101,10 +106,12 @@ void board_led_control(bool state)
gpio_set_pin_level(LED_PIN, state); gpio_set_pin_level(LED_PIN, state);
} }
uint32_t board_button_read(void)
{
// button is active low
return gpio_get_pin_level(BUTTON_PIN) ? 0 : 1;
}
/*------------------------------------------------------------------*/
/* TUSB HAL MILLISECOND
*------------------------------------------------------------------*/
#if CFG_TUSB_OS == OPT_OS_NONE #if CFG_TUSB_OS == OPT_OS_NONE
volatile uint32_t system_ticks = 0; volatile uint32_t system_ticks = 0;
@@ -118,5 +125,4 @@ uint32_t board_millis(void)
return system_ticks; return system_ticks;
} }
#endif #endif

View File

@@ -21,7 +21,8 @@ SRC_C += \
hw/mcu/microchip/samd/asf4/samd51/hpl/gclk/hpl_gclk.c \ hw/mcu/microchip/samd/asf4/samd51/hpl/gclk/hpl_gclk.c \
hw/mcu/microchip/samd/asf4/samd51/hpl/mclk/hpl_mclk.c \ hw/mcu/microchip/samd/asf4/samd51/hpl/mclk/hpl_mclk.c \
hw/mcu/microchip/samd/asf4/samd51/hpl/osc32kctrl/hpl_osc32kctrl.c \ hw/mcu/microchip/samd/asf4/samd51/hpl/osc32kctrl/hpl_osc32kctrl.c \
hw/mcu/microchip/samd/asf4/samd51/hpl/oscctrl/hpl_oscctrl.c hw/mcu/microchip/samd/asf4/samd51/hpl/oscctrl/hpl_oscctrl.c \
hw/mcu/microchip/samd/asf4/samd51/hal/src/hal_atomic.c
INC += \ INC += \
-I$(TOP)/hw/mcu/microchip/samd/asf4/samd51/ \ -I$(TOP)/hw/mcu/microchip/samd/asf4/samd51/ \

View File

@@ -35,7 +35,8 @@
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM DECLARATION // MACRO TYPEDEF CONSTANT ENUM DECLARATION
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
#define LED_PIN 16 #define LED_PIN 16
#define BUTTON_PIN (32 + 17)
/* Referenced GCLKs, should be initialized firstly */ /* Referenced GCLKs, should be initialized firstly */
#define _GCLK_INIT_1ST 0xFFFFFFFF #define _GCLK_INIT_1ST 0xFFFFFFFF
@@ -61,6 +62,10 @@ void board_init(void)
gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT); gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);
gpio_set_pin_level(LED_PIN, 0); gpio_set_pin_level(LED_PIN, 0);
// Button init
gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);
gpio_set_pin_pull_mode(BUTTON_PIN, GPIO_PULL_UP);
#if CFG_TUSB_OS == OPT_OS_NONE #if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer (samd SystemCoreClock may not correct) // 1ms tick timer (samd SystemCoreClock may not correct)
SysTick_Config(CONF_CPU_FREQUENCY / 1000); SysTick_Config(CONF_CPU_FREQUENCY / 1000);
@@ -90,6 +95,11 @@ void board_led_control(bool state)
gpio_set_pin_level(LED_PIN, state); gpio_set_pin_level(LED_PIN, state);
} }
uint32_t board_button_read(void)
{
// button is active low
return gpio_get_pin_level(BUTTON_PIN) ? 0 : 1;
}
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* TUSB HAL MILLISECOND /* TUSB HAL MILLISECOND

View File

@@ -42,10 +42,7 @@
#define LED_PIN 13 #define LED_PIN 13
#define LED_STATE_ON 0 #define LED_STATE_ON 0
uint8_t _button_pins[] = { 11, 12, 24, 25 }; #define BUTTON_PIN 11
#define BUTTON_COUNT sizeof(_button_pins)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
/* TUSB HAL MILLISECOND /* TUSB HAL MILLISECOND
@@ -79,12 +76,12 @@ void board_init(void)
NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk); NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk);
NRF_CLOCK->TASKS_LFCLKSTART = 1UL; NRF_CLOCK->TASKS_LFCLKSTART = 1UL;
// LEDs // LED
nrf_gpio_cfg_output(LED_PIN); nrf_gpio_cfg_output(LED_PIN);
board_led_control(false); board_led_control(false);
// Button // Button
for(uint8_t i=0; i<BUTTON_COUNT; i++) nrf_gpio_cfg_input(_button_pins[i], NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
#if CFG_TUSB_OS == OPT_OS_NONE #if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer // 1ms tick timer
@@ -134,17 +131,10 @@ void board_led_control(bool state)
nrf_gpio_pin_write(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON)); nrf_gpio_pin_write(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));
} }
uint32_t board_buttons(void) uint32_t board_button_read(void)
{ {
uint32_t ret = 0; // button is active LOW
return (nrf_gpio_pin_read(BUTTON_PIN) ? 0 : 1);
for(uint8_t i=0; i<BUTTON_COUNT; i++)
{
// button is active LOW
ret |= (nrf_gpio_pin_read(_button_pins[i]) ? 0 : (1 << i));
}
return ret;
} }
int board_uart_read(uint8_t* buf, int len) int board_uart_read(uint8_t* buf, int len)