Эх сурвалжийг харах

fix -Wnull-dereference warnings

hathach 4 жил өмнө
parent
commit
fd2ea2605e
2 өөрчлөгдсөн 50 нэмэгдсэн , 38 устгасан
  1. 46 38
      src/host/usbh.c
  2. 4 0
      src/host/usbh.h

+ 46 - 38
src/host/usbh.c

@@ -251,7 +251,7 @@ struct
 TU_ATTR_ALWAYS_INLINE
 TU_ATTR_ALWAYS_INLINE
 static inline usbh_device_t* get_device(uint8_t dev_addr)
 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];
   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)
 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)
 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);
   usbh_device_t const* dev = get_device(dev_addr);
+  TU_VERIFY(dev && dev->configured);
 
 
   *vid = dev->vid;
   *vid = dev->vid;
   *pid = dev->pid;
   *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)
 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
 #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,
 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)
                                             tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg)
 {
 {
-  TU_VERIFY(tuh_mounted(daddr));
   usbh_device_t const* dev = get_device(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);
   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,
 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)
                                        tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg)
 {
 {
-  TU_VERIFY(tuh_mounted(daddr));
   usbh_device_t const* dev = get_device(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);
   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,
 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)
                                       tuh_control_xfer_cb_t complete_cb, uintptr_t user_arg)
 {
 {
-  TU_VERIFY(tuh_mounted(daddr));
   usbh_device_t const* dev = get_device(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);
   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
         else
         {
         {
           usbh_device_t* dev = get_device(event.dev_addr);
           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].busy    = 0;
           dev->ep_status[epnum][ep_dir].claimed = 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)
 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)
 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)
 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->rhport   = dev->rhport;
     devtree_info->hub_addr = dev->hub_addr;
     devtree_info->hub_addr = dev->hub_addr;
     devtree_info->hub_port = dev->hub_port;
     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
 // TODO has some duplication code with device, refactor later
 bool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr)
 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);
   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 epnum       = tu_edpt_number(ep_addr);
   uint8_t const dir         = tu_edpt_dir(ep_addr);
   uint8_t const dir         = tu_edpt_dir(ep_addr);
   tu_edpt_state_t* ep_state = &dev->ep_status[epnum][dir];
   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
 // 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)
 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 epnum = tu_edpt_number(ep_addr);
   uint8_t const dir   = tu_edpt_dir(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);
   TU_LOG2("  Queue EP %02X with %u bytes ... ", ep_addr, total_bytes);
 
 
   // Attempt to transfer on a busy endpoint, sound like an race condition !
   // 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
     // HCD error, mark endpoint as ready to allow next transfer
     dev->ep_status[epnum][dir].busy = false;
     dev->ep_status[epnum][dir].busy = false;
     dev->ep_status[epnum][dir].claimed = 0;
     dev->ep_status[epnum][dir].claimed = 0;
-    TU_LOG2("failed\r\n");
+    TU_LOG1("failed\r\n");
     TU_BREAKPOINT();
     TU_BREAKPOINT();
     return false;
     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)
 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);
   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);
   uint8_t const dir   = tu_edpt_dir(ep_addr);
 
 
   usbh_device_t* dev = get_device(dev_addr);
   usbh_device_t* dev = get_device(dev_addr);
+  TU_VERIFY(dev);
 
 
   return dev->ep_status[epnum][dir].busy;
   return dev->ep_status[epnum][dir].busy;
 }
 }
@@ -1094,7 +1090,7 @@ enum {
 };
 };
 
 
 static bool enum_request_set_addr(void);
 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);
 static void enum_full_complete(void);
 
 
 // process device enumeration
 // 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:
     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);
       usbh_device_t* new_dev = get_device(new_addr);
+      TU_ASSERT(new_dev);
       new_dev->addressed = 1;
       new_dev->addressed = 1;
 
 
       // TODO close device 0, may not be needed
       // 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;
       tusb_desc_device_t const * desc_device = (tusb_desc_device_t const*) _usbh_ctrl_buf;
       usbh_device_t* dev = get_device(dev_addr);
       usbh_device_t* dev = get_device(dev_addr);
+      TU_ASSERT(dev);
 
 
       dev->vid            = desc_device->idVendor;
       dev->vid            = desc_device->idVendor;
       dev->pid            = desc_device->idProduct;
       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");
       TU_LOG2("Device configured\r\n");
       usbh_device_t* dev = get_device(dev_addr);
       usbh_device_t* dev = get_device(dev_addr);
+      TU_ASSERT(dev);
+
       dev->configured = 1;
       dev->configured = 1;
 
 
       // Start the Set Configuration process for interfaces (itf = DRVID_INVALID)
       // 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)
 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);
+  uint8_t start;
+  uint8_t end;
+  if ( is_hub )
+  {
+    start = CFG_TUH_DEVICE_MAX;
+    end   = start + CFG_TUH_HUB;
+  }else
+  {
+    start = 0;
+    end   = start + CFG_TUH_DEVICE_MAX;
+  }
 
 
-  for (uint8_t i=0; i < count; i++)
+  for ( uint8_t idx = start; idx < end; idx++)
   {
   {
-    uint8_t const addr = start + i;
-    if (!get_device(addr)->connected) return addr;
+    if (!_usbh_devices[idx].connected) return (idx+1);
   }
   }
   return ADDR_INVALID;
   return ADDR_INVALID;
 }
 }

+ 4 - 0
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
 // 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);
 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
 #ifdef __cplusplus
  }
  }
 #endif
 #endif