From fd2ea2605e67673d4264b56649612b34fa93807d Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 16 Mar 2022 10:55:18 +0700 Subject: [PATCH] fix -Wnull-dereference warnings --- src/host/usbh.c | 86 +++++++++++++++++++++++++++---------------------- src/host/usbh.h | 4 +++ 2 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/host/usbh.c b/src/host/usbh.c index c7dfaddf6..418642891 100644 --- a/src/host/usbh.c +++ b/src/host/usbh.c @@ -251,7 +251,7 @@ struct TU_ATTR_ALWAYS_INLINE static inline usbh_device_t* get_device(uint8_t dev_addr) { - TU_ASSERT(dev_addr, NULL); + TU_VERIFY(dev_addr > 0 && dev_addr <= TOTAL_DEVICES, NULL); return &_usbh_devices[dev_addr-1]; } @@ -265,15 +265,15 @@ static bool usbh_control_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t //--------------------------------------------------------------------+ bool tuh_mounted(uint8_t dev_addr) { - return get_device(dev_addr)->configured; + usbh_device_t* dev = get_device(dev_addr); + TU_VERIFY(dev); + return dev->configured; } bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t* vid, uint16_t* pid) { - *vid = *pid = 0; - - TU_VERIFY(tuh_mounted(dev_addr)); usbh_device_t const* dev = get_device(dev_addr); + TU_VERIFY(dev && dev->configured); *vid = dev->vid; *pid = dev->pid; @@ -283,7 +283,8 @@ bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t* vid, uint16_t* pid) tusb_speed_t tuh_speed_get (uint8_t dev_addr) { - return (tusb_speed_t) (dev_addr ? get_device(dev_addr)->speed : _dev0.speed); + usbh_device_t* dev = get_device(dev_addr); + return (tusb_speed_t) (dev ? get_device(dev_addr)->speed : _dev0.speed); } #if CFG_TUSB_OS == OPT_OS_NONE @@ -358,11 +359,8 @@ bool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_i bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len, tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg) { - TU_VERIFY(tuh_mounted(daddr)); usbh_device_t const* dev = get_device(daddr); - if (dev->i_manufacturer == 0) { - return false; - } + TU_VERIFY(dev && dev->i_manufacturer); return tuh_descriptor_get_string(daddr, dev->i_manufacturer, language_id, buffer, len, complete_cb, user_arg); } @@ -370,11 +368,8 @@ bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, bool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len, tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg) { - TU_VERIFY(tuh_mounted(daddr)); usbh_device_t const* dev = get_device(daddr); - if (dev->i_product == 0) { - return false; - } + TU_VERIFY(dev && dev->i_product); return tuh_descriptor_get_string(daddr, dev->i_product, language_id, buffer, len, complete_cb, user_arg); } @@ -382,11 +377,8 @@ bool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void bool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len, tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg) { - TU_VERIFY(tuh_mounted(daddr)); usbh_device_t const* dev = get_device(daddr); - if (dev->i_serial == 0) { - return false; - } + TU_VERIFY(dev && dev->i_serial); return tuh_descriptor_get_string(daddr, dev->i_serial, language_id, buffer, len, complete_cb, user_arg); } @@ -629,6 +621,8 @@ void tuh_task(void) else { usbh_device_t* dev = get_device(event.dev_addr); + TU_ASSERT(dev, ); + dev->ep_status[epnum][ep_dir].busy = 0; dev->ep_status[epnum][ep_dir].claimed = 0; @@ -662,7 +656,8 @@ void tuh_task(void) uint8_t usbh_get_rhport(uint8_t dev_addr) { - return (dev_addr == 0) ? _dev0.rhport : get_device(dev_addr)->rhport; + usbh_device_t* dev = get_device(dev_addr); + return dev ? dev->rhport : _dev0.rhport; } uint8_t* usbh_get_enum_buf(void) @@ -688,10 +683,10 @@ void usbh_int_set(bool enabled) void hcd_devtree_get_info(uint8_t dev_addr, hcd_devtree_info_t* devtree_info) { - if (dev_addr) - { - usbh_device_t const* dev = get_device(dev_addr); + usbh_device_t const* dev = get_device(dev_addr); + if (dev) + { devtree_info->rhport = dev->rhport; devtree_info->hub_addr = dev->hub_addr; devtree_info->hub_port = dev->hub_port; @@ -768,10 +763,11 @@ void hcd_event_device_remove(uint8_t hostid, bool in_isr) // TODO has some duplication code with device, refactor later bool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr) { - // addr0 is always available - if (dev_addr == 0) return true; - usbh_device_t* dev = get_device(dev_addr); + + // addr0 only use tuh_control_xfer + TU_ASSERT(dev); + uint8_t const epnum = tu_edpt_number(ep_addr); uint8_t const dir = tu_edpt_dir(ep_addr); tu_edpt_state_t* ep_state = &dev->ep_status[epnum][dir]; @@ -804,11 +800,12 @@ bool usbh_edpt_release(uint8_t dev_addr, uint8_t ep_addr) // TODO has some duplication code with device, refactor later bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes) { + usbh_device_t* dev = get_device(dev_addr); + TU_VERIFY(dev); + uint8_t const epnum = tu_edpt_number(ep_addr); uint8_t const dir = tu_edpt_dir(ep_addr); - usbh_device_t* dev = get_device(dev_addr); - TU_LOG2(" Queue EP %02X with %u bytes ... ", ep_addr, total_bytes); // Attempt to transfer on a busy endpoint, sound like an race condition ! @@ -827,7 +824,7 @@ bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_ // HCD error, mark endpoint as ready to allow next transfer dev->ep_status[epnum][dir].busy = false; dev->ep_status[epnum][dir].claimed = 0; - TU_LOG2("failed\r\n"); + TU_LOG1("failed\r\n"); TU_BREAKPOINT(); return false; } @@ -852,9 +849,7 @@ static bool usbh_edpt_control_open(uint8_t dev_addr, uint8_t max_packet_size) bool usbh_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * desc_ep) { - usbh_device_t* dev = get_device(dev_addr); - TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t) dev->speed)); - + TU_ASSERT( tu_edpt_validate(desc_ep, tuh_speed_get(dev_addr)) ); return hcd_edpt_open(rhport, dev_addr, desc_ep); } @@ -864,6 +859,7 @@ bool usbh_edpt_busy(uint8_t dev_addr, uint8_t ep_addr) uint8_t const dir = tu_edpt_dir(ep_addr); usbh_device_t* dev = get_device(dev_addr); + TU_VERIFY(dev); return dev->ep_status[epnum][dir].busy; } @@ -1094,7 +1090,7 @@ enum { }; static bool enum_request_set_addr(void); -static bool parse_configuration_descriptor (uint8_t dev_addr, tusb_desc_configuration_t const* desc_cfg); +static bool parse_configuration_descriptor (uint8_t dev_addr, tusb_desc_configuration_t const* desc_cfg); static void enum_full_complete(void); // process device enumeration @@ -1194,9 +1190,10 @@ static bool process_enumeration(uint8_t dev_addr, tuh_control_xfer_t const * xfe case ENUM_GET_DEVICE_DESC: { - uint8_t const new_addr = (uint8_t const) xfer->request.wValue; + uint8_t const new_addr = (uint8_t) tu_le16toh(xfer->request.wValue); usbh_device_t* new_dev = get_device(new_addr); + TU_ASSERT(new_dev); new_dev->addressed = 1; // TODO close device 0, may not be needed @@ -1215,6 +1212,7 @@ static bool process_enumeration(uint8_t dev_addr, tuh_control_xfer_t const * xfe { tusb_desc_device_t const * desc_device = (tusb_desc_device_t const*) _usbh_ctrl_buf; usbh_device_t* dev = get_device(dev_addr); + TU_ASSERT(dev); dev->vid = desc_device->idVendor; dev->pid = desc_device->idProduct; @@ -1260,6 +1258,8 @@ static bool process_enumeration(uint8_t dev_addr, tuh_control_xfer_t const * xfe { TU_LOG2("Device configured\r\n"); usbh_device_t* dev = get_device(dev_addr); + TU_ASSERT(dev); + dev->configured = 1; // Start the Set Configuration process for interfaces (itf = DRVID_INVALID) @@ -1324,13 +1324,21 @@ static bool enum_new_device(hcd_event_t* event) static uint8_t get_new_address(bool is_hub) { - uint8_t const start = (is_hub ? CFG_TUH_DEVICE_MAX : 0) + 1; - uint8_t const count = (is_hub ? CFG_TUH_HUB : CFG_TUH_DEVICE_MAX); - - for (uint8_t i=0; i < count; i++) + uint8_t start; + uint8_t end; + if ( is_hub ) { - uint8_t const addr = start + i; - if (!get_device(addr)->connected) return addr; + start = CFG_TUH_DEVICE_MAX; + end = start + CFG_TUH_HUB; + }else + { + start = 0; + end = start + CFG_TUH_DEVICE_MAX; + } + + for ( uint8_t idx = start; idx < end; idx++) + { + if (!_usbh_devices[idx].connected) return (idx+1); } return ADDR_INVALID; } diff --git a/src/host/usbh.h b/src/host/usbh.h index 3bd40c50d..fc0590190 100644 --- a/src/host/usbh.h +++ b/src/host/usbh.h @@ -201,6 +201,10 @@ uint8_t tuh_descriptor_get_product_string_sync(uint8_t daddr, uint16_t language_ // return transfer result uint8_t tuh_descriptor_get_serial_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len, uint8_t timeout_ms); +//--------------------------------------------------------------------+ +// +//--------------------------------------------------------------------+ + #ifdef __cplusplus } #endif