Changes in / [fefc27d:4fbcd2a] in mainline
- Location:
- uspace
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/hc.c
rfefc27d r4fbcd2a 45 45 46 46 static int interrupt_emulator(hc_t *instance); 47 static void hc_gain_control(hc_t *instance);48 static void hc_init_hw(hc_t *instance);49 47 /*----------------------------------------------------------------------------*/ 50 48 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun) … … 79 77 assert(instance); 80 78 int ret = EOK; 81 #define CHECK_RET_RETURN(ret, message...) \82 if (ret != EOK) { \83 usb_log_error(message); \84 return ret; \85 } else (void)086 79 87 80 ret = pio_enable((void*)regs, reg_size, (void**)&instance->registers); 88 CHECK_RET_RETURN(ret,89 "Failed(%d) to gain access to device registers: %s.\n",90 ret, str_error(ret));91 81 if (ret != EOK) { 82 usb_log_error("Failed to gain access to device registers.\n"); 83 return ret; 84 } 92 85 instance->ddf_instance = fun; 93 86 usb_device_keeper_init(&instance->manager); 94 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11,95 bandwidth_count_usb11);96 CHECK_RET_RETURN(ret, "Failed to initialize bandwidth allocator: %s.\n",97 ret, str_error(ret));98 87 99 88 if (!interrupts) { … … 103 92 } 104 93 105 hc_gain_control(instance);106 107 94 rh_init(&instance->rh, dev, instance->registers); 108 109 hc_init_hw(instance);110 95 111 96 /* TODO: implement */ … … 132 117 rh_interrupt(&instance->rh); 133 118 134 usb_log_info("OHCI interrupt: %x.\n", status);135 136 119 /* TODO: Check for further interrupt causes */ 137 120 /* TODO: implement */ … … 143 126 usb_log_info("Started interrupt emulator.\n"); 144 127 while (1) { 145 constuint32_t status = instance->registers->interrupt_status;128 uint32_t status = instance->registers->interrupt_status; 146 129 instance->registers->interrupt_status = status; 147 130 hc_interrupt(instance, status); … … 150 133 return EOK; 151 134 } 152 /*----------------------------------------------------------------------------*/153 void hc_gain_control(hc_t *instance)154 {155 assert(instance);156 /* Interrupt routing enabled => smm driver is active */157 if (instance->registers->control & C_IR) {158 usb_log_info("Found SMM driver requesting ownership change.\n");159 instance->registers->command_status |= CS_OCR;160 while (instance->registers->control & C_IR) {161 async_usleep(1000);162 }163 usb_log_info("Ownership taken from SMM driver.\n");164 return;165 }166 167 const unsigned hc_status =168 (instance->registers->control >> C_HCFS_SHIFT) & C_HCFS_MASK;169 /* Interrupt routing disabled && status != USB_RESET => BIOS active */170 if (hc_status != C_HCFS_RESET) {171 usb_log_info("Found BIOS driver.\n");172 if (hc_status == C_HCFS_OPERATIONAL) {173 usb_log_info("HC operational(BIOS).\n");174 return;175 }176 /* HC is suspended assert resume for 20ms */177 instance->registers->control &= (C_HCFS_RESUME << C_HCFS_SHIFT);178 async_usleep(20000);179 return;180 }181 182 /* HC is in reset (hw startup) => no other driver183 * maintain reset for at least the time specified in USB spec (50 ms)*/184 async_usleep(50000);185 }186 /*----------------------------------------------------------------------------*/187 void hc_init_hw(hc_t *instance)188 {189 assert(instance);190 const uint32_t fm_interval = instance->registers->fm_interval;191 instance->registers->command_status = CS_HCR;192 async_usleep(10);193 instance->registers->fm_interval = fm_interval;194 assert((instance->registers->command_status & CS_HCR) == 0);195 /* hc is now in suspend state */196 /* TODO: init HCCA block */197 /* TODO: init queues */198 /* TODO: enable queues */199 /* TODO: enable interrupts */200 /* TODO: set periodic start to 90% */201 202 instance->registers->control &= (C_HCFS_OPERATIONAL << C_HCFS_SHIFT);203 usb_log_info("OHCI HC up and running.\n");204 }205 135 /** 206 136 * @} -
uspace/drv/ohci/hc.h
rfefc27d r4fbcd2a 42 42 #include <usb/usb.h> 43 43 #include <usb/host/device_keeper.h> 44 #include <usb/host/bandwidth.h>45 44 #include <usbhc_iface.h> 46 45 … … 55 54 ddf_fun_t *ddf_instance; 56 55 usb_device_keeper_t manager; 57 bandwidth_t bandwidth;58 56 fid_t interrupt_emulator; 59 57 } hc_t; -
uspace/drv/ohci/iface.c
rfefc27d r4fbcd2a 151 151 size_t max_packet_size, unsigned int interval) 152 152 { 153 assert(fun); 154 hc_t *hc = fun_to_hc(fun); 155 assert(hc); 156 if (address == hc->rh.address) 157 return EOK; 158 const usb_speed_t speed = 159 usb_device_keeper_get_speed(&hc->manager, address); 160 const size_t size = max_packet_size; 161 usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n", 162 address, endpoint, usb_str_transfer_type(transfer_type), 163 usb_str_speed(speed), direction, size, max_packet_size, interval); 164 return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction, 165 speed, transfer_type, max_packet_size, size, interval); 153 UNSUPPORTED("register_endpoint"); 154 155 return ENOTSUP; 166 156 } 167 157 /*----------------------------------------------------------------------------*/ … … 178 168 usb_endpoint_t endpoint, usb_direction_t direction) 179 169 { 180 assert(fun); 181 hc_t *hc = fun_to_hc(fun); 182 assert(hc); 183 usb_log_debug("Unregister endpoint %d:%d %d.\n", 184 address, endpoint, direction); 185 return bandwidth_release(&hc->bandwidth, address, endpoint, direction); 170 UNSUPPORTED("unregister_endpoint"); 186 171 187 172 return ENOTSUP; -
uspace/drv/ohci/ohci_regs.h
rfefc27d r4fbcd2a 39 39 typedef struct ohci_regs 40 40 { 41 constvolatile uint32_t revision;41 volatile uint32_t revision; 42 42 volatile uint32_t control; 43 #define C_CSBR_MASK (0x3)44 #define C_CSBR_SHIFT (0)45 #define C_PLE (1 << 2)46 #define C_IE (1 << 3)47 #define C_CLE (1 << 4)48 #define C_BLE (1 << 5)49 50 #define C_HCFS_MASK (0x3)51 #define C_HCFS_SHIFT (6)52 #define C_HCFS_RESET (0x0)53 #define C_HCFS_OPERATIONAL (0x1)54 #define C_HCFS_RESUME (0x2)55 #define C_HCFS_SUSPEND (0x3)56 57 #define C_IR (1 << 8)58 #define C_RWC (1 << 9)59 #define C_RWE (1 << 10)60 61 43 volatile uint32_t command_status; 62 #define CS_HCR (1 << 0)63 #define CS_CLF (1 << 1)64 #define CS_BLF (1 << 2)65 #define CS_OCR (1 << 3)66 #define CS_SOC_MASK (0x3)67 #define CS_SOC_SHIFT (16)68 69 44 volatile uint32_t interrupt_status; 70 45 #define IS_SO (1 << 0) … … 76 51 #define IS_RHSC (1 << 6) 77 52 #define IS_OC (1 << 30) 78 79 53 volatile uint32_t interupt_enable; 80 54 #define IE_SO (1 << 0) -
uspace/drv/ohci/root_hub.c
rfefc27d r4fbcd2a 252 252 253 253 254 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);254 usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff); 255 255 256 256 //start generic usb hub driver … … 275 275 if(port<1 || port>instance->port_count) 276 276 return EINVAL; 277 uint32_t * uint32_buffer = (uint32_t*)request-> transport_buffer;277 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 278 278 request->transfered_size = 4; 279 279 uint32_buffer[0] = instance->registers->rh_port_status[port -1]; … … 292 292 static int process_get_hub_status_request(rh_t *instance, 293 293 usb_transfer_batch_t * request){ 294 uint32_t * uint32_buffer = (uint32_t*)request-> transport_buffer;294 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 295 295 //bits, 0,1,16,17 296 296 request->transfered_size = 4; … … 457 457 if(request->buffer_size != 1) 458 458 return EINVAL; 459 request-> transport_buffer[0] = 1;459 request->buffer[0] = 1; 460 460 request->transfered_size = 1; 461 461 return EOK; -
uspace/drv/uhci-hcd/hc.c
rfefc27d r4fbcd2a 241 241 ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11, 242 242 bandwidth_count_usb11); 243 assert(ret == EOK);243 assert(ret == true); 244 244 245 245 return EOK; -
uspace/lib/usb/src/host/bandwidth.c
rfefc27d r4fbcd2a 127 127 instance->free = bandwidth; 128 128 instance->usage_fnc = usage_fnc; 129 bool ht =129 return 130 130 hash_table_create(&instance->reserved, BUCKET_COUNT, MAX_KEYS, &op); 131 return ht ? EOK : ENOMEM;132 131 } 133 132 /*----------------------------------------------------------------------------*/
Note:
See TracChangeset
for help on using the changeset viewer.