Changes in / [22ceff3a:25696fea] in mainline
- Location:
- uspace
- Files:
-
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/mkbd/main.c
r22ceff3a r25696fea 69 69 int rc = usb_hid_report_init(*report); 70 70 if (rc != EOK) { 71 usb_hid_ report_deinit(*report);71 usb_hid_free_report(*report); 72 72 *report = NULL; 73 73 return rc; … … 79 79 &report_desc_size); 80 80 if (rc != EOK) { 81 usb_hid_ report_deinit(*report);81 usb_hid_free_report(*report); 82 82 *report = NULL; 83 83 return rc; … … 85 85 86 86 if (report_desc_size == 0) { 87 usb_hid_ report_deinit(*report);87 usb_hid_free_report(*report); 88 88 *report = NULL; 89 89 // TODO: other error code? … … 93 93 uint8_t *desc = (uint8_t *) malloc(report_desc_size); 94 94 if (desc == NULL) { 95 usb_hid_ report_deinit(*report);95 usb_hid_free_report(*report); 96 96 *report = NULL; 97 97 return ENOMEM; … … 103 103 &actual_size); 104 104 if (rc != EOK) { 105 usb_hid_ report_deinit(*report);105 usb_hid_free_report(*report); 106 106 *report = NULL; 107 107 free(desc); … … 110 110 111 111 if (actual_size != report_desc_size) { 112 usb_hid_ report_deinit(*report);112 usb_hid_free_report(*report); 113 113 *report = NULL; 114 114 free(desc); -
uspace/app/usbinfo/hid.c
r22ceff3a r25696fea 167 167 168 168 free(raw_report); 169 usb_hid_ report_deinit(&report);169 usb_hid_free_report(&report); 170 170 } 171 171 -
uspace/drv/bus/usb/ohci/endpoint_list.c
r22ceff3a r25696fea 60 60 name, instance->list_head, instance->list_head_pa); 61 61 62 ed_init(instance->list_head, NULL , NULL);62 ed_init(instance->list_head, NULL); 63 63 list_initialize(&instance->endpoint_list); 64 64 fibril_mutex_initialize(&instance->guard); -
uspace/drv/bus/usb/ohci/hc.c
r22ceff3a r25696fea 565 565 566 566 /*Init HCCA */ 567 instance->hcca = hcca_get();567 instance->hcca = malloc32(sizeof(hcca_t)); 568 568 if (instance->hcca == NULL) 569 569 return ENOMEM; -
uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c
r22ceff3a r25696fea 34 34 #include "endpoint_descriptor.h" 35 35 36 /** USB direction to OHCI values translation table. */ 37 static const uint32_t dir[] = { 38 [USB_DIRECTION_IN] = ED_STATUS_D_IN, 39 [USB_DIRECTION_OUT] = ED_STATUS_D_OUT, 40 [USB_DIRECTION_BOTH] = ED_STATUS_D_TD, 41 }; 36 static unsigned direc[3] = 37 { ED_STATUS_D_IN, ED_STATUS_D_OUT, ED_STATUS_D_TRANSFER }; 42 38 43 /** 44 * Initialize ED. 45 * 46 * @param instance ED structure to initialize. 47 * @param ep Driver endpoint to use. 48 * @param td TD to put in the list. 49 * 50 * If @param ep is NULL, dummy ED is initalized with only skip flag set. 51 */ 52 void ed_init(ed_t *instance, const endpoint_t *ep, const td_t *td) 39 void ed_init(ed_t *instance, endpoint_t *ep) 53 40 { 54 41 assert(instance); 55 42 bzero(instance, sizeof(ed_t)); 56 57 43 if (ep == NULL) { 58 /* Mark as dead, used for dummy EDs at the beginning of59 * endpoint lists. */60 44 instance->status = ED_STATUS_K_FLAG; 61 45 return; 62 46 } 63 /* Non-dummy ED must have TD assigned */ 64 assert(td); 65 66 /* Status: address, endpoint nr, direction mask and max packet size. */ 47 assert(ep); 67 48 instance->status = 0 68 49 | ((ep->address & ED_STATUS_FA_MASK) << ED_STATUS_FA_SHIFT) 69 50 | ((ep->endpoint & ED_STATUS_EN_MASK) << ED_STATUS_EN_SHIFT) 70 | ((dir [ep->direction] & ED_STATUS_D_MASK) << ED_STATUS_D_SHIFT)51 | ((direc[ep->direction] & ED_STATUS_D_MASK) << ED_STATUS_D_SHIFT) 71 52 | ((ep->max_packet_size & ED_STATUS_MPS_MASK) 72 53 << ED_STATUS_MPS_SHIFT); 73 54 74 /* Low speed flag */ 55 75 56 if (ep->speed == USB_SPEED_LOW) 76 57 instance->status |= ED_STATUS_S_FLAG; 77 78 /* Isochronous format flag */79 58 if (ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) 80 59 instance->status |= ED_STATUS_F_FLAG; 81 60 82 /* Set TD to the list */83 const uintptr_t pa = addr_to_phys(td);84 instance->td_head = pa & ED_TDHEAD_PTR_MASK;85 instance->td_tail = pa & ED_TDTAIL_PTR_MASK;86 87 /* Set toggle bit */88 61 if (ep->toggle) 89 62 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY; 90 91 63 } 92 64 /** -
uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.h
r22ceff3a r25696fea 45 45 #include "completion_codes.h" 46 46 47 /**48 * OHCI Endpoint Descriptor representation.49 *50 * See OHCI spec. Chapter 4.2, page 16 (pdf page 30) for details */51 47 typedef struct ed { 52 /**53 * Status field.54 *55 * See table 4-1, p. 17 OHCI spec (pdf page 31).56 */57 48 volatile uint32_t status; 58 49 #define ED_STATUS_FA_MASK (0x7f) /* USB device address */ … … 60 51 #define ED_STATUS_EN_MASK (0xf) /* USB endpoint address */ 61 52 #define ED_STATUS_EN_SHIFT (7) 62 #define ED_STATUS_D_MASK (0x3) /* Direction */53 #define ED_STATUS_D_MASK (0x3) /* direction */ 63 54 #define ED_STATUS_D_SHIFT (11) 64 55 #define ED_STATUS_D_OUT (0x1) 65 56 #define ED_STATUS_D_IN (0x2) 66 #define ED_STATUS_D_T D (0x3) /* Direction is specified by TD */57 #define ED_STATUS_D_TRANSFER (0x3) 67 58 68 #define ED_STATUS_S_FLAG (1 << 13) /* Speed flag: 1 = low */69 #define ED_STATUS_K_FLAG (1 << 14) /* Skip flag (no not execute this ED) */70 #define ED_STATUS_F_FLAG (1 << 15) /* Format: 1 = isochronous*/71 #define ED_STATUS_MPS_MASK (0x3ff) /* Maximum packet size*/59 #define ED_STATUS_S_FLAG (1 << 13) /* speed flag: 1 = low */ 60 #define ED_STATUS_K_FLAG (1 << 14) /* skip flag (no not execute this ED) */ 61 #define ED_STATUS_F_FLAG (1 << 15) /* format: 1 = isochronous*/ 62 #define ED_STATUS_MPS_MASK (0x3ff) /* max_packet_size*/ 72 63 #define ED_STATUS_MPS_SHIFT (16) 73 64 74 /**75 * Pointer to the last TD.76 *77 * OHCI hw never changes this field and uses it only for a reference.78 */79 65 volatile uint32_t td_tail; 80 66 #define ED_TDTAIL_PTR_MASK (0xfffffff0) 81 67 #define ED_TDTAIL_PTR_SHIFT (0) 82 68 83 /**84 * Pointer to the first TD.85 *86 * Driver should not change this field if the ED is active.87 * This field is updated by OHCI hw and points to the next TD88 * to be executed.89 */90 69 volatile uint32_t td_head; 91 70 #define ED_TDHEAD_PTR_MASK (0xfffffff0) … … 96 75 #define ED_TDHEAD_HALTED_FLAG (0x1) 97 76 98 /**99 * Pointer to the next ED.100 *101 * Driver should not change this field on active EDs.102 */103 77 volatile uint32_t next; 104 78 #define ED_NEXT_PTR_MASK (0xfffffff0) … … 106 80 } __attribute__((packed)) ed_t; 107 81 108 void ed_init(ed_t *instance, const endpoint_t *ep, const td_t *td);82 void ed_init(ed_t *instance, endpoint_t *ep); 109 83 110 /** 111 * Check for SKIP or HALTED flag being set. 112 * @param instance ED 113 * @return true if either SKIP or HALTED flag is set, false otherwise. 114 */ 115 static inline bool ed_inactive(const ed_t *instance) 84 static inline void ed_set_td(ed_t *instance, td_t *td) 116 85 { 117 86 assert(instance); 118 return (instance->td_head & ED_TDHEAD_HALTED_FLAG) 119 || (instance->status & ED_STATUS_K_FLAG); 120 } 121 122 /** 123 * Check whether this ED contains TD to be executed. 124 * @param instance ED 125 * @return true if there are pending TDs, false otherwise. 126 */ 127 static inline bool ed_transfer_pending(const ed_t *instance) 128 { 129 assert(instance); 130 return (instance->td_head & ED_TDHEAD_PTR_MASK) 131 != (instance->td_tail & ED_TDTAIL_PTR_MASK); 132 } 133 134 /** 135 * Set the last element of TD list 136 * @param instance ED 137 * @param instance TD to set as the last item. 138 */ 139 static inline void ed_set_tail_td(ed_t *instance, const td_t *td) 140 { 141 assert(instance); 142 const uintptr_t pa = addr_to_phys(td); 87 uintptr_t pa = addr_to_phys(td); 88 instance->td_head = 89 ((pa & ED_TDHEAD_PTR_MASK) 90 | (instance->td_head & ~ED_TDHEAD_PTR_MASK)); 143 91 instance->td_tail = pa & ED_TDTAIL_PTR_MASK; 144 92 } 145 93 146 /** 147 * Set next ED in ED chain. 148 * @param instance ED to modify 149 * @param next ED to append 150 */ 151 static inline void ed_append_ed(ed_t *instance, const ed_t *next) 94 static inline void ed_set_end_td(ed_t *instance, td_t *td) 95 { 96 assert(instance); 97 uintptr_t pa = addr_to_phys(td); 98 instance->td_tail = pa & ED_TDTAIL_PTR_MASK; 99 } 100 101 static inline void ed_append_ed(ed_t *instance, ed_t *next) 152 102 { 153 103 assert(instance); 154 104 assert(next); 155 constuint32_t pa = addr_to_phys(next);105 uint32_t pa = addr_to_phys(next); 156 106 assert((pa & ED_NEXT_PTR_MASK) << ED_NEXT_PTR_SHIFT == pa); 157 107 instance->next = pa; 158 108 } 159 109 160 /** 161 * Get toggle bit value stored in this ED 162 * @param instance ED 163 * @return Toggle bit value 164 */ 165 static inline int ed_toggle_get(const ed_t *instance) 110 static inline int ed_toggle_get(ed_t *instance) 166 111 { 167 112 assert(instance); … … 169 114 } 170 115 171 /** 172 * Set toggle bit value stored in this ED 173 * @param instance ED 174 * @param toggle Toggle bit value 175 */ 176 static inline void ed_toggle_set(ed_t *instance, bool toggle) 116 static inline void ed_toggle_set(ed_t *instance, int toggle) 177 117 { 178 118 assert(instance); 179 if (toggle) { 119 assert(toggle == 0 || toggle == 1); 120 if (toggle == 1) { 180 121 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY; 181 122 } else { 182 /* Clear halted flag when reseting toggle TODO: Why?*/123 /* clear halted flag when reseting toggle */ 183 124 instance->td_head &= ~ED_TDHEAD_TOGGLE_CARRY; 184 125 instance->td_head &= ~ED_TDHEAD_HALTED_FLAG; -
uspace/drv/bus/usb/ohci/hw_struct/hcca.h
r22ceff3a r25696fea 36 36 37 37 #include <stdint.h> 38 #include <malloc.h>39 38 40 39 /** Host controller communication area. … … 49 48 } __attribute__((packed, aligned)) hcca_t; 50 49 51 static inline void * hcca_get(void)52 {53 assert(sizeof(hcca_t) == 256);54 return memalign(256, sizeof(hcca_t));55 }56 50 #endif 57 51 /** -
uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.c
r22ceff3a r25696fea 35 35 #include "transfer_descriptor.h" 36 36 37 /** USB direction to OHCI TD values translation table */ 38 static const uint32_t dir[] = { 39 [USB_DIRECTION_IN] = TD_STATUS_DP_IN, 40 [USB_DIRECTION_OUT] = TD_STATUS_DP_OUT, 41 [USB_DIRECTION_BOTH] = TD_STATUS_DP_SETUP, 42 }; 37 static unsigned dp[3] = 38 { TD_STATUS_DP_IN, TD_STATUS_DP_OUT, TD_STATUS_DP_SETUP }; 39 static unsigned togg[2] = { TD_STATUS_T_0, TD_STATUS_T_1 }; 43 40 44 /** 45 * Initialize OHCI TD. 46 * @param instance TD structure to initialize. 47 * @param next Next TD in ED list. 48 * @param direction Used to determine PID, BOTH means setup PID. 49 * @param buffer Pointer to the first byte of transferred data. 50 * @param size Size of the buffer. 51 * @param toggle Toggle bit value, use 0/1 to set explicitly, 52 * any other value means that ED toggle will be used. 53 */ 54 void td_init(td_t *instance, const td_t *next, 55 usb_direction_t direction, const void *buffer, size_t size, int toggle) 41 void td_init(td_t *instance, 42 usb_direction_t dir, const void *buffer, size_t size, int toggle) 56 43 { 57 44 assert(instance); 58 45 bzero(instance, sizeof(td_t)); 59 /* Set PID and Error code */60 46 instance->status = 0 61 | ((d ir[direction] & TD_STATUS_DP_MASK) << TD_STATUS_DP_SHIFT)47 | ((dp[dir] & TD_STATUS_DP_MASK) << TD_STATUS_DP_SHIFT) 62 48 | ((CC_NOACCESS2 & TD_STATUS_CC_MASK) << TD_STATUS_CC_SHIFT); 63 64 49 if (toggle == 0 || toggle == 1) { 65 /* Set explicit toggle bit */ 66 instance->status |= TD_STATUS_T_USE_TD_FLAG; 67 instance->status |= toggle ? TD_STATUS_T_FLAG : 0; 50 instance->status |= togg[toggle] << TD_STATUS_T_SHIFT; 68 51 } 69 70 /* Alow less data on input. */71 52 if (dir == USB_DIRECTION_IN) { 72 53 instance->status |= TD_STATUS_ROUND_FLAG; 73 54 } 74 75 55 if (buffer != NULL) { 76 56 assert(size != 0); … … 78 58 instance->be = addr_to_phys(buffer + size - 1); 79 59 } 80 81 instance->next = addr_to_phys(next) & TD_NEXT_PTR_MASK;82 83 60 } 84 61 /** -
uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.h
r22ceff3a r25696fea 37 37 #include <bool.h> 38 38 #include <stdint.h> 39 #include "../utils/malloc32.h" 39 40 40 #include "../utils/malloc32.h"41 41 #include "completion_codes.h" 42 42 … … 46 46 #define OHCI_TD_MAX_TRANSFER (4 * 1024) 47 47 48 /**49 * Transfer Descriptor representation.50 *51 * See OHCI spec chapter 4.3.1 General Transfer Descriptor on page 1952 * (pdf page 33) for details.53 */54 48 typedef struct td { 55 /** Status field. Do not touch on active TDs. */56 49 volatile uint32_t status; 57 50 #define TD_STATUS_ROUND_FLAG (1 << 18) 58 #define TD_STATUS_DP_MASK (0x3) /* Direction/PID */51 #define TD_STATUS_DP_MASK (0x3) /* direction/PID */ 59 52 #define TD_STATUS_DP_SHIFT (19) 60 53 #define TD_STATUS_DP_SETUP (0x0) 61 54 #define TD_STATUS_DP_OUT (0x1) 62 55 #define TD_STATUS_DP_IN (0x2) 63 #define TD_STATUS_DI_MASK (0x7) /* Delay interrupt, wait n frames before irq*/56 #define TD_STATUS_DI_MASK (0x7) /* delay interrupt, wait DI frames before int */ 64 57 #define TD_STATUS_DI_SHIFT (21) 65 58 #define TD_STATUS_DI_NO_INTERRUPT (0x7) 66 #define TD_STATUS_T_FLAG (1 << 24) /* Explicit toggle bit value for this TD */ 67 #define TD_STATUS_T_USE_TD_FLAG (1 << 25) /* 1 = use bit 24 as toggle bit */ 68 #define TD_STATUS_EC_MASK (0x3) /* Error count */ 59 #define TD_STATUS_T_MASK (0x3) /* data toggle 1x = use ED toggle carry */ 60 #define TD_STATUS_T_SHIFT (24) 61 #define TD_STATUS_T_0 (0x2) 62 #define TD_STATUS_T_1 (0x3) 63 #define TD_STATUS_T_ED (0) 64 #define TD_STATUS_EC_MASK (0x3) /* error count */ 69 65 #define TD_STATUS_EC_SHIFT (26) 70 #define TD_STATUS_CC_MASK (0xf) /* Condition code */66 #define TD_STATUS_CC_MASK (0xf) /* condition code */ 71 67 #define TD_STATUS_CC_SHIFT (28) 72 68 73 /** 74 * Current buffer pointer. 75 * Phys address of the first byte to be transferred. */ 76 volatile uint32_t cbp; 77 78 /** Pointer to the next TD in chain. 16-byte aligned. */ 69 volatile uint32_t cbp; /* current buffer ptr, data to be transfered */ 79 70 volatile uint32_t next; 80 71 #define TD_NEXT_PTR_MASK (0xfffffff0) 81 72 #define TD_NEXT_PTR_SHIFT (0) 82 73 83 /** 84 * Buffer end. 85 * Phys address of the last byte of the transfer. 86 * @note this does not have to be on the same page as cbp. 87 */ 88 volatile uint32_t be; 74 volatile uint32_t be; /* buffer end, address of the last byte */ 89 75 } __attribute__((packed)) td_t; 90 76 91 void td_init(td_t *instance, const td_t *next,77 void td_init(td_t *instance, 92 78 usb_direction_t dir, const void *buffer, size_t size, int toggle); 93 79 94 /** 95 * Check TD for completion. 96 * @param instance TD structure. 97 * @return true if the TD was accessed and processed by hw, false otherwise. 98 */ 99 inline static bool td_is_finished(const td_t *instance) 80 inline static void td_set_next(td_t *instance, td_t *next) 100 81 { 101 82 assert(instance); 102 const int cc = 103 (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 104 /* This value is changed on transfer completion, 105 * either to CC_NOERROR or and error code. 106 * See OHCI spec 4.3.1.3.5 p. 23 (pdf 37) */ 83 instance->next = addr_to_phys(next) & TD_NEXT_PTR_MASK; 84 } 85 86 inline static bool td_is_finished(td_t *instance) 87 { 88 assert(instance); 89 int cc = (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 90 /* something went wrong, error code is set */ 107 91 if (cc != CC_NOACCESS1 && cc != CC_NOACCESS2) { 92 return true; 93 } 94 /* everything done */ 95 if (cc == CC_NOERROR && instance->cbp == 0) { 108 96 return true; 109 97 } … … 111 99 } 112 100 113 /** 114 * Get error code that indicates transfer status. 115 * @param instance TD structure. 116 * @return Error code. 117 */ 118 static inline int td_error(const td_t *instance) 101 static inline int td_error(td_t *instance) 119 102 { 120 103 assert(instance); 121 const int cc = 122 (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 104 int cc = (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 123 105 return cc_to_rc(cc); 124 106 } 125 107 126 /**127 * Get remaining portion of buffer to be read/written128 * @param instance TD structure129 * @return size of remaining buffer.130 */131 108 static inline size_t td_remain_size(td_t *instance) 132 109 { 133 110 assert(instance); 134 /* Current buffer pointer is cleared on successful transfer */135 111 if (instance->cbp == 0) 136 112 return 0; 137 /* Buffer end points to the last byte of transfer buffer, so add 1 */138 113 return instance->be - instance->cbp + 1; 139 114 } -
uspace/drv/bus/usb/ohci/ohci_batch.c
r22ceff3a r25696fea 163 163 ohci_batch->ed->td_tail, ohci_batch->ed->next); 164 164 165 if (!ed_inactive(ohci_batch->ed) && ed_transfer_pending(ohci_batch->ed)) 166 return false; 167 168 /* Now we may be sure that either the ED is inactive because of errors 169 * or all transfer descriptors completed successfully */ 170 171 /* Assume all data got through */ 172 ohci_batch->usb_batch->transfered_size = 173 ohci_batch->usb_batch->buffer_size; 174 175 /* Assume we will leave the last(unused) TD behind */ 176 ohci_batch->leave_td = ohci_batch->td_count; 177 178 /* Check all TDs */ 179 for (size_t i = 0; i < ohci_batch->td_count; ++i) { 165 size_t i = 0; 166 for (; i < ohci_batch->td_count; ++i) { 180 167 assert(ohci_batch->tds[i] != NULL); 181 168 usb_log_debug("TD %zu: %08x:%08x:%08x:%08x.\n", i, 182 169 ohci_batch->tds[i]->status, ohci_batch->tds[i]->cbp, 183 170 ohci_batch->tds[i]->next, ohci_batch->tds[i]->be); 184 185 /* If the TD got all its data through, it will report 0 bytes 186 * remain, the sole exception is INPUT with data rounding flag 187 * (short), i.e. every INPUT. Nice thing is that short packets 188 * will correctly report remaining data, thus making 189 * this computation correct (short packets need to be produced 190 * by the last TD) 191 * NOTE: This also works for CONTROL transfer as 192 * the first TD will return 0 remain. 193 * NOTE: Short packets don't break the assumption that 194 * we leave the very last(unused) TD behind. 195 */ 196 ohci_batch->usb_batch->transfered_size 197 -= td_remain_size(ohci_batch->tds[i]); 198 171 if (!td_is_finished(ohci_batch->tds[i])) { 172 return false; 173 } 199 174 ohci_batch->usb_batch->error = td_error(ohci_batch->tds[i]); 200 175 if (ohci_batch->usb_batch->error != EOK) { … … 202 177 ohci_batch->usb_batch, i, 203 178 ohci_batch->tds[i]->status); 204 205 /* ED should be stopped because of errors */ 206 assert((ohci_batch->ed->td_head & ED_TDHEAD_HALTED_FLAG) != 0); 207 208 /* Now we have a problem: we don't know what TD 209 * the head pointer points to, the retiring rules 210 * described in specs say it should be the one after 211 * the failed one so set the tail pointer accordingly. 212 * It will be the one TD we leave behind. 213 */ 214 ohci_batch->leave_td = i + 1; 215 216 /* Check TD assumption */ 217 const uint32_t pa = addr_to_phys( 218 ohci_batch->tds[ohci_batch->leave_td]); 219 assert((ohci_batch->ed->td_head & ED_TDTAIL_PTR_MASK) 220 == pa); 221 222 ed_set_tail_td(ohci_batch->ed, 223 ohci_batch->tds[ohci_batch->leave_td]); 224 225 /* Clear possible ED HALT */ 226 ohci_batch->ed->td_head &= ~ED_TDHEAD_HALTED_FLAG; 179 /* Make sure TD queue is empty (one TD), 180 * ED should be marked as halted */ 181 ohci_batch->ed->td_tail = 182 (ohci_batch->ed->td_head & ED_TDTAIL_PTR_MASK); 183 ++i; 227 184 break; 228 185 } 229 186 } 230 assert(ohci_batch->usb_batch->transfered_size <= 231 ohci_batch->usb_batch->buffer_size);232 233 /* Store the remaining TD */ 187 188 assert(i <= ohci_batch->td_count); 189 ohci_batch->leave_td = i; 190 234 191 ohci_endpoint_t *ohci_ep = ohci_endpoint_get(ohci_batch->usb_batch->ep); 235 192 assert(ohci_ep); 236 193 ohci_ep->td = ohci_batch->tds[ohci_batch->leave_td]; 237 238 /* Make sure that we are leaving the right TD behind */ 194 assert(i > 0); 195 ohci_batch->usb_batch->transfered_size = 196 ohci_batch->usb_batch->buffer_size; 197 for (--i;i < ohci_batch->td_count; ++i) { 198 ohci_batch->usb_batch->transfered_size 199 -= td_remain_size(ohci_batch->tds[i]); 200 } 201 202 /* Clear possible ED HALT */ 203 ohci_batch->ed->td_head &= ~ED_TDHEAD_HALTED_FLAG; 204 /* just make sure that we are leaving the right TD behind */ 239 205 const uint32_t pa = addr_to_phys(ohci_ep->td); 240 206 assert(pa == (ohci_batch->ed->td_head & ED_TDHEAD_PTR_MASK)); … … 251 217 { 252 218 assert(ohci_batch); 253 ed_set_ tail_td(ohci_batch->ed, ohci_batch->tds[ohci_batch->td_count]);219 ed_set_end_td(ohci_batch->ed, ohci_batch->tds[ohci_batch->td_count]); 254 220 } 255 221 /*----------------------------------------------------------------------------*/ … … 281 247 const usb_direction_t status_dir = reverse_dir[dir]; 282 248 283 /* Setup stage */284 td_init( 285 ohci_batch->tds[0], ohci_batch->tds[1], USB_DIRECTION_BOTH,286 buffer, ohci_batch->usb_batch->setup_size, toggle);249 /* setup stage */ 250 td_init(ohci_batch->tds[0], USB_DIRECTION_BOTH, buffer, 251 ohci_batch->usb_batch->setup_size, toggle); 252 td_set_next(ohci_batch->tds[0], ohci_batch->tds[1]); 287 253 usb_log_debug("Created CONTROL SETUP TD: %08x:%08x:%08x:%08x.\n", 288 254 ohci_batch->tds[0]->status, ohci_batch->tds[0]->cbp, … … 290 256 buffer += ohci_batch->usb_batch->setup_size; 291 257 292 /* Data stage */258 /* data stage */ 293 259 size_t td_current = 1; 294 260 size_t remain_size = ohci_batch->usb_batch->buffer_size; … … 299 265 toggle = 1 - toggle; 300 266 301 td_init(ohci_batch->tds[td_current], 302 ohci_batch->tds[td_current + 1], 303 data_dir, buffer, transfer_size, toggle); 267 td_init(ohci_batch->tds[td_current], data_dir, buffer, 268 transfer_size, toggle); 269 td_set_next(ohci_batch->tds[td_current], 270 ohci_batch->tds[td_current + 1]); 304 271 usb_log_debug("Created CONTROL DATA TD: %08x:%08x:%08x:%08x.\n", 305 272 ohci_batch->tds[td_current]->status, … … 314 281 } 315 282 316 /* Status stage */283 /* status stage */ 317 284 assert(td_current == ohci_batch->td_count - 1); 318 td_init(ohci_batch->tds[td_current], ohci_batch->tds[td_current + 1], 319 status_dir, NULL, 0, 1); 285 td_init(ohci_batch->tds[td_current], status_dir, NULL, 0, 1); 286 td_set_next(ohci_batch->tds[td_current], 287 ohci_batch->tds[td_current + 1]); 320 288 usb_log_debug("Created CONTROL STATUS TD: %08x:%08x:%08x:%08x.\n", 321 289 ohci_batch->tds[td_current]->status, … … 355 323 ? OHCI_TD_MAX_TRANSFER : remain_size; 356 324 357 td_init( 358 ohci_batch->tds[td_current], ohci_batch->tds[td_current + 1], 359 dir, buffer, transfer_size, -1); 325 td_init(ohci_batch->tds[td_current], dir, buffer, 326 transfer_size, -1); 327 td_set_next(ohci_batch->tds[td_current], 328 ohci_batch->tds[td_current + 1]); 360 329 361 330 usb_log_debug("Created DATA TD: %08x:%08x:%08x:%08x.\n", -
uspace/drv/bus/usb/ohci/ohci_endpoint.c
r22ceff3a r25696fea 102 102 } 103 103 104 ed_init(ohci_ep->ed, ep, ohci_ep->td); 104 ed_init(ohci_ep->ed, ep); 105 ed_set_td(ohci_ep->ed, ohci_ep->td); 105 106 endpoint_set_hc_data( 106 107 ep, ohci_ep, ohci_endpoint_fini, ohci_ep_toggle_get, ohci_ep_toggle_set); -
uspace/drv/bus/usb/ohci/root_hub.c
r22ceff3a r25696fea 35 35 #include <errno.h> 36 36 #include <str_error.h> 37 #include <fibril_synch.h>38 37 39 38 #include <usb/debug.h> 40 #include <usb/dev/request.h>41 #include <usb/classes/hub.h>42 39 43 40 #include "root_hub.h" … … 46 43 #include <usb/dev/driver.h> 47 44 #include "ohci_regs.h" 45 46 #include <usb/dev/request.h> 47 #include <usb/classes/hub.h> 48 48 49 49 /** … … 108 108 static void create_serialized_hub_descriptor(rh_t *instance); 109 109 static void rh_init_descriptors(rh_t *instance); 110 static uint16_t create_interrupt_mask(const rh_t *instance); 111 static int get_status(const rh_t *instance, usb_transfer_batch_t *request); 112 static int get_descriptor(const rh_t *instance, usb_transfer_batch_t *request); 113 static int set_feature(const rh_t *instance, usb_transfer_batch_t *request); 114 static int clear_feature(const rh_t *instance, usb_transfer_batch_t *request); 115 static int set_feature_port( 116 const rh_t *instance, uint16_t feature, uint16_t port); 117 static int clear_feature_port( 118 const rh_t *instance, uint16_t feature, uint16_t port); 110 static uint16_t create_interrupt_mask(rh_t *instance); 111 static int get_status(rh_t *instance, usb_transfer_batch_t *request); 112 static int get_descriptor(rh_t *instance, usb_transfer_batch_t *request); 113 static int set_feature(rh_t *instance, usb_transfer_batch_t *request); 114 static int clear_feature(rh_t *instance, usb_transfer_batch_t *request); 115 static int set_feature_port(rh_t *instance, uint16_t feature, uint16_t port); 116 static int clear_feature_port(rh_t *instance, uint16_t feature, uint16_t port); 119 117 static int control_request(rh_t *instance, usb_transfer_batch_t *request); 120 118 static inline void interrupt_request( … … 155 153 instance->unfinished_interrupt_transfer = NULL; 156 154 157 #if definedOHCI_POWER_SWITCH_no155 #ifdef OHCI_POWER_SWITCH_no 158 156 /* Set port power mode to no power-switching. (always on) */ 159 157 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 160 161 158 /* Set to no over-current reporting */ 162 159 instance->registers->rh_desc_a |= RHDA_NOCP_FLAG; 163 164 160 #elif defined OHCI_POWER_SWITCH_ganged 165 161 /* Set port power mode to no ganged power-switching. */ … … 167 163 instance->registers->rh_desc_a &= ~RHDA_PSM_FLAG; 168 164 instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER; 169 170 165 /* Set to global over-current */ 171 166 instance->registers->rh_desc_a &= ~RHDA_NOCP_FLAG; … … 179 174 instance->registers->rh_desc_b &= (RHDB_PCC_MASK << RHDB_PCC_SHIFT); 180 175 instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER; 181 182 176 /* Return control to per port state */ 183 177 instance->registers->rh_desc_b |= 184 178 ((1 << (instance->port_count + 1)) - 1) << RHDB_PCC_SHIFT; 185 186 179 /* Set per port over-current */ 187 180 instance->registers->rh_desc_a &= ~RHDA_NOCP_FLAG; … … 189 182 #endif 190 183 191 fibril_mutex_initialize(&instance->guard);192 184 rh_init_descriptors(instance); 193 185 … … 217 209 case USB_TRANSFER_INTERRUPT: 218 210 usb_log_debug("Root hub got INTERRUPT packet\n"); 219 fibril_mutex_lock(&instance->guard);220 assert(instance->unfinished_interrupt_transfer == NULL);221 211 const uint16_t mask = create_interrupt_mask(instance); 222 212 if (mask == 0) { 223 213 usb_log_debug("No changes..\n"); 214 assert(instance->unfinished_interrupt_transfer == NULL); 224 215 instance->unfinished_interrupt_transfer = request; 225 fibril_mutex_unlock(&instance->guard);226 216 return; 227 217 } 228 218 usb_log_debug("Processing changes...\n"); 229 219 interrupt_request(request, mask, instance->interrupt_mask_size); 230 fibril_mutex_unlock(&instance->guard);231 220 break; 232 221 … … 248 237 assert(instance); 249 238 250 fibril_mutex_lock(&instance->guard); 251 if (instance->unfinished_interrupt_transfer) { 252 usb_log_debug("Finalizing interrupt transfer\n"); 253 const uint16_t mask = create_interrupt_mask(instance); 254 interrupt_request(instance->unfinished_interrupt_transfer, 255 mask, instance->interrupt_mask_size); 256 usb_transfer_batch_dispose( 257 instance->unfinished_interrupt_transfer); 258 instance->unfinished_interrupt_transfer = NULL; 259 } 260 fibril_mutex_unlock(&instance->guard); 239 if (!instance->unfinished_interrupt_transfer) 240 return; 241 242 usb_log_debug("Finalizing interrupt transfer\n"); 243 const uint16_t mask = create_interrupt_mask(instance); 244 interrupt_request(instance->unfinished_interrupt_transfer, 245 mask, instance->interrupt_mask_size); 246 usb_transfer_batch_dispose(instance->unfinished_interrupt_transfer); 247 248 instance->unfinished_interrupt_transfer = NULL; 261 249 } 262 250 /*----------------------------------------------------------------------------*/ … … 354 342 * @return Mask of changes. 355 343 */ 356 uint16_t create_interrupt_mask( constrh_t *instance)344 uint16_t create_interrupt_mask(rh_t *instance) 357 345 { 358 346 assert(instance); … … 384 372 * @return error code 385 373 */ 386 int get_status( constrh_t *instance, usb_transfer_batch_t *request)374 int get_status(rh_t *instance, usb_transfer_batch_t *request) 387 375 { 388 376 assert(instance); … … 430 418 * @return Error code 431 419 */ 432 int get_descriptor( constrh_t *instance, usb_transfer_batch_t *request)420 int get_descriptor(rh_t *instance, usb_transfer_batch_t *request) 433 421 { 434 422 assert(instance); … … 508 496 * @return error code 509 497 */ 510 int set_feature_port( constrh_t *instance, uint16_t feature, uint16_t port)498 int set_feature_port(rh_t *instance, uint16_t feature, uint16_t port) 511 499 { 512 500 assert(instance); … … 547 535 * @return error code 548 536 */ 549 int clear_feature_port( constrh_t *instance, uint16_t feature, uint16_t port)537 int clear_feature_port(rh_t *instance, uint16_t feature, uint16_t port) 550 538 { 551 539 assert(instance); … … 604 592 * @return error code 605 593 */ 606 int set_feature( constrh_t *instance, usb_transfer_batch_t *request)594 int set_feature(rh_t *instance, usb_transfer_batch_t *request) 607 595 { 608 596 assert(instance); … … 640 628 * @return error code 641 629 */ 642 int clear_feature( constrh_t *instance, usb_transfer_batch_t *request)630 int clear_feature(rh_t *instance, usb_transfer_batch_t *request) 643 631 { 644 632 assert(instance); … … 647 635 const usb_device_request_setup_packet_t *setup_request = 648 636 (usb_device_request_setup_packet_t *) request->setup_buffer; 649 650 637 request->transfered_size = 0; 651 652 638 switch (setup_request->request_type) 653 639 { … … 661 647 /* 662 648 * Chapter 11.16.2 specifies that only C_HUB_LOCAL_POWER and 663 * C_HUB_OVER_CURRENT are supported. 664 * C_HUB_OVER_CURRENT is represented by OHCI RHS_OCIC_FLAG. 665 * C_HUB_LOCAL_POWER is not supported 649 * C_HUB_OVER_CURRENT are supported. C_HUB_OVER_CURRENT is represented 650 * by OHCI RHS_OCIC_FLAG. C_HUB_LOCAL_POWER is not supported 666 651 * as root hubs do not support local power status feature. 667 652 * (OHCI pg. 127) */ … … 735 720 "additional data\n"); 736 721 return clear_feature(instance, request); 737 738 722 case USB_DEVREQ_SET_FEATURE: 739 723 usb_log_debug2("Processing request without " -
uspace/drv/bus/usb/ohci/root_hub.h
r22ceff3a r25696fea 47 47 */ 48 48 typedef struct rh { 49 fibril_mutex_t guard;50 49 /** pointer to ohci driver registers */ 51 50 ohci_regs_t *registers; -
uspace/drv/bus/usb/ohci/utils/malloc32.h
r22ceff3a r25696fea 41 41 #include <as.h> 42 42 43 /* Generic TDs and EDs require 16byte alignment,44 * Isochronous TD require 32byte alignment,45 * buffers do not have to be aligned.46 */47 #define OHCI_ALIGN 3248 49 43 /** Get physical address translation 50 44 * … … 68 62 */ 69 63 static inline void * malloc32(size_t size) 70 { return memalign( OHCI_ALIGN, size); }64 { return memalign(size, size); } 71 65 /*----------------------------------------------------------------------------*/ 72 66 /** Physical mallocator simulator -
uspace/drv/bus/usb/usbhid/generic/hiddev.c
r22ceff3a r25696fea 48 48 /*----------------------------------------------------------------------------*/ 49 49 50 constusb_endpoint_description_t usb_hid_generic_poll_endpoint_description = {50 usb_endpoint_description_t usb_hid_generic_poll_endpoint_description = { 51 51 .transfer_type = USB_TRANSFER_INTERRUPT, 52 52 .direction = USB_DIRECTION_IN, -
uspace/drv/bus/usb/usbhid/generic/hiddev.h
r22ceff3a r25696fea 41 41 struct usb_hid_dev; 42 42 43 extern const usb_endpoint_description_t 44 usb_hid_generic_poll_endpoint_description; 43 usb_endpoint_description_t usb_hid_generic_poll_endpoint_description; 45 44 46 45 const char *HID_GENERIC_FUN_NAME; -
uspace/drv/bus/usb/usbhid/kbd/kbddev.c
r22ceff3a r25696fea 88 88 89 89 /** Keyboard polling endpoint description for boot protocol class. */ 90 constusb_endpoint_description_t usb_hid_kbd_poll_endpoint_description = {90 usb_endpoint_description_t usb_hid_kbd_poll_endpoint_description = { 91 91 .transfer_type = USB_TRANSFER_INTERRUPT, 92 92 .direction = USB_DIRECTION_IN, … … 237 237 238 238 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 239 &hid_dev->report, NULL, kbd_dev->led_path,239 hid_dev->report, NULL, kbd_dev->led_path, 240 240 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 241 241 USB_HID_REPORT_TYPE_OUTPUT); 242 242 243 243 while (field != NULL) { 244 245 if ((field->usage == USB_HID_LED_NUM_LOCK) 244 245 if ((field->usage == USB_HID_LED_NUM_LOCK) 246 246 && (kbd_dev->mods & KM_NUM_LOCK)){ 247 247 field->value = 1; 248 248 } 249 249 250 if ((field->usage == USB_HID_LED_CAPS_LOCK) 250 if ((field->usage == USB_HID_LED_CAPS_LOCK) 251 251 && (kbd_dev->mods & KM_CAPS_LOCK)){ 252 252 field->value = 1; 253 253 } 254 254 255 if ((field->usage == USB_HID_LED_SCROLL_LOCK) 255 if ((field->usage == USB_HID_LED_SCROLL_LOCK) 256 256 && (kbd_dev->mods & KM_SCROLL_LOCK)){ 257 257 field->value = 1; 258 258 } 259 260 field = usb_hid_report_get_sibling( 261 &hid_dev->report, field, kbd_dev->led_path,262 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,263 259 260 field = usb_hid_report_get_sibling(hid_dev->report, field, 261 kbd_dev->led_path, 262 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 263 USB_HID_REPORT_TYPE_OUTPUT); 264 264 } 265 265 266 266 // TODO: what about the Report ID? 267 int rc = usb_hid_report_output_translate( &hid_dev->report, 0,267 int rc = usb_hid_report_output_translate(hid_dev->report, 0, 268 268 kbd_dev->output_buffer, kbd_dev->output_size); 269 269 … … 432 432 static void usb_kbd_process_data(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev) 433 433 { 434 assert(hid_dev->report != NULL); 434 435 assert(hid_dev != NULL); 435 436 assert(kbd_dev != NULL); … … 443 444 444 445 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 445 &hid_dev->report, NULL, path,446 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 446 hid_dev->report, NULL, path, 447 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 447 448 USB_HID_REPORT_TYPE_INPUT); 448 449 unsigned i = 0; … … 453 454 454 455 assert(i < kbd_dev->key_count); 455 456 456 457 // save the key usage 457 458 if (field->value != 0) { … … 462 463 } 463 464 usb_log_debug2("Saved %u. key usage %d\n", i, kbd_dev->keys[i]); 464 465 465 466 ++i; 466 field = usb_hid_report_get_sibling( 467 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END468 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,467 field = usb_hid_report_get_sibling(hid_dev->report, field, path, 468 USB_HID_PATH_COMPARE_END 469 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 469 470 USB_HID_REPORT_TYPE_INPUT); 470 471 } … … 615 616 616 617 kbd_dev->key_count = usb_hid_report_size( 617 &hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT);618 hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT); 618 619 usb_hid_report_path_free(path); 619 620 620 621 usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count); 621 622 622 kbd_dev->keys = calloc(kbd_dev->key_count, sizeof(int32_t));623 kbd_dev->keys = (int32_t *)calloc(kbd_dev->key_count, sizeof(int32_t)); 623 624 624 625 if (kbd_dev->keys == NULL) { … … 642 643 */ 643 644 kbd_dev->output_size = 0; 644 kbd_dev->output_buffer = usb_hid_report_output( &hid_dev->report,645 kbd_dev->output_buffer = usb_hid_report_output(hid_dev->report, 645 646 &kbd_dev->output_size, 0); 646 647 if (kbd_dev->output_buffer == NULL) { … … 656 657 kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0); 657 658 658 kbd_dev->led_output_size = usb_hid_report_size( 659 &hid_dev->report,0, USB_HID_REPORT_TYPE_OUTPUT);659 kbd_dev->led_output_size = usb_hid_report_size(hid_dev->report, 660 0, USB_HID_REPORT_TYPE_OUTPUT); 660 661 661 662 usb_log_debug("Output report size (in items): %zu\n", … … 825 826 int usb_kbd_set_boot_protocol(usb_hid_dev_t *hid_dev) 826 827 { 827 int rc = usb_hid_parse_report_descriptor( 828 &hid_dev->report, USB_KBD_BOOT_REPORT_DESCRIPTOR,828 int rc = usb_hid_parse_report_descriptor(hid_dev->report, 829 USB_KBD_BOOT_REPORT_DESCRIPTOR, 829 830 USB_KBD_BOOT_REPORT_DESCRIPTOR_SIZE); 830 831 … … 835 836 } 836 837 837 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 838 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 838 839 hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT); 839 840 -
uspace/drv/bus/usb/usbhid/kbd/kbddev.h
r22ceff3a r25696fea 118 118 /*----------------------------------------------------------------------------*/ 119 119 120 extern constusb_endpoint_description_t usb_hid_kbd_poll_endpoint_description;120 usb_endpoint_description_t usb_hid_kbd_poll_endpoint_description; 121 121 122 122 const char *HID_KBD_FUN_NAME; -
uspace/drv/bus/usb/usbhid/main.c
r22ceff3a r25696fea 92 92 if (rc != EOK) { 93 93 usb_log_error("Failed to initialize USB/HID device.\n"); 94 usb_hid_de init(hid_dev);94 usb_hid_destroy(hid_dev); 95 95 return rc; 96 96 } … … 128 128 usb_log_error("Failed to start polling fibril for `%s'.\n", 129 129 dev->ddf_dev->name); 130 usb_hid_de init(hid_dev);130 usb_hid_destroy(hid_dev); 131 131 return rc; 132 132 } 133 133 hid_dev->running = true; 134 dev->driver_data = hid_dev; 134 135 135 136 /* … … 203 204 204 205 assert(!hid_dev->running); 205 usb_hid_de init(hid_dev);206 usb_hid_destroy(hid_dev); 206 207 usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name); 207 208 return EOK; -
uspace/drv/bus/usb/usbhid/mouse/mousedev.c
r22ceff3a r25696fea 59 59 /*----------------------------------------------------------------------------*/ 60 60 61 constusb_endpoint_description_t usb_hid_mouse_poll_endpoint_description = {61 usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description = { 62 62 .transfer_type = USB_TRANSFER_INTERRUPT, 63 63 .direction = USB_DIRECTION_IN, … … 268 268 269 269 int shift_x = get_mouse_axis_move_value(hid_dev->report_id, 270 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X);270 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_X); 271 271 int shift_y = get_mouse_axis_move_value(hid_dev->report_id, 272 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y);272 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_Y); 273 273 int wheel = get_mouse_axis_move_value(hid_dev->report_id, 274 &hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL);274 hid_dev->report, USB_HIDUT_USAGE_GENERIC_DESKTOP_WHEEL); 275 275 276 276 if ((shift_x != 0) || (shift_y != 0)) { 277 async_exch_t *exch = 278 async_exchange_begin(mouse_dev->mouse_sess); 277 async_exch_t *exch = async_exchange_begin(mouse_dev->mouse_sess); 279 278 async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y); 280 279 async_exchange_end(exch); … … 292 291 293 292 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 294 &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 295 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, USB_HID_REPORT_TYPE_INPUT); 293 hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 294 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 295 USB_HID_REPORT_TYPE_INPUT); 296 296 297 297 while (field != NULL) { … … 314 314 async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 0); 315 315 async_exchange_end(exch); 316 316 317 317 mouse_dev->buttons[field->usage - field->usage_minimum] = 318 318 field->value; 319 319 } 320 320 321 321 field = usb_hid_report_get_sibling( 322 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END323 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 322 hid_dev->report, field, path, USB_HID_PATH_COMPARE_END 323 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 324 324 USB_HID_REPORT_TYPE_INPUT); 325 325 } … … 474 474 // that the current solution is good enough. 475 475 /* Adding 1 because we will be accessing buttons[highest]. */ 476 mouse_dev->buttons_count = 1 + usb_mouse_get_highest_button(477 &hid_dev->report, hid_dev->report_id);476 mouse_dev->buttons_count = usb_mouse_get_highest_button(hid_dev->report, 477 hid_dev->report_id) + 1; 478 478 mouse_dev->buttons = calloc(mouse_dev->buttons_count, sizeof(int32_t)); 479 479 … … 532 532 int usb_mouse_set_boot_protocol(usb_hid_dev_t *hid_dev) 533 533 { 534 int rc = usb_hid_parse_report_descriptor( 535 &hid_dev->report, USB_MOUSE_BOOT_REPORT_DESCRIPTOR,534 int rc = usb_hid_parse_report_descriptor(hid_dev->report, 535 USB_MOUSE_BOOT_REPORT_DESCRIPTOR, 536 536 USB_MOUSE_BOOT_REPORT_DESCRIPTOR_SIZE); 537 537 … … 542 542 } 543 543 544 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 544 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 545 545 hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT); 546 546 -
uspace/drv/bus/usb/usbhid/mouse/mousedev.h
r22ceff3a r25696fea 63 63 /*----------------------------------------------------------------------------*/ 64 64 65 extern constusb_endpoint_description_t usb_hid_mouse_poll_endpoint_description;65 usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description; 66 66 67 67 const char *HID_MOUSE_FUN_NAME; -
uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
r22ceff3a r25696fea 161 161 /*----------------------------------------------------------------------------*/ 162 162 163 int usb_multimedia_init(struct usb_hid_dev *hid_dev, void **data) 164 { 165 if (hid_dev == NULL || hid_dev->usb_dev == NULL) { 166 return EINVAL; /*! @todo Other return code? */ 167 } 168 169 usb_log_debug(NAME " Initializing HID/multimedia structure...\n"); 170 163 static int usb_multimedia_create_function(usb_hid_dev_t *hid_dev, 164 usb_multimedia_t *multim_dev) 165 { 171 166 /* Create the exposed function. */ 172 ddf_fun_t *fun = ddf_fun_create( 173 hid_dev->usb_dev->ddf_dev, fun_exposed,NAME);167 ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed, 168 NAME); 174 169 if (fun == NULL) { 175 170 usb_log_error("Could not create DDF function node.\n"); … … 178 173 179 174 fun->ops = &multimedia_ops; 180 181 usb_multimedia_t *multim_dev = 182 ddf_fun_data_alloc(fun, sizeof(usb_multimedia_t)); 183 if (multim_dev == NULL) { 184 ddf_fun_destroy(fun); 185 return ENOMEM; 186 } 187 188 multim_dev->console_sess = NULL; 189 multim_dev->fun = fun; 190 191 //todo Autorepeat? 175 fun->driver_data = multim_dev; // TODO: maybe change to hid_dev->data 192 176 193 177 int rc = ddf_fun_bind(fun); … … 210 194 return rc; 211 195 } 212 213 /* Save the KBD device structure into the HID device structure. */ 196 multim_dev->fun = fun; 197 198 return EOK; 199 } 200 201 /*----------------------------------------------------------------------------*/ 202 203 int usb_multimedia_init(struct usb_hid_dev *hid_dev, void **data) 204 { 205 if (hid_dev == NULL || hid_dev->usb_dev == NULL) { 206 return EINVAL; /*! @todo Other return code? */ 207 } 208 209 usb_log_debug(NAME " Initializing HID/multimedia structure...\n"); 210 211 usb_multimedia_t *multim_dev = (usb_multimedia_t *)malloc( 212 sizeof(usb_multimedia_t)); 213 if (multim_dev == NULL) { 214 return ENOMEM; 215 } 216 217 multim_dev->console_sess = NULL; 218 219 /*! @todo Autorepeat */ 220 221 // save the KBD device structure into the HID device structure 214 222 *data = multim_dev; 215 223 224 usb_log_debug(NAME " HID/multimedia device structure initialized.\n"); 225 226 int rc = usb_multimedia_create_function(hid_dev, multim_dev); 227 if (rc != EOK) 228 return rc; 229 216 230 usb_log_debug(NAME " HID/multimedia structure initialized.\n"); 231 217 232 return EOK; 218 233 } … … 257 272 258 273 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 259 &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END260 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 274 hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 275 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 261 276 USB_HID_REPORT_TYPE_INPUT); 262 277 … … 278 293 279 294 field = usb_hid_report_get_sibling( 280 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END295 hid_dev->report, field, path, USB_HID_PATH_COMPARE_END 281 296 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 282 297 USB_HID_REPORT_TYPE_INPUT); -
uspace/drv/bus/usb/usbhid/subdrivers.c
r22ceff3a r25696fea 42 42 #include "generic/hiddev.h" 43 43 44 static constusb_hid_subdriver_usage_t path_kbd[] = {45 {USB_HIDUT_PAGE_GENERIC_DESKTOP, 46 USB_HIDUT_USAGE_GENERIC_DESKTOP_KEYBOARD}, 44 static usb_hid_subdriver_usage_t path_kbd[] = { 45 {USB_HIDUT_PAGE_GENERIC_DESKTOP, 46 USB_HIDUT_USAGE_GENERIC_DESKTOP_KEYBOARD}, 47 47 {0, 0} 48 48 }; 49 49 50 static constusb_hid_subdriver_usage_t path_mouse[] = {50 static usb_hid_subdriver_usage_t path_mouse[] = { 51 51 {USB_HIDUT_PAGE_GENERIC_DESKTOP, USB_HIDUT_USAGE_GENERIC_DESKTOP_MOUSE}, 52 52 {0, 0} 53 53 }; 54 54 55 static constusb_hid_subdriver_usage_t multim_key_path[] = {55 static usb_hid_subdriver_usage_t multim_key_path[] = { 56 56 {USB_HIDUT_PAGE_CONSUMER, USB_HIDUT_USAGE_CONSUMER_CONSUMER_CONTROL}, 57 57 {0, 0} … … 71 71 .poll_end = NULL 72 72 }, 73 73 74 }, 74 75 { … … 101 102 }; 102 103 103 const int USB_HID_MAX_SUBDRIVERS =104 sizeof(usb_hid_subdrivers) / sizeof(usb_hid_subdrivers[0]);105 106 104 /** 107 105 * @} -
uspace/drv/bus/usb/usbhid/subdrivers.h
r22ceff3a r25696fea 78 78 79 79 /** Subdriver for controlling this device. */ 80 constusb_hid_subdriver_t subdriver;80 usb_hid_subdriver_t subdriver; 81 81 } usb_hid_subdriver_mapping_t; 82 82 … … 84 84 85 85 extern const usb_hid_subdriver_mapping_t usb_hid_subdrivers[]; 86 extern const int USB_HID_MAX_SUBDRIVERS;87 86 88 87 /*----------------------------------------------------------------------------*/ -
uspace/drv/bus/usb/usbhid/usbhid.c
r22ceff3a r25696fea 54 54 55 55 /* Array of endpoints expected on the device, NULL terminated. */ 56 constusb_endpoint_description_t *usb_hid_endpoints[] = {56 usb_endpoint_description_t *usb_hid_endpoints[] = { 57 57 &usb_hid_kbd_poll_endpoint_description, 58 58 &usb_hid_mouse_poll_endpoint_description, … … 61 61 }; 62 62 63 static const int USB_HID_MAX_SUBDRIVERS = 10; 64 63 65 /*----------------------------------------------------------------------------*/ 64 66 65 67 static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev) 66 68 { 67 assert(hid_dev != NULL );68 assert(hid_dev->subdriver_count == 0); 69 70 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t));69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 70 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 72 sizeof(usb_hid_subdriver_t)); 71 73 if (hid_dev->subdrivers == NULL) { 72 74 return ENOMEM; 73 75 } 74 hid_dev->subdriver_count = 1; 75 // TODO 0 should be keyboard, but find a better way 76 hid_dev->subdrivers[0] = usb_hid_subdrivers[0].subdriver; 76 77 assert(hid_dev->subdriver_count >= 0); 78 79 // set the init callback 80 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_kbd_init; 81 82 // set the polling callback 83 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 84 usb_kbd_polling_callback; 85 86 // set the polling ended callback 87 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 88 89 // set the deinit callback 90 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_kbd_deinit; 91 92 // set subdriver count 93 ++hid_dev->subdriver_count; 77 94 78 95 return EOK; … … 83 100 static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev) 84 101 { 85 assert(hid_dev != NULL );86 assert(hid_dev->subdriver_count == 0); 87 88 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t));102 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 103 104 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 105 sizeof(usb_hid_subdriver_t)); 89 106 if (hid_dev->subdrivers == NULL) { 90 107 return ENOMEM; 91 108 } 92 hid_dev->subdriver_count = 1; 93 // TODO 2 should be mouse, but find a better way 94 hid_dev->subdrivers[2] = usb_hid_subdrivers[0].subdriver; 109 110 assert(hid_dev->subdriver_count >= 0); 111 112 // set the init callback 113 hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_mouse_init; 114 115 // set the polling callback 116 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 117 usb_mouse_polling_callback; 118 119 // set the polling ended callback 120 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 121 122 // set the deinit callback 123 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_mouse_deinit; 124 125 // set subdriver count 126 ++hid_dev->subdriver_count; 95 127 96 128 return EOK; … … 103 135 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 104 136 105 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 137 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 138 sizeof(usb_hid_subdriver_t)); 106 139 if (hid_dev->subdrivers == NULL) { 107 140 return ENOMEM; 108 141 } 109 hid_dev->subdriver_count = 1; 110 111 /* Set generic hid subdriver routines */ 112 hid_dev->subdrivers[0].init = usb_generic_hid_init; 113 hid_dev->subdrivers[0].poll = usb_generic_hid_polling_callback; 114 hid_dev->subdrivers[0].poll_end = NULL; 115 hid_dev->subdrivers[0].deinit = usb_generic_hid_deinit; 142 143 assert(hid_dev->subdriver_count >= 0); 144 145 // set the init callback 146 hid_dev->subdrivers[hid_dev->subdriver_count].init = 147 usb_generic_hid_init; 148 149 // set the polling callback 150 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 151 usb_generic_hid_polling_callback; 152 153 // set the polling ended callback 154 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 155 156 // set the deinit callback 157 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = 158 usb_generic_hid_deinit; 159 160 // set subdriver count 161 ++hid_dev->subdriver_count; 116 162 117 163 return EOK; … … 120 166 /*----------------------------------------------------------------------------*/ 121 167 122 static bool usb_hid_ids_match( const usb_hid_dev_t *hid_dev,168 static bool usb_hid_ids_match(usb_hid_dev_t *hid_dev, 123 169 const usb_hid_subdriver_mapping_t *mapping) 124 170 { … … 126 172 assert(hid_dev->usb_dev != NULL); 127 173 128 return (hid_dev->usb_dev->descriptors.device.vendor_id 174 return (hid_dev->usb_dev->descriptors.device.vendor_id 129 175 == mapping->vendor_id 130 176 && hid_dev->usb_dev->descriptors.device.product_id … … 134 180 /*----------------------------------------------------------------------------*/ 135 181 136 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 182 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 137 183 const usb_hid_subdriver_mapping_t *mapping) 138 184 { … … 146 192 } 147 193 int i = 0; 148 while (mapping->usage_path[i].usage != 0 194 while (mapping->usage_path[i].usage != 0 149 195 || mapping->usage_path[i].usage_page != 0) { 150 if (usb_hid_report_path_append_item(usage_path, 151 mapping->usage_path[i].usage_page, 196 if (usb_hid_report_path_append_item(usage_path, 197 mapping->usage_path[i].usage_page, 152 198 mapping->usage_path[i].usage) != EOK) { 153 199 usb_log_debug("Failed to append to usage path.\n"); … … 158 204 } 159 205 206 assert(hid_dev->report != NULL); 207 160 208 usb_log_debug("Compare flags: %d\n", mapping->compare); 161 209 … … 165 213 do { 166 214 usb_log_debug("Trying report id %u\n", report_id); 167 215 168 216 if (report_id != 0) { 169 217 usb_hid_report_path_set_report_id(usage_path, … … 172 220 173 221 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 174 &hid_dev->report, NULL, usage_path, mapping->compare, 222 hid_dev->report, 223 NULL, usage_path, mapping->compare, 175 224 USB_HID_REPORT_TYPE_INPUT); 176 225 177 226 usb_log_debug("Field: %p\n", field); 178 227 … … 181 230 break; 182 231 } 183 232 184 233 report_id = usb_hid_get_next_report_id( 185 &hid_dev->report, report_id, USB_HID_REPORT_TYPE_INPUT); 234 hid_dev->report, report_id, 235 USB_HID_REPORT_TYPE_INPUT); 186 236 } while (!matches && report_id != 0); 187 237 … … 193 243 /*----------------------------------------------------------------------------*/ 194 244 195 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 245 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 196 246 const usb_hid_subdriver_t **subdrivers, int count) 197 247 { … … 204 254 } 205 255 206 /* +1 for generic hid subdriver */ 207 hid_dev->subdrivers = calloc((count + 1), sizeof(usb_hid_subdriver_t)); 256 // add one generic HID subdriver per device 257 258 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc((count + 1) * 259 sizeof(usb_hid_subdriver_t)); 208 260 if (hid_dev->subdrivers == NULL) { 209 261 return ENOMEM; … … 217 269 } 218 270 219 /* Add one generic HID subdriver per device */220 271 hid_dev->subdrivers[count].init = usb_generic_hid_init; 221 272 hid_dev->subdrivers[count].poll = usb_generic_hid_polling_callback; … … 256 307 return EINVAL; 257 308 } 258 309 259 310 ids_matched = false; 260 311 matched = false; 261 312 262 313 if (mapping->vendor_id >= 0) { 263 314 assert(mapping->product_id >= 0); … … 270 321 } 271 322 } 272 323 273 324 if (mapping->usage_path != NULL) { 274 325 usb_log_debug("Comparing device against usage path.\n"); … … 281 332 matched = ids_matched; 282 333 } 283 334 284 335 if (matched) { 285 336 usb_log_debug("Subdriver matched.\n"); 286 337 subdrivers[count++] = &mapping->subdriver; 287 338 } 288 339 289 340 mapping = &usb_hid_subdrivers[++i]; 290 341 } 291 342 292 /* We have all subdrivers determined, save them into the hid device */ 293 // TODO Dowe really need this complicated stuff if there is 294 // max_subdrivers limitation? 343 // we have all subdrivers determined, save them into the hid device 295 344 return usb_hid_save_subdrivers(hid_dev, subdrivers, count); 296 345 } … … 298 347 /*----------------------------------------------------------------------------*/ 299 348 300 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, const usb_device_t *dev) 301 { 302 assert(hid_dev); 303 assert(dev); 349 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, usb_device_t *dev) 350 { 351 assert(hid_dev != NULL && dev != NULL); 352 353 int rc = EOK; 304 354 305 355 if (dev->pipes[USB_HID_KBD_POLL_EP_NO].present) { … … 318 368 usb_log_error("None of supported endpoints found - probably" 319 369 " not a supported device.\n"); 320 r eturnENOTSUP;321 } 322 323 return EOK;370 rc = ENOTSUP; 371 } 372 373 return rc; 324 374 } 325 375 … … 328 378 static int usb_hid_init_report(usb_hid_dev_t *hid_dev) 329 379 { 330 assert(hid_dev != NULL );380 assert(hid_dev != NULL && hid_dev->report != NULL); 331 381 332 382 uint8_t report_id = 0; 383 size_t size; 384 333 385 size_t max_size = 0; 334 386 335 387 do { 336 388 usb_log_debug("Getting size of the report.\n"); 337 const size_t size = 338 usb_hid_report_byte_size(&hid_dev->report, report_id, 339 USB_HID_REPORT_TYPE_INPUT); 389 size = usb_hid_report_byte_size(hid_dev->report, report_id, 390 USB_HID_REPORT_TYPE_INPUT); 340 391 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 341 392 max_size = (size > max_size) ? size : max_size; 342 393 usb_log_debug("Getting next report ID\n"); 343 report_id = usb_hid_get_next_report_id( &hid_dev->report,394 report_id = usb_hid_get_next_report_id(hid_dev->report, 344 395 report_id, USB_HID_REPORT_TYPE_INPUT); 345 396 } while (report_id != 0); … … 347 398 usb_log_debug("Max size of input report: %zu\n", max_size); 348 399 400 hid_dev->max_input_report_size = max_size; 349 401 assert(hid_dev->input_report == NULL); 350 402 351 hid_dev->input_report = calloc(1,max_size);403 hid_dev->input_report = malloc(max_size); 352 404 if (hid_dev->input_report == NULL) { 353 405 return ENOMEM; 354 406 } 355 hid_dev->max_input_report_size = max_size;407 memset(hid_dev->input_report, 0, max_size); 356 408 357 409 return EOK; … … 378 430 } 379 431 380 usb_hid_report_init(&hid_dev->report); 432 hid_dev->report = (usb_hid_report_t *)(malloc(sizeof( 433 usb_hid_report_t))); 434 if (hid_dev->report == NULL) { 435 usb_log_error("No memory!\n"); 436 return ENOMEM; 437 } 438 usb_hid_report_init(hid_dev->report); 381 439 382 440 /* The USB device should already be initialized, save it in structure */ … … 388 446 return rc; 389 447 } 390 448 391 449 /* Get the report descriptor and parse it. */ 392 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 393 &hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);450 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 451 hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size); 394 452 395 453 bool fallback = false; … … 430 488 break; 431 489 default: 432 assert(hid_dev->poll_pipe_index 490 assert(hid_dev->poll_pipe_index 433 491 == USB_HID_GENERIC_POLL_EP_NO); 434 492 435 493 usb_log_info("Falling back to generic HID driver.\n"); 436 494 rc = usb_hid_set_generic_hid_subdriver(hid_dev); … … 441 499 usb_log_error("No subdriver for handling this device could be" 442 500 " initialized: %s.\n", str_error(rc)); 443 usb_log_debug("Subdriver count: %d\n", 501 usb_log_debug("Subdriver count: %d\n", 444 502 hid_dev->subdriver_count); 503 445 504 } else { 446 505 bool ok = false; 447 448 usb_log_debug("Subdriver count: %d\n", 506 507 usb_log_debug("Subdriver count: %d\n", 449 508 hid_dev->subdriver_count); 450 509 451 510 for (i = 0; i < hid_dev->subdriver_count; ++i) { 452 511 if (hid_dev->subdrivers[i].init != NULL) { … … 465 524 } 466 525 } 467 526 468 527 rc = (ok) ? EOK : -1; // what error to report 469 528 } … … 479 538 } 480 539 540 481 541 return rc; 482 542 } … … 484 544 /*----------------------------------------------------------------------------*/ 485 545 486 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 546 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 487 547 size_t buffer_size, void *arg) 488 548 { 549 int i; 550 489 551 if (dev == NULL || arg == NULL || buffer == NULL) { 490 552 usb_log_error("Missing arguments to polling callback.\n"); 491 553 return false; 492 554 } 493 usb_hid_dev_t *hid_dev = arg; 555 556 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 494 557 495 558 assert(hid_dev->input_report != NULL); 496 497 559 usb_log_debug("New data [%zu/%zu]: %s\n", buffer_size, 498 560 hid_dev->max_input_report_size, … … 506 568 } 507 569 508 /* Parse the input report */ 509 const int rc = usb_hid_parse_report( 510 &hid_dev->report, buffer, buffer_size, &hid_dev->report_id); 570 // parse the input report 571 572 int rc = usb_hid_parse_report(hid_dev->report, buffer, buffer_size, 573 &hid_dev->report_id); 574 511 575 if (rc != EOK) { 512 576 usb_log_warning("Error in usb_hid_parse_report():" 513 577 "%s\n", str_error(rc)); 514 } 578 } 515 579 516 580 bool cont = false; 517 /* Continue if at least one of the subdrivers want to continue */ 518 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 519 if (hid_dev->subdrivers[i].poll != NULL) { 520 cont = cont || hid_dev->subdrivers[i].poll( 521 hid_dev, hid_dev->subdrivers[i].data); 581 582 // continue if at least one of the subdrivers want to continue 583 for (i = 0; i < hid_dev->subdriver_count; ++i) { 584 if (hid_dev->subdrivers[i].poll != NULL 585 && hid_dev->subdrivers[i].poll(hid_dev, 586 hid_dev->subdrivers[i].data)) { 587 cont = true; 522 588 } 523 589 } … … 528 594 /*----------------------------------------------------------------------------*/ 529 595 530 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg) 531 { 532 assert(dev); 533 assert(arg); 534 535 usb_hid_dev_t *hid_dev = arg; 536 537 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 596 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, 597 void *arg) 598 { 599 int i; 600 601 if (dev == NULL || arg == NULL) { 602 return; 603 } 604 605 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 606 607 for (i = 0; i < hid_dev->subdriver_count; ++i) { 538 608 if (hid_dev->subdrivers[i].poll_end != NULL) { 539 hid_dev->subdrivers[i].poll_end( 540 hid_dev , hid_dev->subdrivers[i].data, reason);609 hid_dev->subdrivers[i].poll_end(hid_dev, 610 hid_dev->subdrivers[i].data, reason); 541 611 } 542 612 } … … 554 624 /*----------------------------------------------------------------------------*/ 555 625 556 int usb_hid_report_number( constusb_hid_dev_t *hid_dev)626 int usb_hid_report_number(usb_hid_dev_t *hid_dev) 557 627 { 558 628 return hid_dev->report_nr; … … 561 631 /*----------------------------------------------------------------------------*/ 562 632 563 void usb_hid_deinit(usb_hid_dev_t *hid_dev) 564 { 565 assert(hid_dev); 566 assert(hid_dev->subdrivers != NULL || hid_dev->subdriver_count == 0); 567 633 void usb_hid_destroy(usb_hid_dev_t *hid_dev) 634 { 635 int i; 636 637 if (hid_dev == NULL) { 638 return; 639 } 568 640 569 641 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 570 642 hid_dev->subdrivers, hid_dev->subdriver_count); 571 643 572 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 644 assert(hid_dev->subdrivers != NULL 645 || hid_dev->subdriver_count == 0); 646 647 for (i = 0; i < hid_dev->subdriver_count; ++i) { 573 648 if (hid_dev->subdrivers[i].deinit != NULL) { 574 649 hid_dev->subdrivers[i].deinit(hid_dev, … … 582 657 583 658 /* Destroy the parser */ 584 usb_hid_report_deinit(&hid_dev->report); 659 if (hid_dev->report != NULL) { 660 usb_hid_free_report(hid_dev->report); 661 } 585 662 586 663 } -
uspace/drv/bus/usb/usbhid/usbhid.h
r22ceff3a r25696fea 119 119 120 120 /** HID Report parser. */ 121 usb_hid_report_t report;121 usb_hid_report_t *report; 122 122 123 123 uint8_t report_id; … … 141 141 }; 142 142 143 extern constusb_endpoint_description_t *usb_hid_endpoints[];143 extern usb_endpoint_description_t *usb_hid_endpoints[]; 144 144 145 145 /*----------------------------------------------------------------------------*/ … … 147 147 int usb_hid_init(usb_hid_dev_t *hid_dev, usb_device_t *dev); 148 148 149 void usb_hid_deinit(usb_hid_dev_t *hid_dev); 149 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 150 size_t buffer_size, void *arg); 150 151 151 bool usb_hid_polling_callback(usb_device_t *dev, 152 uint8_t *buffer, size_t buffer_size, void *arg); 153 154 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg); 152 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, 153 void *arg); 155 154 156 155 void usb_hid_new_report(usb_hid_dev_t *hid_dev); 157 156 158 int usb_hid_report_number(const usb_hid_dev_t *hid_dev); 157 int usb_hid_report_number(usb_hid_dev_t *hid_dev); 158 159 void usb_hid_destroy(usb_hid_dev_t *hid_dev); 159 160 160 161 #endif /* USB_HID_USBHID_H_ */ -
uspace/drv/bus/usb/usbhub/main.c
r22ceff3a r25696fea 67 67 68 68 /** Hub endpoints, excluding control endpoint. */ 69 static constusb_endpoint_description_t *usb_hub_endpoints[] = {69 static usb_endpoint_description_t *usb_hub_endpoints[] = { 70 70 &hub_status_change_endpoint_description, 71 71 NULL, -
uspace/drv/bus/usb/usbmast/main.c
r22ceff3a r25696fea 72 72 }; 73 73 74 static constusb_endpoint_description_t *mast_endpoints[] = {74 usb_endpoint_description_t *mast_endpoints[] = { 75 75 &bulk_in_ep, 76 76 &bulk_out_ep, -
uspace/drv/bus/usb/usbmouse/init.c
r22ceff3a r25696fea 44 44 45 45 /** Mouse polling endpoint description for boot protocol subclass. */ 46 constusb_endpoint_description_t poll_endpoint_description = {46 usb_endpoint_description_t poll_endpoint_description = { 47 47 .transfer_type = USB_TRANSFER_INTERRUPT, 48 48 .direction = USB_DIRECTION_IN, -
uspace/drv/bus/usb/usbmouse/main.c
r22ceff3a r25696fea 83 83 }; 84 84 85 static constusb_endpoint_description_t *endpoints[] = {85 static usb_endpoint_description_t *endpoints[] = { 86 86 &poll_endpoint_description, 87 87 NULL -
uspace/drv/bus/usb/usbmouse/mouse.c
r22ceff3a r25696fea 124 124 mouse->console_sess = NULL; 125 125 126 usb_device_de init(dev);126 usb_device_destroy(dev); 127 127 } 128 128 -
uspace/drv/bus/usb/usbmouse/mouse.h
r22ceff3a r25696fea 61 61 } usb_mouse_t; 62 62 63 extern constusb_endpoint_description_t poll_endpoint_description;63 extern usb_endpoint_description_t poll_endpoint_description; 64 64 65 65 extern int usb_mouse_create(usb_device_t *); -
uspace/lib/usbdev/include/usb/dev/driver.h
r22ceff3a r25696fea 156 156 \endcode 157 157 */ 158 constusb_endpoint_description_t **endpoints;158 usb_endpoint_description_t **endpoints; 159 159 /** Driver ops. */ 160 160 const usb_driver_ops_t *ops; … … 164 164 165 165 int usb_device_select_interface(usb_device_t *, uint8_t, 166 constusb_endpoint_description_t **);166 usb_endpoint_description_t **); 167 167 168 168 int usb_device_retrieve_descriptors(usb_pipe_t *, usb_device_descriptors_t *); 169 169 int usb_device_create_pipes(const ddf_dev_t *, usb_device_connection_t *, 170 constusb_endpoint_description_t **, const uint8_t *, size_t, int, int,170 usb_endpoint_description_t **, const uint8_t *, size_t, int, int, 171 171 usb_endpoint_mapping_t **, size_t *); 172 172 int usb_device_destroy_pipes(const ddf_dev_t *, usb_endpoint_mapping_t *, size_t); 173 int usb_device_create(ddf_dev_t *, const usb_endpoint_description_t **, 174 usb_device_t **, const char **); 175 void usb_device_deinit(usb_device_t *); 173 int usb_device_create(ddf_dev_t *, usb_endpoint_description_t **, usb_device_t **, const char **); 174 void usb_device_destroy(usb_device_t *); 176 175 void * usb_device_data_alloc(usb_device_t *, size_t); 177 176 -
uspace/lib/usbdev/src/devdrv.c
r22ceff3a r25696fea 81 81 * @return Number of pipes (excluding default control pipe). 82 82 */ 83 static size_t count_other_pipes( constusb_endpoint_description_t **endpoints)83 static size_t count_other_pipes(usb_endpoint_description_t **endpoints) 84 84 { 85 85 size_t count = 0; … … 101 101 * @return Error code. 102 102 */ 103 static int initialize_other_pipes( constusb_endpoint_description_t **endpoints,103 static int initialize_other_pipes(usb_endpoint_description_t **endpoints, 104 104 usb_device_t *dev, int alternate_setting) 105 105 { … … 154 154 rc = driver->ops->device_add(dev); 155 155 if (rc != EOK) 156 usb_device_de init(dev);156 usb_device_destroy(dev); 157 157 return rc; 158 158 } … … 191 191 const int ret = driver->ops->device_gone(usb_dev); 192 192 if (ret == EOK) 193 usb_device_de init(usb_dev);193 usb_device_destroy(usb_dev); 194 194 195 195 return ret; … … 238 238 */ 239 239 int usb_device_select_interface(usb_device_t *dev, uint8_t alternate_setting, 240 constusb_endpoint_description_t **endpoints)240 usb_endpoint_description_t **endpoints) 241 241 { 242 242 if (dev->interface_no < 0) { … … 321 321 */ 322 322 int usb_device_create_pipes(const ddf_dev_t *dev, usb_device_connection_t *wire, 323 constusb_endpoint_description_t **endpoints,323 usb_endpoint_description_t **endpoints, 324 324 const uint8_t *config_descr, size_t config_descr_size, 325 325 int interface_no, int interface_setting, … … 526 526 */ 527 527 int usb_device_create(ddf_dev_t *ddf_dev, 528 constusb_endpoint_description_t **endpoints,528 usb_endpoint_description_t **endpoints, 529 529 usb_device_t **dev_ptr, const char **errstr_ptr) 530 530 { … … 590 590 /** Destroy instance of a USB device. 591 591 * 592 * @param dev Device to be de-initialized. 593 * 594 * Does not free/destroy supplied pointer. 595 */ 596 void usb_device_deinit(usb_device_t *dev) 592 * @param dev Device to be destroyed. 593 */ 594 void usb_device_destroy(usb_device_t *dev) 597 595 { 598 596 if (dev == NULL) { -
uspace/lib/usbhid/include/usb/hid/hiddescriptor.h
r22ceff3a r25696fea 42 42 #include <usb/hid/hidtypes.h> 43 43 44 int usb_hid_parse_report_descriptor(usb_hid_report_t *report, 44 int usb_hid_parse_report_descriptor(usb_hid_report_t *report, 45 45 const uint8_t *data, size_t size); 46 47 void usb_hid_free_report(usb_hid_report_t *report); 46 48 47 49 void usb_hid_descriptor_print(usb_hid_report_t *report); 48 50 49 51 int usb_hid_report_init(usb_hid_report_t *report); 50 51 void usb_hid_report_deinit(usb_hid_report_t *report);52 52 53 53 int usb_hid_report_append_fields(usb_hid_report_t *report, -
uspace/lib/usbhid/src/hiddescriptor.c
r22ceff3a r25696fea 1016 1016 * @return void 1017 1017 */ 1018 void usb_hid_ report_deinit(usb_hid_report_t *report)1018 void usb_hid_free_report(usb_hid_report_t *report) 1019 1019 { 1020 1020 if(report == NULL){
Note:
See TracChangeset
for help on using the changeset viewer.