mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
added tud_suspended() and tud_ready()
This commit is contained in:
parent
f3a954e7de
commit
eabfc53f38
@ -135,9 +135,16 @@ 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;
|
||||||
|
|
||||||
#if 1
|
|
||||||
uint32_t const btn = board_buttons();
|
uint32_t const btn = board_buttons();
|
||||||
|
|
||||||
|
if ( tud_suspended() && btn )
|
||||||
|
{
|
||||||
|
// Wake up host if we are in suspend mode
|
||||||
|
// and REMOTE_WAKEUP feature is enabled by host
|
||||||
|
tud_remote_wakeup();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/*------------- Keyboard -------------*/
|
/*------------- Keyboard -------------*/
|
||||||
if ( tud_hid_keyboard_ready() )
|
if ( tud_hid_keyboard_ready() )
|
||||||
{
|
{
|
||||||
@ -157,8 +164,9 @@ void usb_hid_task(void)
|
|||||||
tud_hid_keyboard_keycode(0, NULL);
|
tud_hid_keyboard_keycode(0, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
/*------------- Mouse -------------*/
|
/*------------- Mouse -------------*/
|
||||||
if ( tud_hid_mouse_ready() )
|
if ( tud_hid_mouse_ready() )
|
||||||
{
|
{
|
||||||
@ -211,7 +219,8 @@ void tud_umount_cb(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Invoked when usb bus is suspended
|
// Invoked when usb bus is suspended
|
||||||
// USB specs: device can only draw up to 2.5 mA from bus
|
// remote_wakeup_en : if host allow us to perform remote wakeup
|
||||||
|
// Within 7ms, device must draw an average of current less than 2.5 mA from bus
|
||||||
void tud_suspend_cb(bool remote_wakeup_en)
|
void tud_suspend_cb(bool remote_wakeup_en)
|
||||||
{
|
{
|
||||||
(void) remote_wakeup_en;
|
(void) remote_wakeup_en;
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
uint8_t _button_pins[] = { 11, 12, 24, 25 };
|
uint8_t _button_pins[] = { 11, 12, 24, 25 };
|
||||||
|
|
||||||
#define BOARD_BUTTON_COUNT sizeof(_button_pins)
|
#define BUTTON_COUNT sizeof(_button_pins)
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
@ -84,7 +84,7 @@ void board_init(void)
|
|||||||
board_led_control(false);
|
board_led_control(false);
|
||||||
|
|
||||||
// Button
|
// Button
|
||||||
for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++) nrf_gpio_cfg_input(_button_pins[i], NRF_GPIO_PIN_PULLUP);
|
for(uint8_t i=0; i<BUTTON_COUNT; i++) nrf_gpio_cfg_input(_button_pins[i], NRF_GPIO_PIN_PULLUP);
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_NONE
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
// 1ms tick timer
|
// 1ms tick timer
|
||||||
@ -138,10 +138,10 @@ uint32_t board_buttons(void)
|
|||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
|
|
||||||
for(uint8_t i=0; i<BOARD_BUTTON_COUNT; i++)
|
for(uint8_t i=0; i<BUTTON_COUNT; i++)
|
||||||
{
|
{
|
||||||
// button is active LOW
|
// button is active LOW
|
||||||
ret |= ( nrf_gpio_pin_read(_button_pins[i]) ? 0 : (1 << i));
|
ret |= (nrf_gpio_pin_read(_button_pins[i]) ? 0 : (1 << i));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -99,7 +99,7 @@ static void _prep_out_transaction (uint8_t itf)
|
|||||||
bool tud_cdc_n_connected(uint8_t itf)
|
bool tud_cdc_n_connected(uint8_t itf)
|
||||||
{
|
{
|
||||||
// DTR (bit 0) active is considered as connected
|
// DTR (bit 0) active is considered as connected
|
||||||
return tud_mounted() && TU_BIT_TEST(_cdcd_itf[itf].line_state, 0);
|
return tud_ready() && TU_BIT_TEST(_cdcd_itf[itf].line_state, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t tud_cdc_n_get_line_state (uint8_t itf)
|
uint8_t tud_cdc_n_get_line_state (uint8_t itf)
|
||||||
|
@ -182,6 +182,11 @@ bool tud_mounted(void)
|
|||||||
return _usbd_dev.configured;
|
return _usbd_dev.configured;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tud_suspended(void)
|
||||||
|
{
|
||||||
|
return _usbd_dev.suspended;
|
||||||
|
}
|
||||||
|
|
||||||
bool tud_remote_wakeup(void)
|
bool tud_remote_wakeup(void)
|
||||||
{
|
{
|
||||||
// only wake up host if this feature is supported and enabled and we are suspended
|
// only wake up host if this feature is supported and enabled and we are suspended
|
||||||
@ -627,6 +632,7 @@ void dcd_event_handler(dcd_event_t const * event, bool in_isr)
|
|||||||
case DCD_EVENT_UNPLUGGED:
|
case DCD_EVENT_UNPLUGGED:
|
||||||
_usbd_dev.connected = 0;
|
_usbd_dev.connected = 0;
|
||||||
_usbd_dev.configured = 0;
|
_usbd_dev.configured = 0;
|
||||||
|
_usbd_dev.suspended = 0;
|
||||||
osal_queue_send(_usbd_q, event, in_isr);
|
osal_queue_send(_usbd_q, event, in_isr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -66,6 +66,15 @@ void tud_task (void);
|
|||||||
// Check if device is connected and configured
|
// Check if device is connected and configured
|
||||||
bool tud_mounted(void);
|
bool tud_mounted(void);
|
||||||
|
|
||||||
|
// Check if device is suspended
|
||||||
|
bool tud_suspended(void);
|
||||||
|
|
||||||
|
// Check if device is ready to transfer
|
||||||
|
static inline bool tud_ready(void)
|
||||||
|
{
|
||||||
|
return tud_mounted() && !tud_suspended();
|
||||||
|
}
|
||||||
|
|
||||||
// Remote wake up host, only if suspended and enabled by host
|
// Remote wake up host, only if suspended and enabled by host
|
||||||
bool tud_remote_wakeup(void);
|
bool tud_remote_wakeup(void);
|
||||||
|
|
||||||
@ -79,7 +88,8 @@ ATTR_WEAK void tud_mount_cb(void);
|
|||||||
// Invoked when device is unmounted
|
// Invoked when device is unmounted
|
||||||
ATTR_WEAK void tud_umount_cb(void);
|
ATTR_WEAK void tud_umount_cb(void);
|
||||||
|
|
||||||
// Invoked when usb bus is suspended, max bus current draw is 2.5 mA
|
// Invoked when usb bus is suspended
|
||||||
|
// Within 7ms, device must draw an average of current less than 2.5 mA from bus
|
||||||
ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
|
ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en);
|
||||||
|
|
||||||
// Invoked when usb bus is resumed
|
// Invoked when usb bus is resumed
|
||||||
|
@ -219,6 +219,9 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num)
|
|||||||
void dcd_remote_wakeup(uint8_t rhport)
|
void dcd_remote_wakeup(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
|
||||||
|
NRF_USBD->DPDMVALUE = USBD_DPDMVALUE_STATE_Resume;
|
||||||
|
NRF_USBD->TASKS_DPDMDRIVE = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -389,6 +392,8 @@ void USBD_IRQHandler(void)
|
|||||||
if ( evt_cause & USBD_EVENTCAUSE_SUSPEND_Msk )
|
if ( evt_cause & USBD_EVENTCAUSE_SUSPEND_Msk )
|
||||||
{
|
{
|
||||||
dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);
|
dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( evt_cause & USBD_EVENTCAUSE_RESUME_Msk )
|
if ( evt_cause & USBD_EVENTCAUSE_RESUME_Msk )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user