Changes in / [25696fea:22ceff3a] in mainline
- Location:
- uspace
- Files:
-
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/mkbd/main.c
r25696fea r22ceff3a 69 69 int rc = usb_hid_report_init(*report); 70 70 if (rc != EOK) { 71 usb_hid_ free_report(*report);71 usb_hid_report_deinit(*report); 72 72 *report = NULL; 73 73 return rc; … … 79 79 &report_desc_size); 80 80 if (rc != EOK) { 81 usb_hid_ free_report(*report);81 usb_hid_report_deinit(*report); 82 82 *report = NULL; 83 83 return rc; … … 85 85 86 86 if (report_desc_size == 0) { 87 usb_hid_ free_report(*report);87 usb_hid_report_deinit(*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_ free_report(*report);95 usb_hid_report_deinit(*report); 96 96 *report = NULL; 97 97 return ENOMEM; … … 103 103 &actual_size); 104 104 if (rc != EOK) { 105 usb_hid_ free_report(*report);105 usb_hid_report_deinit(*report); 106 106 *report = NULL; 107 107 free(desc); … … 110 110 111 111 if (actual_size != report_desc_size) { 112 usb_hid_ free_report(*report);112 usb_hid_report_deinit(*report); 113 113 *report = NULL; 114 114 free(desc); -
uspace/app/usbinfo/hid.c
r25696fea r22ceff3a 167 167 168 168 free(raw_report); 169 usb_hid_ free_report(&report);169 usb_hid_report_deinit(&report); 170 170 } 171 171 -
uspace/drv/bus/usb/ohci/endpoint_list.c
r25696fea r22ceff3a 60 60 name, instance->list_head, instance->list_head_pa); 61 61 62 ed_init(instance->list_head, NULL );62 ed_init(instance->list_head, NULL, NULL); 63 63 list_initialize(&instance->endpoint_list); 64 64 fibril_mutex_initialize(&instance->guard); -
uspace/drv/bus/usb/ohci/hc.c
r25696fea r22ceff3a 565 565 566 566 /*Init HCCA */ 567 instance->hcca = malloc32(sizeof(hcca_t));567 instance->hcca = hcca_get(); 568 568 if (instance->hcca == NULL) 569 569 return ENOMEM; -
uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c
r25696fea r22ceff3a 34 34 #include "endpoint_descriptor.h" 35 35 36 static unsigned direc[3] = 37 { ED_STATUS_D_IN, ED_STATUS_D_OUT, ED_STATUS_D_TRANSFER }; 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 }; 38 42 39 void ed_init(ed_t *instance, endpoint_t *ep) 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) 40 53 { 41 54 assert(instance); 42 55 bzero(instance, sizeof(ed_t)); 56 43 57 if (ep == NULL) { 58 /* Mark as dead, used for dummy EDs at the beginning of 59 * endpoint lists. */ 44 60 instance->status = ED_STATUS_K_FLAG; 45 61 return; 46 62 } 47 assert(ep); 63 /* Non-dummy ED must have TD assigned */ 64 assert(td); 65 66 /* Status: address, endpoint nr, direction mask and max packet size. */ 48 67 instance->status = 0 49 68 | ((ep->address & ED_STATUS_FA_MASK) << ED_STATUS_FA_SHIFT) 50 69 | ((ep->endpoint & ED_STATUS_EN_MASK) << ED_STATUS_EN_SHIFT) 51 | ((dir ec[ep->direction] & ED_STATUS_D_MASK) << ED_STATUS_D_SHIFT)70 | ((dir[ep->direction] & ED_STATUS_D_MASK) << ED_STATUS_D_SHIFT) 52 71 | ((ep->max_packet_size & ED_STATUS_MPS_MASK) 53 72 << ED_STATUS_MPS_SHIFT); 54 73 55 74 /* Low speed flag */ 56 75 if (ep->speed == USB_SPEED_LOW) 57 76 instance->status |= ED_STATUS_S_FLAG; 77 78 /* Isochronous format flag */ 58 79 if (ep->transfer_type == USB_TRANSFER_ISOCHRONOUS) 59 80 instance->status |= ED_STATUS_F_FLAG; 60 81 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 */ 61 88 if (ep->toggle) 62 89 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY; 90 63 91 } 64 92 /** -
uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.h
r25696fea r22ceff3a 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 */ 47 51 typedef struct ed { 52 /** 53 * Status field. 54 * 55 * See table 4-1, p. 17 OHCI spec (pdf page 31). 56 */ 48 57 volatile uint32_t status; 49 58 #define ED_STATUS_FA_MASK (0x7f) /* USB device address */ … … 51 60 #define ED_STATUS_EN_MASK (0xf) /* USB endpoint address */ 52 61 #define ED_STATUS_EN_SHIFT (7) 53 #define ED_STATUS_D_MASK (0x3) /* direction */62 #define ED_STATUS_D_MASK (0x3) /* Direction */ 54 63 #define ED_STATUS_D_SHIFT (11) 55 64 #define ED_STATUS_D_OUT (0x1) 56 65 #define ED_STATUS_D_IN (0x2) 57 #define ED_STATUS_D_T RANSFER (0x3)66 #define ED_STATUS_D_TD (0x3) /* Direction is specified by TD */ 58 67 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*/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 */ 63 72 #define ED_STATUS_MPS_SHIFT (16) 64 73 74 /** 75 * Pointer to the last TD. 76 * 77 * OHCI hw never changes this field and uses it only for a reference. 78 */ 65 79 volatile uint32_t td_tail; 66 80 #define ED_TDTAIL_PTR_MASK (0xfffffff0) 67 81 #define ED_TDTAIL_PTR_SHIFT (0) 68 82 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 TD 88 * to be executed. 89 */ 69 90 volatile uint32_t td_head; 70 91 #define ED_TDHEAD_PTR_MASK (0xfffffff0) … … 75 96 #define ED_TDHEAD_HALTED_FLAG (0x1) 76 97 98 /** 99 * Pointer to the next ED. 100 * 101 * Driver should not change this field on active EDs. 102 */ 77 103 volatile uint32_t next; 78 104 #define ED_NEXT_PTR_MASK (0xfffffff0) … … 80 106 } __attribute__((packed)) ed_t; 81 107 82 void ed_init(ed_t *instance, endpoint_t *ep);108 void ed_init(ed_t *instance, const endpoint_t *ep, const td_t *td); 83 109 84 static inline void ed_set_td(ed_t *instance, td_t *td) 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) 85 116 { 86 117 assert(instance); 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)); 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); 91 143 instance->td_tail = pa & ED_TDTAIL_PTR_MASK; 92 144 } 93 145 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) 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) 102 152 { 103 153 assert(instance); 104 154 assert(next); 105 uint32_t pa = addr_to_phys(next);155 const uint32_t pa = addr_to_phys(next); 106 156 assert((pa & ED_NEXT_PTR_MASK) << ED_NEXT_PTR_SHIFT == pa); 107 157 instance->next = pa; 108 158 } 109 159 110 static inline int ed_toggle_get(ed_t *instance) 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) 111 166 { 112 167 assert(instance); … … 114 169 } 115 170 116 static inline void ed_toggle_set(ed_t *instance, int toggle) 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) 117 177 { 118 178 assert(instance); 119 assert(toggle == 0 || toggle == 1); 120 if (toggle == 1) { 179 if (toggle) { 121 180 instance->td_head |= ED_TDHEAD_TOGGLE_CARRY; 122 181 } else { 123 /* clear halted flag when reseting toggle*/182 /* Clear halted flag when reseting toggle TODO: Why? */ 124 183 instance->td_head &= ~ED_TDHEAD_TOGGLE_CARRY; 125 184 instance->td_head &= ~ED_TDHEAD_HALTED_FLAG; -
uspace/drv/bus/usb/ohci/hw_struct/hcca.h
r25696fea r22ceff3a 36 36 37 37 #include <stdint.h> 38 #include <malloc.h> 38 39 39 40 /** Host controller communication area. … … 48 49 } __attribute__((packed, aligned)) hcca_t; 49 50 51 static inline void * hcca_get(void) 52 { 53 assert(sizeof(hcca_t) == 256); 54 return memalign(256, sizeof(hcca_t)); 55 } 50 56 #endif 51 57 /** -
uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.c
r25696fea r22ceff3a 35 35 #include "transfer_descriptor.h" 36 36 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 }; 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 }; 40 43 41 void td_init(td_t *instance, 42 usb_direction_t dir, const void *buffer, size_t size, int toggle) 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) 43 56 { 44 57 assert(instance); 45 58 bzero(instance, sizeof(td_t)); 59 /* Set PID and Error code */ 46 60 instance->status = 0 47 | ((d p[dir] & TD_STATUS_DP_MASK) << TD_STATUS_DP_SHIFT)61 | ((dir[direction] & TD_STATUS_DP_MASK) << TD_STATUS_DP_SHIFT) 48 62 | ((CC_NOACCESS2 & TD_STATUS_CC_MASK) << TD_STATUS_CC_SHIFT); 63 49 64 if (toggle == 0 || toggle == 1) { 50 instance->status |= togg[toggle] << TD_STATUS_T_SHIFT; 65 /* Set explicit toggle bit */ 66 instance->status |= TD_STATUS_T_USE_TD_FLAG; 67 instance->status |= toggle ? TD_STATUS_T_FLAG : 0; 51 68 } 69 70 /* Alow less data on input. */ 52 71 if (dir == USB_DIRECTION_IN) { 53 72 instance->status |= TD_STATUS_ROUND_FLAG; 54 73 } 74 55 75 if (buffer != NULL) { 56 76 assert(size != 0); … … 58 78 instance->be = addr_to_phys(buffer + size - 1); 59 79 } 80 81 instance->next = addr_to_phys(next) & TD_NEXT_PTR_MASK; 82 60 83 } 61 84 /** -
uspace/drv/bus/usb/ohci/hw_struct/transfer_descriptor.h
r25696fea r22ceff3a 37 37 #include <bool.h> 38 38 #include <stdint.h> 39 39 40 #include "../utils/malloc32.h" 40 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 19 52 * (pdf page 33) for details. 53 */ 48 54 typedef struct td { 55 /** Status field. Do not touch on active TDs. */ 49 56 volatile uint32_t status; 50 57 #define TD_STATUS_ROUND_FLAG (1 << 18) 51 #define TD_STATUS_DP_MASK (0x3) /* direction/PID */58 #define TD_STATUS_DP_MASK (0x3) /* Direction/PID */ 52 59 #define TD_STATUS_DP_SHIFT (19) 53 60 #define TD_STATUS_DP_SETUP (0x0) 54 61 #define TD_STATUS_DP_OUT (0x1) 55 62 #define TD_STATUS_DP_IN (0x2) 56 #define TD_STATUS_DI_MASK (0x7) /* delay interrupt, wait DI frames before int*/63 #define TD_STATUS_DI_MASK (0x7) /* Delay interrupt, wait n frames before irq */ 57 64 #define TD_STATUS_DI_SHIFT (21) 58 65 #define TD_STATUS_DI_NO_INTERRUPT (0x7) 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 */ 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 */ 65 69 #define TD_STATUS_EC_SHIFT (26) 66 #define TD_STATUS_CC_MASK (0xf) /* condition code */70 #define TD_STATUS_CC_MASK (0xf) /* Condition code */ 67 71 #define TD_STATUS_CC_SHIFT (28) 68 72 69 volatile uint32_t cbp; /* current buffer ptr, data to be transfered */ 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. */ 70 79 volatile uint32_t next; 71 80 #define TD_NEXT_PTR_MASK (0xfffffff0) 72 81 #define TD_NEXT_PTR_SHIFT (0) 73 82 74 volatile uint32_t be; /* buffer end, address of the last byte */ 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; 75 89 } __attribute__((packed)) td_t; 76 90 77 void td_init(td_t *instance, 91 void td_init(td_t *instance, const td_t *next, 78 92 usb_direction_t dir, const void *buffer, size_t size, int toggle); 79 93 80 inline static void td_set_next(td_t *instance, td_t *next) 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) 81 100 { 82 101 assert(instance); 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 */ 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) */ 91 107 if (cc != CC_NOACCESS1 && cc != CC_NOACCESS2) { 92 return true;93 }94 /* everything done */95 if (cc == CC_NOERROR && instance->cbp == 0) {96 108 return true; 97 109 } … … 99 111 } 100 112 101 static inline int td_error(td_t *instance) 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) 102 119 { 103 120 assert(instance); 104 int cc = (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 121 const int cc = 122 (instance->status >> TD_STATUS_CC_SHIFT) & TD_STATUS_CC_MASK; 105 123 return cc_to_rc(cc); 106 124 } 107 125 126 /** 127 * Get remaining portion of buffer to be read/written 128 * @param instance TD structure 129 * @return size of remaining buffer. 130 */ 108 131 static inline size_t td_remain_size(td_t *instance) 109 132 { 110 133 assert(instance); 134 /* Current buffer pointer is cleared on successful transfer */ 111 135 if (instance->cbp == 0) 112 136 return 0; 137 /* Buffer end points to the last byte of transfer buffer, so add 1 */ 113 138 return instance->be - instance->cbp + 1; 114 139 } -
uspace/drv/bus/usb/ohci/ohci_batch.c
r25696fea r22ceff3a 163 163 ohci_batch->ed->td_tail, ohci_batch->ed->next); 164 164 165 size_t i = 0; 166 for (; i < ohci_batch->td_count; ++i) { 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) { 167 180 assert(ohci_batch->tds[i] != NULL); 168 181 usb_log_debug("TD %zu: %08x:%08x:%08x:%08x.\n", i, 169 182 ohci_batch->tds[i]->status, ohci_batch->tds[i]->cbp, 170 183 ohci_batch->tds[i]->next, ohci_batch->tds[i]->be); 171 if (!td_is_finished(ohci_batch->tds[i])) { 172 return false; 173 } 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 174 199 ohci_batch->usb_batch->error = td_error(ohci_batch->tds[i]); 175 200 if (ohci_batch->usb_batch->error != EOK) { … … 177 202 ohci_batch->usb_batch, i, 178 203 ohci_batch->tds[i]->status); 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; 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; 184 227 break; 185 228 } 186 229 } 187 188 assert(i <= ohci_batch->td_count);189 ohci_batch->leave_td = i; 190 230 assert(ohci_batch->usb_batch->transfered_size <= 231 ohci_batch->usb_batch->buffer_size); 232 233 /* Store the remaining TD */ 191 234 ohci_endpoint_t *ohci_ep = ohci_endpoint_get(ohci_batch->usb_batch->ep); 192 235 assert(ohci_ep); 193 236 ohci_ep->td = ohci_batch->tds[ohci_batch->leave_td]; 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 */ 237 238 /* Make sure that we are leaving the right TD behind */ 205 239 const uint32_t pa = addr_to_phys(ohci_ep->td); 206 240 assert(pa == (ohci_batch->ed->td_head & ED_TDHEAD_PTR_MASK)); … … 217 251 { 218 252 assert(ohci_batch); 219 ed_set_ end_td(ohci_batch->ed, ohci_batch->tds[ohci_batch->td_count]);253 ed_set_tail_td(ohci_batch->ed, ohci_batch->tds[ohci_batch->td_count]); 220 254 } 221 255 /*----------------------------------------------------------------------------*/ … … 247 281 const usb_direction_t status_dir = reverse_dir[dir]; 248 282 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]);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); 253 287 usb_log_debug("Created CONTROL SETUP TD: %08x:%08x:%08x:%08x.\n", 254 288 ohci_batch->tds[0]->status, ohci_batch->tds[0]->cbp, … … 256 290 buffer += ohci_batch->usb_batch->setup_size; 257 291 258 /* data stage */292 /* Data stage */ 259 293 size_t td_current = 1; 260 294 size_t remain_size = ohci_batch->usb_batch->buffer_size; … … 265 299 toggle = 1 - toggle; 266 300 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]); 301 td_init(ohci_batch->tds[td_current], 302 ohci_batch->tds[td_current + 1], 303 data_dir, buffer, transfer_size, toggle); 271 304 usb_log_debug("Created CONTROL DATA TD: %08x:%08x:%08x:%08x.\n", 272 305 ohci_batch->tds[td_current]->status, … … 281 314 } 282 315 283 /* status stage */316 /* Status stage */ 284 317 assert(td_current == ohci_batch->td_count - 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]); 318 td_init(ohci_batch->tds[td_current], ohci_batch->tds[td_current + 1], 319 status_dir, NULL, 0, 1); 288 320 usb_log_debug("Created CONTROL STATUS TD: %08x:%08x:%08x:%08x.\n", 289 321 ohci_batch->tds[td_current]->status, … … 323 355 ? OHCI_TD_MAX_TRANSFER : remain_size; 324 356 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]); 357 td_init( 358 ohci_batch->tds[td_current], ohci_batch->tds[td_current + 1], 359 dir, buffer, transfer_size, -1); 329 360 330 361 usb_log_debug("Created DATA TD: %08x:%08x:%08x:%08x.\n", -
uspace/drv/bus/usb/ohci/ohci_endpoint.c
r25696fea r22ceff3a 102 102 } 103 103 104 ed_init(ohci_ep->ed, ep); 105 ed_set_td(ohci_ep->ed, ohci_ep->td); 104 ed_init(ohci_ep->ed, ep, ohci_ep->td); 106 105 endpoint_set_hc_data( 107 106 ep, ohci_ep, ohci_endpoint_fini, ohci_ep_toggle_get, ohci_ep_toggle_set); -
uspace/drv/bus/usb/ohci/root_hub.c
r25696fea r22ceff3a 35 35 #include <errno.h> 36 36 #include <str_error.h> 37 #include <fibril_synch.h> 37 38 38 39 #include <usb/debug.h> 40 #include <usb/dev/request.h> 41 #include <usb/classes/hub.h> 39 42 40 43 #include "root_hub.h" … … 43 46 #include <usb/dev/driver.h> 44 47 #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(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); 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); 117 119 static int control_request(rh_t *instance, usb_transfer_batch_t *request); 118 120 static inline void interrupt_request( … … 153 155 instance->unfinished_interrupt_transfer = NULL; 154 156 155 #if defOHCI_POWER_SWITCH_no157 #if defined OHCI_POWER_SWITCH_no 156 158 /* Set port power mode to no power-switching. (always on) */ 157 159 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 160 158 161 /* Set to no over-current reporting */ 159 162 instance->registers->rh_desc_a |= RHDA_NOCP_FLAG; 163 160 164 #elif defined OHCI_POWER_SWITCH_ganged 161 165 /* Set port power mode to no ganged power-switching. */ … … 163 167 instance->registers->rh_desc_a &= ~RHDA_PSM_FLAG; 164 168 instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER; 169 165 170 /* Set to global over-current */ 166 171 instance->registers->rh_desc_a &= ~RHDA_NOCP_FLAG; … … 174 179 instance->registers->rh_desc_b &= (RHDB_PCC_MASK << RHDB_PCC_SHIFT); 175 180 instance->registers->rh_status = RHS_CLEAR_GLOBAL_POWER; 181 176 182 /* Return control to per port state */ 177 183 instance->registers->rh_desc_b |= 178 184 ((1 << (instance->port_count + 1)) - 1) << RHDB_PCC_SHIFT; 185 179 186 /* Set per port over-current */ 180 187 instance->registers->rh_desc_a &= ~RHDA_NOCP_FLAG; … … 182 189 #endif 183 190 191 fibril_mutex_initialize(&instance->guard); 184 192 rh_init_descriptors(instance); 185 193 … … 209 217 case USB_TRANSFER_INTERRUPT: 210 218 usb_log_debug("Root hub got INTERRUPT packet\n"); 219 fibril_mutex_lock(&instance->guard); 220 assert(instance->unfinished_interrupt_transfer == NULL); 211 221 const uint16_t mask = create_interrupt_mask(instance); 212 222 if (mask == 0) { 213 223 usb_log_debug("No changes..\n"); 214 assert(instance->unfinished_interrupt_transfer == NULL);215 224 instance->unfinished_interrupt_transfer = request; 225 fibril_mutex_unlock(&instance->guard); 216 226 return; 217 227 } 218 228 usb_log_debug("Processing changes...\n"); 219 229 interrupt_request(request, mask, instance->interrupt_mask_size); 230 fibril_mutex_unlock(&instance->guard); 220 231 break; 221 232 … … 237 248 assert(instance); 238 249 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; 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); 249 261 } 250 262 /*----------------------------------------------------------------------------*/ … … 342 354 * @return Mask of changes. 343 355 */ 344 uint16_t create_interrupt_mask( rh_t *instance)356 uint16_t create_interrupt_mask(const rh_t *instance) 345 357 { 346 358 assert(instance); … … 372 384 * @return error code 373 385 */ 374 int get_status( rh_t *instance, usb_transfer_batch_t *request)386 int get_status(const rh_t *instance, usb_transfer_batch_t *request) 375 387 { 376 388 assert(instance); … … 418 430 * @return Error code 419 431 */ 420 int get_descriptor( rh_t *instance, usb_transfer_batch_t *request)432 int get_descriptor(const rh_t *instance, usb_transfer_batch_t *request) 421 433 { 422 434 assert(instance); … … 496 508 * @return error code 497 509 */ 498 int set_feature_port( rh_t *instance, uint16_t feature, uint16_t port)510 int set_feature_port(const rh_t *instance, uint16_t feature, uint16_t port) 499 511 { 500 512 assert(instance); … … 535 547 * @return error code 536 548 */ 537 int clear_feature_port( rh_t *instance, uint16_t feature, uint16_t port)549 int clear_feature_port(const rh_t *instance, uint16_t feature, uint16_t port) 538 550 { 539 551 assert(instance); … … 592 604 * @return error code 593 605 */ 594 int set_feature( rh_t *instance, usb_transfer_batch_t *request)606 int set_feature(const rh_t *instance, usb_transfer_batch_t *request) 595 607 { 596 608 assert(instance); … … 628 640 * @return error code 629 641 */ 630 int clear_feature( rh_t *instance, usb_transfer_batch_t *request)642 int clear_feature(const rh_t *instance, usb_transfer_batch_t *request) 631 643 { 632 644 assert(instance); … … 635 647 const usb_device_request_setup_packet_t *setup_request = 636 648 (usb_device_request_setup_packet_t *) request->setup_buffer; 649 637 650 request->transfered_size = 0; 651 638 652 switch (setup_request->request_type) 639 653 { … … 647 661 /* 648 662 * Chapter 11.16.2 specifies that only C_HUB_LOCAL_POWER and 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 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 651 666 * as root hubs do not support local power status feature. 652 667 * (OHCI pg. 127) */ … … 720 735 "additional data\n"); 721 736 return clear_feature(instance, request); 737 722 738 case USB_DEVREQ_SET_FEATURE: 723 739 usb_log_debug2("Processing request without " -
uspace/drv/bus/usb/ohci/root_hub.h
r25696fea r22ceff3a 47 47 */ 48 48 typedef struct rh { 49 fibril_mutex_t guard; 49 50 /** pointer to ohci driver registers */ 50 51 ohci_regs_t *registers; -
uspace/drv/bus/usb/ohci/utils/malloc32.h
r25696fea r22ceff3a 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 32 48 43 49 /** Get physical address translation 44 50 * … … 62 68 */ 63 69 static inline void * malloc32(size_t size) 64 { return memalign( size, size); }70 { return memalign(OHCI_ALIGN, size); } 65 71 /*----------------------------------------------------------------------------*/ 66 72 /** Physical mallocator simulator -
uspace/drv/bus/usb/usbhid/generic/hiddev.c
r25696fea r22ceff3a 48 48 /*----------------------------------------------------------------------------*/ 49 49 50 usb_endpoint_description_t usb_hid_generic_poll_endpoint_description = {50 const 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
r25696fea r22ceff3a 41 41 struct usb_hid_dev; 42 42 43 usb_endpoint_description_t usb_hid_generic_poll_endpoint_description; 43 extern const usb_endpoint_description_t 44 usb_hid_generic_poll_endpoint_description; 44 45 45 46 const char *HID_GENERIC_FUN_NAME; -
uspace/drv/bus/usb/usbhid/kbd/kbddev.c
r25696fea r22ceff3a 88 88 89 89 /** Keyboard polling endpoint description for boot protocol class. */ 90 usb_endpoint_description_t usb_hid_kbd_poll_endpoint_description = {90 const 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( hid_dev->report, field,261 kbd_dev->led_path,262 263 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 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);435 434 assert(hid_dev != NULL); 436 435 assert(kbd_dev != NULL); … … 444 443 445 444 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 446 hid_dev->report, NULL, path,447 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 445 &hid_dev->report, NULL, path, 446 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 448 447 USB_HID_REPORT_TYPE_INPUT); 449 448 unsigned i = 0; … … 454 453 455 454 assert(i < kbd_dev->key_count); 456 455 457 456 // save the key usage 458 457 if (field->value != 0) { … … 463 462 } 464 463 usb_log_debug2("Saved %u. key usage %d\n", i, kbd_dev->keys[i]); 465 464 466 465 ++i; 467 field = usb_hid_report_get_sibling( hid_dev->report, field, path,468 USB_HID_PATH_COMPARE_END469 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY,466 field = usb_hid_report_get_sibling( 467 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END 468 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 470 469 USB_HID_REPORT_TYPE_INPUT); 471 470 } … … 616 615 617 616 kbd_dev->key_count = usb_hid_report_size( 618 hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT);617 &hid_dev->report, 0, USB_HID_REPORT_TYPE_INPUT); 619 618 usb_hid_report_path_free(path); 620 619 621 620 usb_log_debug("Size of the input report: %zu\n", kbd_dev->key_count); 622 621 623 kbd_dev->keys = (int32_t *)calloc(kbd_dev->key_count, sizeof(int32_t));622 kbd_dev->keys = calloc(kbd_dev->key_count, sizeof(int32_t)); 624 623 625 624 if (kbd_dev->keys == NULL) { … … 643 642 */ 644 643 kbd_dev->output_size = 0; 645 kbd_dev->output_buffer = usb_hid_report_output( hid_dev->report,644 kbd_dev->output_buffer = usb_hid_report_output(&hid_dev->report, 646 645 &kbd_dev->output_size, 0); 647 646 if (kbd_dev->output_buffer == NULL) { … … 657 656 kbd_dev->led_path, USB_HIDUT_PAGE_LED, 0); 658 657 659 kbd_dev->led_output_size = usb_hid_report_size( hid_dev->report,660 0, USB_HID_REPORT_TYPE_OUTPUT);658 kbd_dev->led_output_size = usb_hid_report_size( 659 &hid_dev->report, 0, USB_HID_REPORT_TYPE_OUTPUT); 661 660 662 661 usb_log_debug("Output report size (in items): %zu\n", … … 826 825 int usb_kbd_set_boot_protocol(usb_hid_dev_t *hid_dev) 827 826 { 828 int rc = usb_hid_parse_report_descriptor( hid_dev->report,829 USB_KBD_BOOT_REPORT_DESCRIPTOR,827 int rc = usb_hid_parse_report_descriptor( 828 &hid_dev->report, USB_KBD_BOOT_REPORT_DESCRIPTOR, 830 829 USB_KBD_BOOT_REPORT_DESCRIPTOR_SIZE); 831 830 … … 836 835 } 837 836 838 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 837 rc = usbhid_req_set_protocol(&hid_dev->usb_dev->ctrl_pipe, 839 838 hid_dev->usb_dev->interface_no, USB_HID_PROTOCOL_BOOT); 840 839 -
uspace/drv/bus/usb/usbhid/kbd/kbddev.h
r25696fea r22ceff3a 118 118 /*----------------------------------------------------------------------------*/ 119 119 120 usb_endpoint_description_t usb_hid_kbd_poll_endpoint_description;120 extern const 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
r25696fea r22ceff3a 92 92 if (rc != EOK) { 93 93 usb_log_error("Failed to initialize USB/HID device.\n"); 94 usb_hid_de stroy(hid_dev);94 usb_hid_deinit(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 stroy(hid_dev);130 usb_hid_deinit(hid_dev); 131 131 return rc; 132 132 } 133 133 hid_dev->running = true; 134 dev->driver_data = hid_dev;135 134 136 135 /* … … 204 203 205 204 assert(!hid_dev->running); 206 usb_hid_de stroy(hid_dev);205 usb_hid_deinit(hid_dev); 207 206 usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name); 208 207 return EOK; -
uspace/drv/bus/usb/usbhid/mouse/mousedev.c
r25696fea r22ceff3a 59 59 /*----------------------------------------------------------------------------*/ 60 60 61 usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description = {61 const 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 = async_exchange_begin(mouse_dev->mouse_sess); 277 async_exch_t *exch = 278 async_exchange_begin(mouse_dev->mouse_sess); 278 279 async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y); 279 280 async_exchange_end(exch); … … 291 292 292 293 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 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); 294 &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 295 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 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 = usb_mouse_get_highest_button(hid_dev->report,477 hid_dev->report_id) + 1;476 mouse_dev->buttons_count = 1 + usb_mouse_get_highest_button( 477 &hid_dev->report, hid_dev->report_id); 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( hid_dev->report,535 USB_MOUSE_BOOT_REPORT_DESCRIPTOR,534 int rc = usb_hid_parse_report_descriptor( 535 &hid_dev->report, 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
r25696fea r22ceff3a 63 63 /*----------------------------------------------------------------------------*/ 64 64 65 usb_endpoint_description_t usb_hid_mouse_poll_endpoint_description;65 extern const 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
r25696fea r22ceff3a 161 161 /*----------------------------------------------------------------------------*/ 162 162 163 static int usb_multimedia_create_function(usb_hid_dev_t *hid_dev, 164 usb_multimedia_t *multim_dev) 165 { 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 166 171 /* Create the exposed function. */ 167 ddf_fun_t *fun = ddf_fun_create( hid_dev->usb_dev->ddf_dev, fun_exposed,168 NAME);172 ddf_fun_t *fun = ddf_fun_create( 173 hid_dev->usb_dev->ddf_dev, fun_exposed, NAME); 169 174 if (fun == NULL) { 170 175 usb_log_error("Could not create DDF function node.\n"); … … 173 178 174 179 fun->ops = &multimedia_ops; 175 fun->driver_data = multim_dev; // TODO: maybe change to hid_dev->data 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? 176 192 177 193 int rc = ddf_fun_bind(fun); … … 194 210 return rc; 195 211 } 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 212 213 /* Save the KBD device structure into the HID device structure. */ 222 214 *data = multim_dev; 223 215 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 230 216 usb_log_debug(NAME " HID/multimedia structure initialized.\n"); 231 232 217 return EOK; 233 218 } … … 272 257 273 258 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 274 hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END275 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 259 &hid_dev->report, NULL, path, USB_HID_PATH_COMPARE_END 260 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 276 261 USB_HID_REPORT_TYPE_INPUT); 277 262 … … 293 278 294 279 field = usb_hid_report_get_sibling( 295 hid_dev->report, field, path, USB_HID_PATH_COMPARE_END280 &hid_dev->report, field, path, USB_HID_PATH_COMPARE_END 296 281 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 297 282 USB_HID_REPORT_TYPE_INPUT); -
uspace/drv/bus/usb/usbhid/subdrivers.c
r25696fea r22ceff3a 42 42 #include "generic/hiddev.h" 43 43 44 static usb_hid_subdriver_usage_t path_kbd[] = {45 {USB_HIDUT_PAGE_GENERIC_DESKTOP, 46 USB_HIDUT_USAGE_GENERIC_DESKTOP_KEYBOARD}, 44 static const 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 usb_hid_subdriver_usage_t path_mouse[] = {50 static const 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 usb_hid_subdriver_usage_t multim_key_path[] = {55 static const 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 74 73 }, 75 74 { … … 102 101 }; 103 102 103 const int USB_HID_MAX_SUBDRIVERS = 104 sizeof(usb_hid_subdrivers) / sizeof(usb_hid_subdrivers[0]); 105 104 106 /** 105 107 * @} -
uspace/drv/bus/usb/usbhid/subdrivers.h
r25696fea r22ceff3a 78 78 79 79 /** Subdriver for controlling this device. */ 80 usb_hid_subdriver_t subdriver;80 const 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; 86 87 87 88 /*----------------------------------------------------------------------------*/ -
uspace/drv/bus/usb/usbhid/usbhid.c
r25696fea r22ceff3a 54 54 55 55 /* Array of endpoints expected on the device, NULL terminated. */ 56 usb_endpoint_description_t *usb_hid_endpoints[] = {56 const 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 65 63 /*----------------------------------------------------------------------------*/ 66 64 67 65 static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev) 68 66 { 69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0);70 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 72 67 assert(hid_dev != NULL); 68 assert(hid_dev->subdriver_count == 0); 69 70 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 73 71 if (hid_dev->subdrivers == NULL) { 74 72 return ENOMEM; 75 73 } 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; 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; 94 77 95 78 return EOK; … … 100 83 static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev) 101 84 { 102 assert(hid_dev != NULL && hid_dev->subdriver_count == 0);103 104 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 105 85 assert(hid_dev != NULL); 86 assert(hid_dev->subdriver_count == 0); 87 88 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 106 89 if (hid_dev->subdrivers == NULL) { 107 90 return ENOMEM; 108 91 } 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; 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; 127 95 128 96 return EOK; … … 135 103 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 136 104 137 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( 138 sizeof(usb_hid_subdriver_t)); 105 hid_dev->subdrivers = malloc(sizeof(usb_hid_subdriver_t)); 139 106 if (hid_dev->subdrivers == NULL) { 140 107 return ENOMEM; 141 108 } 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; 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; 162 116 163 117 return EOK; … … 166 120 /*----------------------------------------------------------------------------*/ 167 121 168 static bool usb_hid_ids_match( usb_hid_dev_t *hid_dev,122 static bool usb_hid_ids_match(const usb_hid_dev_t *hid_dev, 169 123 const usb_hid_subdriver_mapping_t *mapping) 170 124 { … … 172 126 assert(hid_dev->usb_dev != NULL); 173 127 174 return (hid_dev->usb_dev->descriptors.device.vendor_id 128 return (hid_dev->usb_dev->descriptors.device.vendor_id 175 129 == mapping->vendor_id 176 130 && hid_dev->usb_dev->descriptors.device.product_id … … 180 134 /*----------------------------------------------------------------------------*/ 181 135 182 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 136 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 183 137 const usb_hid_subdriver_mapping_t *mapping) 184 138 { … … 192 146 } 193 147 int i = 0; 194 while (mapping->usage_path[i].usage != 0 148 while (mapping->usage_path[i].usage != 0 195 149 || mapping->usage_path[i].usage_page != 0) { 196 if (usb_hid_report_path_append_item(usage_path, 197 mapping->usage_path[i].usage_page, 150 if (usb_hid_report_path_append_item(usage_path, 151 mapping->usage_path[i].usage_page, 198 152 mapping->usage_path[i].usage) != EOK) { 199 153 usb_log_debug("Failed to append to usage path.\n"); … … 204 158 } 205 159 206 assert(hid_dev->report != NULL);207 208 160 usb_log_debug("Compare flags: %d\n", mapping->compare); 209 161 … … 213 165 do { 214 166 usb_log_debug("Trying report id %u\n", report_id); 215 167 216 168 if (report_id != 0) { 217 169 usb_hid_report_path_set_report_id(usage_path, … … 220 172 221 173 usb_hid_report_field_t *field = usb_hid_report_get_sibling( 222 hid_dev->report, 223 NULL, usage_path, mapping->compare, 174 &hid_dev->report, NULL, usage_path, mapping->compare, 224 175 USB_HID_REPORT_TYPE_INPUT); 225 176 226 177 usb_log_debug("Field: %p\n", field); 227 178 … … 230 181 break; 231 182 } 232 183 233 184 report_id = usb_hid_get_next_report_id( 234 hid_dev->report, report_id, 235 USB_HID_REPORT_TYPE_INPUT); 185 &hid_dev->report, report_id, USB_HID_REPORT_TYPE_INPUT); 236 186 } while (!matches && report_id != 0); 237 187 … … 243 193 /*----------------------------------------------------------------------------*/ 244 194 245 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 195 static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev, 246 196 const usb_hid_subdriver_t **subdrivers, int count) 247 197 { … … 254 204 } 255 205 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)); 206 /* +1 for generic hid subdriver */ 207 hid_dev->subdrivers = calloc((count + 1), sizeof(usb_hid_subdriver_t)); 260 208 if (hid_dev->subdrivers == NULL) { 261 209 return ENOMEM; … … 269 217 } 270 218 219 /* Add one generic HID subdriver per device */ 271 220 hid_dev->subdrivers[count].init = usb_generic_hid_init; 272 221 hid_dev->subdrivers[count].poll = usb_generic_hid_polling_callback; … … 307 256 return EINVAL; 308 257 } 309 258 310 259 ids_matched = false; 311 260 matched = false; 312 261 313 262 if (mapping->vendor_id >= 0) { 314 263 assert(mapping->product_id >= 0); … … 321 270 } 322 271 } 323 272 324 273 if (mapping->usage_path != NULL) { 325 274 usb_log_debug("Comparing device against usage path.\n"); … … 332 281 matched = ids_matched; 333 282 } 334 283 335 284 if (matched) { 336 285 usb_log_debug("Subdriver matched.\n"); 337 286 subdrivers[count++] = &mapping->subdriver; 338 287 } 339 288 340 289 mapping = &usb_hid_subdrivers[++i]; 341 290 } 342 291 343 // we have all subdrivers determined, save them into the hid device 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? 344 295 return usb_hid_save_subdrivers(hid_dev, subdrivers, count); 345 296 } … … 347 298 /*----------------------------------------------------------------------------*/ 348 299 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; 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); 354 304 355 305 if (dev->pipes[USB_HID_KBD_POLL_EP_NO].present) { … … 368 318 usb_log_error("None of supported endpoints found - probably" 369 319 " not a supported device.\n"); 370 r c =ENOTSUP;371 } 372 373 return rc;320 return ENOTSUP; 321 } 322 323 return EOK; 374 324 } 375 325 … … 378 328 static int usb_hid_init_report(usb_hid_dev_t *hid_dev) 379 329 { 380 assert(hid_dev != NULL && hid_dev->report != NULL);330 assert(hid_dev != NULL); 381 331 382 332 uint8_t report_id = 0; 383 size_t size;384 385 333 size_t max_size = 0; 386 334 387 335 do { 388 336 usb_log_debug("Getting size of the report.\n"); 389 size = usb_hid_report_byte_size(hid_dev->report, report_id, 390 USB_HID_REPORT_TYPE_INPUT); 337 const size_t size = 338 usb_hid_report_byte_size(&hid_dev->report, report_id, 339 USB_HID_REPORT_TYPE_INPUT); 391 340 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 392 341 max_size = (size > max_size) ? size : max_size; 393 342 usb_log_debug("Getting next report ID\n"); 394 report_id = usb_hid_get_next_report_id( hid_dev->report,343 report_id = usb_hid_get_next_report_id(&hid_dev->report, 395 344 report_id, USB_HID_REPORT_TYPE_INPUT); 396 345 } while (report_id != 0); … … 398 347 usb_log_debug("Max size of input report: %zu\n", max_size); 399 348 400 hid_dev->max_input_report_size = max_size;401 349 assert(hid_dev->input_report == NULL); 402 350 403 hid_dev->input_report = malloc(max_size);351 hid_dev->input_report = calloc(1, max_size); 404 352 if (hid_dev->input_report == NULL) { 405 353 return ENOMEM; 406 354 } 407 memset(hid_dev->input_report, 0, max_size);355 hid_dev->max_input_report_size = max_size; 408 356 409 357 return EOK; … … 430 378 } 431 379 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); 380 usb_hid_report_init(&hid_dev->report); 439 381 440 382 /* The USB device should already be initialized, save it in structure */ … … 446 388 return rc; 447 389 } 448 390 449 391 /* Get the report descriptor and parse it. */ 450 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 451 hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size);392 rc = usb_hid_process_report_descriptor(hid_dev->usb_dev, 393 &hid_dev->report, &hid_dev->report_desc, &hid_dev->report_desc_size); 452 394 453 395 bool fallback = false; … … 488 430 break; 489 431 default: 490 assert(hid_dev->poll_pipe_index 432 assert(hid_dev->poll_pipe_index 491 433 == USB_HID_GENERIC_POLL_EP_NO); 492 434 493 435 usb_log_info("Falling back to generic HID driver.\n"); 494 436 rc = usb_hid_set_generic_hid_subdriver(hid_dev); … … 499 441 usb_log_error("No subdriver for handling this device could be" 500 442 " initialized: %s.\n", str_error(rc)); 501 usb_log_debug("Subdriver count: %d\n", 443 usb_log_debug("Subdriver count: %d\n", 502 444 hid_dev->subdriver_count); 503 504 445 } else { 505 446 bool ok = false; 506 507 usb_log_debug("Subdriver count: %d\n", 447 448 usb_log_debug("Subdriver count: %d\n", 508 449 hid_dev->subdriver_count); 509 450 510 451 for (i = 0; i < hid_dev->subdriver_count; ++i) { 511 452 if (hid_dev->subdrivers[i].init != NULL) { … … 524 465 } 525 466 } 526 467 527 468 rc = (ok) ? EOK : -1; // what error to report 528 469 } … … 538 479 } 539 480 540 541 481 return rc; 542 482 } … … 544 484 /*----------------------------------------------------------------------------*/ 545 485 546 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 486 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 547 487 size_t buffer_size, void *arg) 548 488 { 549 int i;550 551 489 if (dev == NULL || arg == NULL || buffer == NULL) { 552 490 usb_log_error("Missing arguments to polling callback.\n"); 553 491 return false; 554 492 } 555 556 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)arg; 493 usb_hid_dev_t *hid_dev = arg; 557 494 558 495 assert(hid_dev->input_report != NULL); 496 559 497 usb_log_debug("New data [%zu/%zu]: %s\n", buffer_size, 560 498 hid_dev->max_input_report_size, … … 568 506 } 569 507 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 508 /* Parse the input report */ 509 const int rc = usb_hid_parse_report( 510 &hid_dev->report, buffer, buffer_size, &hid_dev->report_id); 575 511 if (rc != EOK) { 576 512 usb_log_warning("Error in usb_hid_parse_report():" 577 513 "%s\n", str_error(rc)); 578 } 514 } 579 515 580 516 bool cont = false; 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; 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); 588 522 } 589 523 } … … 594 528 /*----------------------------------------------------------------------------*/ 595 529 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) { 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) { 608 538 if (hid_dev->subdrivers[i].poll_end != NULL) { 609 hid_dev->subdrivers[i].poll_end( hid_dev,610 hid_dev ->subdrivers[i].data, reason);539 hid_dev->subdrivers[i].poll_end( 540 hid_dev, hid_dev->subdrivers[i].data, reason); 611 541 } 612 542 } … … 624 554 /*----------------------------------------------------------------------------*/ 625 555 626 int usb_hid_report_number( usb_hid_dev_t *hid_dev)556 int usb_hid_report_number(const usb_hid_dev_t *hid_dev) 627 557 { 628 558 return hid_dev->report_nr; … … 631 561 /*----------------------------------------------------------------------------*/ 632 562 633 void usb_hid_destroy(usb_hid_dev_t *hid_dev) 634 { 635 int i; 636 637 if (hid_dev == NULL) { 638 return; 639 } 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 640 568 641 569 usb_log_debug("Subdrivers: %p, subdriver count: %d\n", 642 570 hid_dev->subdrivers, hid_dev->subdriver_count); 643 571 644 assert(hid_dev->subdrivers != NULL 645 || hid_dev->subdriver_count == 0); 646 647 for (i = 0; i < hid_dev->subdriver_count; ++i) { 572 for (int i = 0; i < hid_dev->subdriver_count; ++i) { 648 573 if (hid_dev->subdrivers[i].deinit != NULL) { 649 574 hid_dev->subdrivers[i].deinit(hid_dev, … … 657 582 658 583 /* Destroy the parser */ 659 if (hid_dev->report != NULL) { 660 usb_hid_free_report(hid_dev->report); 661 } 584 usb_hid_report_deinit(&hid_dev->report); 662 585 663 586 } -
uspace/drv/bus/usb/usbhid/usbhid.h
r25696fea r22ceff3a 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 usb_endpoint_description_t *usb_hid_endpoints[];143 extern const 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 bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer, 150 size_t buffer_size, void *arg); 149 void usb_hid_deinit(usb_hid_dev_t *hid_dev); 151 150 152 void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, 153 void *arg); 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); 154 155 155 156 void usb_hid_new_report(usb_hid_dev_t *hid_dev); 156 157 157 int usb_hid_report_number(usb_hid_dev_t *hid_dev); 158 159 void usb_hid_destroy(usb_hid_dev_t *hid_dev); 158 int usb_hid_report_number(const usb_hid_dev_t *hid_dev); 160 159 161 160 #endif /* USB_HID_USBHID_H_ */ -
uspace/drv/bus/usb/usbhub/main.c
r25696fea r22ceff3a 67 67 68 68 /** Hub endpoints, excluding control endpoint. */ 69 static usb_endpoint_description_t *usb_hub_endpoints[] = {69 static const usb_endpoint_description_t *usb_hub_endpoints[] = { 70 70 &hub_status_change_endpoint_description, 71 71 NULL, -
uspace/drv/bus/usb/usbmast/main.c
r25696fea r22ceff3a 72 72 }; 73 73 74 usb_endpoint_description_t *mast_endpoints[] = {74 static const usb_endpoint_description_t *mast_endpoints[] = { 75 75 &bulk_in_ep, 76 76 &bulk_out_ep, -
uspace/drv/bus/usb/usbmouse/init.c
r25696fea r22ceff3a 44 44 45 45 /** Mouse polling endpoint description for boot protocol subclass. */ 46 usb_endpoint_description_t poll_endpoint_description = {46 const 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
r25696fea r22ceff3a 83 83 }; 84 84 85 static usb_endpoint_description_t *endpoints[] = {85 static const usb_endpoint_description_t *endpoints[] = { 86 86 &poll_endpoint_description, 87 87 NULL -
uspace/drv/bus/usb/usbmouse/mouse.c
r25696fea r22ceff3a 124 124 mouse->console_sess = NULL; 125 125 126 usb_device_de stroy(dev);126 usb_device_deinit(dev); 127 127 } 128 128 -
uspace/drv/bus/usb/usbmouse/mouse.h
r25696fea r22ceff3a 61 61 } usb_mouse_t; 62 62 63 extern usb_endpoint_description_t poll_endpoint_description;63 extern const 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
r25696fea r22ceff3a 156 156 \endcode 157 157 */ 158 usb_endpoint_description_t **endpoints;158 const 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 usb_endpoint_description_t **);166 const 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 usb_endpoint_description_t **, const uint8_t *, size_t, int, int,170 const 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 *, usb_endpoint_description_t **, usb_device_t **, const char **); 174 void usb_device_destroy(usb_device_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 *); 175 176 void * usb_device_data_alloc(usb_device_t *, size_t); 176 177 -
uspace/lib/usbdev/src/devdrv.c
r25696fea r22ceff3a 81 81 * @return Number of pipes (excluding default control pipe). 82 82 */ 83 static size_t count_other_pipes( usb_endpoint_description_t **endpoints)83 static size_t count_other_pipes(const 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( usb_endpoint_description_t **endpoints,103 static int initialize_other_pipes(const 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 stroy(dev);156 usb_device_deinit(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 stroy(usb_dev);193 usb_device_deinit(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 usb_endpoint_description_t **endpoints)240 const 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 usb_endpoint_description_t **endpoints,323 const 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 usb_endpoint_description_t **endpoints,528 const 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 destroyed. 593 */ 594 void usb_device_destroy(usb_device_t *dev) 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) 595 597 { 596 598 if (dev == NULL) { -
uspace/lib/usbhid/include/usb/hid/hiddescriptor.h
r25696fea r22ceff3a 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);48 46 49 47 void usb_hid_descriptor_print(usb_hid_report_t *report); 50 48 51 49 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
r25696fea r22ceff3a 1016 1016 * @return void 1017 1017 */ 1018 void usb_hid_ free_report(usb_hid_report_t *report)1018 void usb_hid_report_deinit(usb_hid_report_t *report) 1019 1019 { 1020 1020 if(report == NULL){
Note:
See TracChangeset
for help on using the changeset viewer.