add hcd_configure() to change max NAK dynamically

This commit is contained in:
hathach 2024-04-02 16:38:40 +07:00
parent e802fe0677
commit 7d3d60f96d
No known key found for this signature in database
GPG Key ID: 26FAB84F615C3C52
5 changed files with 32 additions and 15 deletions

View File

@ -125,7 +125,7 @@ bool hcd_dcache_clean_invalidate(void const* addr, uint32_t data_size) TU_ATTR_W
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// optional hcd configuration, called by tuh_configure() // optional hcd configuration, called by tuh_configure()
bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) TU_ATTR_WEAK; bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);
// Initialize controller to host mode // Initialize controller to host mode
bool hcd_init(uint8_t rhport); bool hcd_init(uint8_t rhport);

View File

@ -52,6 +52,13 @@ TU_ATTR_WEAK bool hcd_deinit(uint8_t rhport) {
return false; return false;
} }
TU_ATTR_WEAK bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {
(void) rhport;
(void) cfg_id;
(void) cfg_param;
return false;
}
TU_ATTR_WEAK void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr) { TU_ATTR_WEAK void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr) {
(void) rhport; (void) rhport;
(void) eventid; (void) eventid;
@ -332,11 +339,7 @@ bool tuh_rhport_reset_bus(uint8_t rhport, bool active) {
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
bool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param) { bool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param) {
if ( hcd_configure ) { return hcd_configure(rhport, cfg_id, cfg_param);
return hcd_configure(rhport, cfg_id, cfg_param);
} else {
return false;
}
} }
static void clear_device(usbh_device_t* dev) { static void clear_device(usbh_device_t* dev) {

View File

@ -73,11 +73,21 @@ typedef struct {
tusb_desc_interface_t desc; tusb_desc_interface_t desc;
} tuh_itf_info_t; } tuh_itf_info_t;
// ConfigID for tuh_config() // ConfigID for tuh_configure()
enum { enum {
TUH_CFGID_RPI_PIO_USB_CONFIGURATION = OPT_MCU_RP2040 << 8 // cfg_param: pio_usb_configuration_t TUH_CFGID_INVALID = 0,
TUH_CFGID_RPI_PIO_USB_CONFIGURATION = 100, // cfg_param: pio_usb_configuration_t
TUH_CFGID_MAX3421 = 200,
}; };
typedef union {
// For TUH_CFGID_RPI_PIO_USB_CONFIGURATION use pio_usb_configuration_t
struct {
uint8_t max_nak;
} max3421;
} tuh_configure_param_t;
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// APPLICATION CALLBACK // APPLICATION CALLBACK
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -30,6 +30,7 @@
#include <stdatomic.h> #include <stdatomic.h>
#include "host/hcd.h" #include "host/hcd.h"
#include "host/usbh.h"
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// //
@ -230,7 +231,9 @@ typedef struct {
} max3421_data_t; } max3421_data_t;
static max3421_data_t _hcd_data; static max3421_data_t _hcd_data;
static uint8_t _max_nak = MAX_NAK_DEFAULT; // max NAK before giving up in a usb frame
// max NAK before giving up in a frame. 0 means infinite NAKs
static uint8_t _max_nak = MAX_NAK_DEFAULT;
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// API: SPI transfer with MAX3421E // API: SPI transfer with MAX3421E
@ -409,10 +412,11 @@ static void free_ep(uint8_t daddr) {
} }
} }
// Check if endpoint has an queued transfer // Check if endpoint has an queued transfer and not reach max NAK
TU_ATTR_ALWAYS_INLINE static inline bool is_ep_pending(max3421_ep_t const * ep) { TU_ATTR_ALWAYS_INLINE static inline bool is_ep_pending(max3421_ep_t const * ep) {
uint8_t const state = ep->state; uint8_t const state = ep->state;
return ep->packet_size && state >= EP_STATE_ATTEMPT_1 && state < EP_STATE_ATTEMPT_1 + _max_nak; return ep->packet_size && (state >= EP_STATE_ATTEMPT_1) &&
(_max_nak == 0 || state < EP_STATE_ATTEMPT_1 + _max_nak);
} }
// Find the next pending endpoint using round-robin scheduling, starting from next endpoint. // Find the next pending endpoint using round-robin scheduling, starting from next endpoint.
@ -447,10 +451,11 @@ static max3421_ep_t * find_next_pending_ep(max3421_ep_t * cur_ep) {
// optional hcd configuration, called by tuh_configure() // optional hcd configuration, called by tuh_configure()
bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) { bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {
(void) rhport; (void) rhport;
(void) cfg_id; TU_VERIFY(cfg_id == TUH_CFGID_MAX3421);
(void) cfg_param;
return false; tuh_configure_param_t const* cfg = (tuh_configure_param_t const*) cfg_param;
_max_nak = cfg->max3421.max_nak;
return true;
} }
// Initialize controller to host mode // Initialize controller to host mode

View File

@ -144,7 +144,6 @@
#define OPT_MCU_RX72N 1402 ///< Renesas RX72N #define OPT_MCU_RX72N 1402 ///< Renesas RX72N
#define OPT_MCU_RAXXX 1403 ///< Renesas RAxxx families #define OPT_MCU_RAXXX 1403 ///< Renesas RAxxx families
// Mind Motion // Mind Motion
#define OPT_MCU_MM32F327X 1500 ///< Mind Motion MM32F327 #define OPT_MCU_MM32F327X 1500 ///< Mind Motion MM32F327