refractor hub
This commit is contained in:
		| @@ -67,8 +67,8 @@ | ||||
| #include "oem_base_board/pca9532.h" // LEDs | ||||
|  | ||||
|  | ||||
| #define CFG_PRINTF_TARGET       PRINTF_TARGET_SWO | ||||
| //#define CFG_PRINTF_TARGET       PRINTF_TARGET_UART // FIXME keil's cmsis rtx does not work with UART (work with SWO) | ||||
| //#define CFG_PRINTF_TARGET       PRINTF_TARGET_SWO | ||||
| #define CFG_PRINTF_TARGET       PRINTF_TARGET_UART // FIXME keil's cmsis rtx does not work with UART (work with SWO) | ||||
|  | ||||
| /*========================================================================= | ||||
|     HARDWARE MAC ADDRESS | ||||
|   | ||||
| @@ -762,8 +762,8 @@ | ||||
|       <Focus>0</Focus> | ||||
|       <ColumnNumber>0</ColumnNumber> | ||||
|       <tvExpOptDlg>0</tvExpOptDlg> | ||||
|       <TopLine>1</TopLine> | ||||
|       <CurrentLine>1</CurrentLine> | ||||
|       <TopLine>74</TopLine> | ||||
|       <CurrentLine>93</CurrentLine> | ||||
|       <bDave2>0</bDave2> | ||||
|       <PathWithFileName>..\..\..\tinyusb\host\hub.c</PathWithFileName> | ||||
|       <FilenameWithoutPath>hub.c</FilenameWithoutPath> | ||||
| @@ -778,8 +778,8 @@ | ||||
|       <Focus>0</Focus> | ||||
|       <ColumnNumber>0</ColumnNumber> | ||||
|       <tvExpOptDlg>0</tvExpOptDlg> | ||||
|       <TopLine>1</TopLine> | ||||
|       <CurrentLine>1</CurrentLine> | ||||
|       <TopLine>328</TopLine> | ||||
|       <CurrentLine>334</CurrentLine> | ||||
|       <bDave2>0</bDave2> | ||||
|       <PathWithFileName>..\..\..\tinyusb\host\usbh.c</PathWithFileName> | ||||
|       <FilenameWithoutPath>usbh.c</FilenameWithoutPath> | ||||
| @@ -1080,10 +1080,10 @@ | ||||
|       <FileType>2</FileType> | ||||
|       <tvExp>0</tvExp> | ||||
|       <Focus>0</Focus> | ||||
|       <ColumnNumber>18</ColumnNumber> | ||||
|       <ColumnNumber>5</ColumnNumber> | ||||
|       <tvExpOptDlg>0</tvExpOptDlg> | ||||
|       <TopLine>145</TopLine> | ||||
|       <CurrentLine>147</CurrentLine> | ||||
|       <CurrentLine>152</CurrentLine> | ||||
|       <bDave2>0</bDave2> | ||||
|       <PathWithFileName>..\..\bsp\lpc43xx\startup_keil\startup_LPC43xx.s</PathWithFileName> | ||||
|       <FilenameWithoutPath>startup_LPC43xx.s</FilenameWithoutPath> | ||||
|   | ||||
| @@ -64,6 +64,40 @@ uint8_t hub_enum_buffer[sizeof(descriptor_hub_desc_t)] TUSB_CFG_ATTR_USBRAM; | ||||
| //--------------------------------------------------------------------+ | ||||
| // HUB | ||||
| //--------------------------------------------------------------------+ | ||||
| tusb_error_t hub_port_clear_feature_subtask(uint8_t feature) | ||||
| { | ||||
|   tusb_error_t error; | ||||
|  | ||||
|   OSAL_SUBTASK_BEGIN | ||||
|  | ||||
|   SUBTASK_ASSERT(HUB_FEATURE_PORT_CONNECTION_CHANGE <= feature && | ||||
|                  feature <= HUB_FEATURE_PORT_RESET_CHANGE); | ||||
|  | ||||
|   //------------- Clear Port Feature request -------------// | ||||
|   OSAL_SUBTASK_INVOKED_AND_WAIT( | ||||
|       usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER), | ||||
|                                  HUB_REQUEST_CLEAR_FEATURE, feature, usbh_devices[0].hub_port, | ||||
|                                  0, NULL ), | ||||
|       error | ||||
|   ); | ||||
|   SUBTASK_ASSERT_STATUS( error ); | ||||
|  | ||||
|   //------------- Get Port Status to check if feature is cleared -------------// | ||||
|   OSAL_SUBTASK_INVOKED_AND_WAIT( | ||||
|       usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER), | ||||
|                                  HUB_REQUEST_GET_STATUS, 0, usbh_devices[0].hub_port, | ||||
|                                  4, hub_enum_buffer ), | ||||
|       error | ||||
|   ); | ||||
|   SUBTASK_ASSERT_STATUS( error ); | ||||
|  | ||||
|   //------------- Check if feature is cleared -------------// | ||||
|   hub_port_status_response_t * p_port_status = (hub_port_status_response_t *) hub_enum_buffer; | ||||
|   SUBTASK_ASSERT( !BIT_TEST_(p_port_status->status_change.value, feature-16)  ); | ||||
|  | ||||
|   OSAL_SUBTASK_END | ||||
| } | ||||
|  | ||||
| tusb_error_t hub_enumerate_subtask(void) | ||||
| { | ||||
|   tusb_error_t error; | ||||
| @@ -90,28 +124,10 @@ tusb_error_t hub_enumerate_subtask(void) | ||||
|     SUBTASK_EXIT(TUSB_ERROR_NONE); | ||||
|   } | ||||
|  | ||||
|   // Hub connection | ||||
|   //------------- Clear Hub Port Connect Status Change -------------// | ||||
|   OSAL_SUBTASK_INVOKED_AND_WAIT( | ||||
|       usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER), | ||||
|                                  HUB_REQUEST_CLEAR_FEATURE, HUB_FEATURE_PORT_CONNECTION_CHANGE, usbh_devices[0].hub_port, | ||||
|                                  0, NULL ), | ||||
|       error | ||||
|   ); | ||||
|   // Acknowledge Port Connection Change | ||||
|   OSAL_SUBTASK_INVOKED_AND_WAIT( hub_port_clear_feature_subtask(HUB_FEATURE_PORT_CONNECTION_CHANGE), error ); | ||||
|   SUBTASK_ASSERT_STATUS( error ); | ||||
|  | ||||
|   //------------- Get Port Status again to make sure Connect Change is cleared -------------// | ||||
|   OSAL_SUBTASK_INVOKED_AND_WAIT( | ||||
|       usbh_control_xfer_subtask( usbh_devices[0].hub_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_OTHER), | ||||
|                                  HUB_REQUEST_GET_STATUS, 0, usbh_devices[0].hub_port, | ||||
|                                  4, hub_enum_buffer ), | ||||
|       error | ||||
|   ); | ||||
|   SUBTASK_ASSERT_STATUS( error ); | ||||
|  | ||||
|   p_port_status = (hub_port_status_response_t *) hub_enum_buffer; | ||||
|   SUBTASK_ASSERT( !p_port_status->status_change.connect_status); // this has to be cleared | ||||
|  | ||||
|   //--------------------------------------------------------------------+ | ||||
|   // PORT RESET & WAIT FOR STATUS ENDPOINT & GET STATUS & CLEAR RESET CHANGE | ||||
|   //--------------------------------------------------------------------+ | ||||
|   | ||||
| @@ -144,32 +144,40 @@ enum{ | ||||
|  | ||||
| // data in response of HUB_REQUEST_GET_STATUS, wIndex = 0 (hub) | ||||
| typedef struct { | ||||
|   ATTR_PACKED_STRUCT(struct) { | ||||
|     uint16_t local_power_source : 1; | ||||
|     uint16_t over_current       : 1; | ||||
|     uint16_t : 14; | ||||
|   }status, status_change; | ||||
|   union{ | ||||
|     ATTR_PACKED_STRUCT(struct) { | ||||
|       uint16_t local_power_source : 1; | ||||
|       uint16_t over_current       : 1; | ||||
|       uint16_t : 14; | ||||
|     }; | ||||
|  | ||||
|     uint16_t value; | ||||
|   } status, status_change; | ||||
| } hub_status_response_t; | ||||
|  | ||||
| STATIC_ASSERT( sizeof(hub_status_response_t) == 4, "size is not correct"); | ||||
|  | ||||
| // data in response of HUB_REQUEST_GET_STATUS, wIndex = Port num | ||||
| typedef struct { | ||||
|   ATTR_PACKED_STRUCT(struct) { | ||||
|     uint16_t connect_status             : 1; | ||||
|     uint16_t port_enable                : 1; | ||||
|     uint16_t suspend                    : 1; | ||||
|     uint16_t over_current               : 1; | ||||
|     uint16_t reset                      : 1; | ||||
|   union { | ||||
|     ATTR_PACKED_STRUCT(struct) { | ||||
|       uint16_t connect_status             : 1; | ||||
|       uint16_t port_enable                : 1; | ||||
|       uint16_t suspend                    : 1; | ||||
|       uint16_t over_current               : 1; | ||||
|       uint16_t reset                      : 1; | ||||
|  | ||||
|     uint16_t                            : 3; | ||||
|     uint16_t port_power                 : 1; | ||||
|     uint16_t low_speed_device_attached  : 1; | ||||
|     uint16_t high_speed_device_attached : 1; | ||||
|     uint16_t port_test_mode             : 1; | ||||
|     uint16_t port_indicator_control     : 1; | ||||
|     uint16_t : 0; | ||||
|   }status_current, status_change; | ||||
|       uint16_t                            : 3; | ||||
|       uint16_t port_power                 : 1; | ||||
|       uint16_t low_speed_device_attached  : 1; | ||||
|       uint16_t high_speed_device_attached : 1; | ||||
|       uint16_t port_test_mode             : 1; | ||||
|       uint16_t port_indicator_control     : 1; | ||||
|       uint16_t : 0; | ||||
|     }; | ||||
|  | ||||
|     uint16_t value; | ||||
|   } status_current, status_change; | ||||
| } hub_port_status_response_t; | ||||
|  | ||||
| STATIC_ASSERT( sizeof(hub_port_status_response_t) == 4, "size is not correct"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach