Rev 1029 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1029 | Rev 1600 | ||
---|---|---|---|
Line 116... | Line 116... | ||
116 | return 1; |
116 | return 1; |
117 | } |
117 | } |
118 | 118 | ||
Line 119... | Line 119... | ||
119 | 119 | ||
120 | Bool init_hc(hc_t *hc) |
120 | bool init_hc(hc_t *hc) |
121 | { |
121 | { |
122 | int port; |
122 | int port; |
123 | u32_t ifl; |
123 | u32_t ifl; |
124 | u16_t dev_status; |
124 | u16_t dev_status; |
Line 210... | Line 210... | ||
210 | delay(10/10); |
210 | delay(10/10); |
211 | status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
211 | status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
212 | if(status & 1) |
212 | if(status & 1) |
213 | { |
213 | { |
214 | udev_t *dev = malloc(sizeof(udev_t)); |
214 | udev_t *dev = kmalloc(sizeof(udev_t),0); |
215 | 215 | ||
Line 216... | Line 216... | ||
216 | out16(hc->iobase + USBPORTSC1 + (port * 2), 0x0E); |
216 | out16(hc->iobase + USBPORTSC1 + (port * 2), 0x0E); |
Line 217... | Line 217... | ||
217 | 217 | ||
Line 218... | Line 218... | ||
218 | delay(20/10); |
218 | delay(20/10); |
219 | 219 | ||
220 | dbgprintf("enable port\n"); |
220 | dbgprintf("enable port\n"); |
Line 221... | Line 221... | ||
221 | status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
221 | status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
222 | dbgprintf("port%d status %x\n", port, status); |
- | |
- | 222 | dbgprintf("port%d status %x\n", port, status); |
|
223 | 223 | ||
224 | link_initialize(&dev->link); |
- | |
225 | dev->id = 0; |
224 | INIT_LIST_HEAD(&dev->list); |
226 | dev->host = hc; |
225 | |
227 | dev->addr = 0; |
226 | dev->host = hc; |
Line 228... | Line 227... | ||
228 | dev->port = port; |
227 | dev->port = port; |
Line 242... | Line 241... | ||
242 | dbgprintf(" full speed\n"); |
241 | dbgprintf(" full speed\n"); |
243 | }; |
242 | }; |
244 | 243 | ||
Line 245... | Line 244... | ||
245 | if(set_address(dev)) { |
244 | if(set_address(dev)) { |
246 | list_prepend(&dev->link, &newdev_list); |
245 | list_add_tail(&dev->list, &newdev_list); |
247 | hc->port_map |= 1< |
246 | hc->port_map |= 1< |
248 | } |
247 | } |
249 | else { |
248 | else { |
250 | free(dev); |
249 | free(dev); |
251 | out16(hc->iobase + USBPORTSC1 + (port * 2), 0); |
250 | out16(hc->iobase + USBPORTSC1 + (port * 2), 0); |
252 | } |
251 | } |
253 | break; |
252 | break; |
254 | }; |
253 | }; |
255 | }; |
254 | }; |
256 | }; |
255 | }; |
257 | return TRUE; |
256 | return true; |
258 | }; |
257 | }; |
Line 259... | Line 258... | ||
259 | 258 | ||
260 | u16_t __attribute__((aligned(16))) |
259 | u16_t __attribute__((aligned(16))) |
Line 267... | Line 266... | ||
267 | SETUP(0) IN(1) IN(0) IN(1)...OUT(0) |
266 | SETUP(0) IN(1) IN(0) IN(1)...OUT(0) |
268 | */ |
267 | */ |
269 | 268 | ||
Line 270... | Line 269... | ||
270 | 269 | ||
271 | Bool set_address(udev_t *dev) |
270 | bool set_address(udev_t *dev) |
272 | { |
271 | { |
273 | static udev_id = 0; |
272 | static udev_id = 0; |
274 | static udev_addr = 0; |
273 | static udev_addr = 0; |
275 | static u16_t __attribute__((aligned(16))) |
274 | static u16_t __attribute__((aligned(16))) |
Line 290... | Line 289... | ||
290 | 289 | ||
Line 291... | Line 290... | ||
291 | req_addr[1] = address; |
290 | req_addr[1] = address; |
Line 292... | Line 291... | ||
292 | 291 | ||
293 | if( !ctrl_request(dev, &req_addr, DOUT, NULL, 0)) |
292 | if( !ctrl_request(dev, &req_addr, DOUT, NULL, 0)) |
Line 294... | Line 293... | ||
294 | return FALSE; |
293 | return false; |
295 | 294 | ||
Line 296... | Line 295... | ||
296 | dev->addr = address; |
295 | dev->addr = address; |
Line 297... | Line 296... | ||
297 | dev->id = (++udev_id << 8) | address; |
296 | dev->id = (++udev_id << 8) | address; |
298 | 297 | ||
Line 299... | Line 298... | ||
299 | dbgprintf("set address %d\n", address); |
298 | dbgprintf("set address %d\n", address); |
300 | 299 | ||
Line 301... | Line 300... | ||
301 | data[0] = 0; |
300 | data[0] = 0; |
302 | data[1] = 0; |
301 | data[1] = 0; |
Line 303... | Line 302... | ||
303 | 302 | ||
304 | if( !ctrl_request(dev, &req_descr, DIN, data, 8)) |
303 | if( !ctrl_request(dev, &req_descr, DIN, data, 8)) |
Line 305... | Line 304... | ||
305 | return FALSE; |
304 | return false; |
306 | 305 | ||
307 | dev_descr_t *descr = (dev_descr_t*)&data; |
306 | dev_descr_t *descr = (dev_descr_t*)&data; |
308 | dev->ep0_size = descr->bMaxPacketSize0; |
307 | dev->ep0_size = descr->bMaxPacketSize0; |
309 | 308 | ||
Line 310... | Line 309... | ||
310 | return TRUE; |
309 | return true; |
- | 310 | } |
|
Line 311... | Line 311... | ||
311 | } |
311 | |
Line 312... | Line -... | ||
312 | - | ||
313 | request_t *create_request(udev_t *dev, endp_t *enp, u32_t dir, |
312 | request_t *create_request(udev_t *dev, endp_t *enp, u32_t dir, |
Line 314... | Line 313... | ||
314 | void *data, size_t req_size) |
313 | void *data, size_t req_size) |
315 | { |
314 | { |
316 | td_t *td, *td_prev; |
315 | td_t *td, *td_prev; |
Line 317... | Line 316... | ||
317 | addr_t data_dma; |
316 | addr_t data_dma; |
318 | 317 | ||
Line 319... | Line 318... | ||
319 | request_t *rq = (request_t*)malloc(sizeof(request_t)); |
318 | size_t packet_size = enp->size; |
Line 320... | Line 319... | ||
320 | 319 | size_t size = req_size; |
|
- | 320 | ||
- | 321 | request_t *rq = (request_t*)kmalloc(sizeof(request_t),0); |
|
321 | link_initialize(&rq->link); |
322 | |
- | 323 | INIT_LIST_HEAD(&rq->list); |
|
- | 324 | ||
- | 325 | rq->data = (addr_t)data; |
|
322 | 326 | rq->size = req_size; |
|
323 | rq->td_head = 0; |
327 | rq->dev = dev; |
Line 324... | Line 328... | ||
324 | rq->td_tail = 0; |
328 | |
325 | 329 | if(data) |
|
Line 326... | Line 330... | ||
326 | rq->data = (addr_t)data; |
330 | data_dma = DMA(data); |
327 | rq->size = req_size; |
331 | |
328 | rq->dev = dev; |
332 | td_prev = NULL; |
329 | 333 | ||
330 | if(data) |
334 | while(size > 0) |
331 | data_dma = DMA(data); |
335 | { |
332 | 336 | if ( size < packet_size) |
|
Line 333... | Line 337... | ||
333 | td_prev = NULL; |
337 | { |
Line 334... | Line 338... | ||
334 | 338 | packet_size = size; |
|
335 | while(req_size >= enp->size) |
339 | }; |
336 | { |
- | |
337 | td = alloc_td(); |
- | |
338 | td->link = 1; |
- | |
339 | - | ||
340 | if(rq->td_head == NULL) |
- | |
341 | rq->td_head = td; |
- | |
342 | - | ||
343 | if( td_prev ) |
- | |
344 | td_prev->link = td->dma | 4; |
- | |
345 | td->status = 0x00800000 | dev->speed; |
- | |
346 | td->token = TOKEN(enp->size,enp->toggle,enp->address, |
- | |
347 | dev->addr,dir); |
- | |
348 | td->buffer = data_dma; |
- | |
349 | td->bk = td_prev; |
- | |
350 | - | ||
351 | td_prev = td; |
- | |
352 | - | ||
353 | data_dma+= enp->size; |
- | |
354 | req_size-= enp->size; |
- | |
355 | enp->toggle ^= DATA1; |
340 | |
356 | } |
341 | td = alloc_td(); |
357 | if(req_size) |
342 | td->link = 1; |
358 | { |
343 | |
359 | td = alloc_td(); |
344 | if(rq->td_head == NULL) |
Line 385... | Line 370... | ||
385 | */ |
370 | */ |
386 | return rq; |
371 | return rq; |
387 | } |
372 | } |
388 | 373 | ||
Line 389... | Line 374... | ||
389 | Bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
374 | bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
390 | void *data, size_t req_size) |
375 | void *data, size_t req_size) |
391 | { |
376 | { |
392 | size_t packet_size = dev->ep0_size; |
377 | size_t packet_size = dev->ep0_size; |
393 | size_t size = req_size; |
378 | size_t size = req_size; |
394 | u32_t toggle = DATA1; |
379 | u32_t toggle = DATA1; |
Line 395... | Line 380... | ||
395 | 380 | ||
396 | td_t *td0, *td, *td_prev; |
381 | td_t *td0, *td, *td_prev; |
397 | qh_t *qh; |
382 | qh_t *qh; |
398 | addr_t data_dma = 0; |
383 | addr_t data_dma = 0; |
Line 399... | Line 384... | ||
399 | Bool retval; |
384 | bool retval; |
Line 400... | Line 385... | ||
400 | 385 | ||
401 | td0 = alloc_td(); |
386 | td0 = alloc_td(); |
Line 409... | Line 394... | ||
409 | data_dma = DMA(data); |
394 | data_dma = DMA(data); |
410 | 395 | ||
Line 411... | Line 396... | ||
411 | td_prev = td0; |
396 | td_prev = td0; |
Line 412... | Line 397... | ||
412 | 397 | ||
413 | while(size >= packet_size) |
398 | while(size > 0) |
414 | { |
- | |
415 | td = alloc_td(); |
- | |
416 | td_prev->link = td->dma | 4; |
- | |
417 | td->status = 0x00800000 | dev->speed; |
- | |
418 | td->token = TOKEN(packet_size, toggle, 0,dev->addr, pid); |
- | |
419 | td->buffer = data_dma; |
- | |
420 | td->bk = td_prev; |
- | |
421 | - | ||
422 | td_prev = td; |
- | |
423 | - | ||
424 | data_dma+= packet_size; |
399 | { |
425 | size-= packet_size; |
- | |
426 | toggle ^= DATA1; |
- | |
427 | } |
- | |
428 | if(size) |
400 | if ( size < packet_size) |
- | 401 | { |
|
- | 402 | packet_size = size; |
|
- | 403 | }; |
|
429 | { |
404 | |
430 | td = alloc_td(); |
405 | td = alloc_td(); |
431 | td_prev->link = td->dma | 4; |
406 | td_prev->link = td->dma | 4; |
432 | td->status = 0x00800000 | dev->speed; |
407 | td->status = 0x00800000 | dev->speed; |
433 | td->token = ((size-1)<<21)|toggle|(dev->addr<<8)|pid; |
408 | td->token = TOKEN(packet_size, toggle, 0,dev->addr, pid); |
434 | td->buffer = data_dma; |
409 | td->buffer = data_dma; |
Line 435... | Line 410... | ||
435 | td->bk = td_prev; |
410 | td->bk = td_prev; |
Line 478... | Line 453... | ||
478 | dbgprintf("td_prev status %x\n",td_prev->status); |
453 | dbgprintf("td_prev status %x\n",td_prev->status); |
479 | dbgprintf("td status %x\n",td->status); |
454 | dbgprintf("td status %x\n",td->status); |
480 | dbgprintf("qh %x \n", qh->qelem); |
455 | dbgprintf("qh %x \n", qh->qelem); |
481 | 456 | ||
Line 482... | Line 457... | ||
482 | retval = FALSE; |
457 | retval = false; |
483 | } else retval = TRUE; |
458 | } else retval = true; |
Line 484... | Line 459... | ||
484 | 459 | ||
485 | do |
460 | do |
486 | { |
461 | { |
487 | td_prev = td->bk; |
462 | td_prev = td->bk; |
Line 492... | Line 467... | ||
492 | return retval; |
467 | return retval; |
493 | }; |
468 | }; |
Line 494... | Line 469... | ||
494 | 469 | ||
495 | 470 | ||
496 | Bool init_device(udev_t *dev) |
471 | bool init_device(udev_t *dev) |
497 | { |
472 | { |
Line 498... | Line 473... | ||
498 | static u16_t __attribute__((aligned(16))) |
473 | static u16_t __attribute__((aligned(16))) |
Line 584... | Line 559... | ||
584 | dbgprintf( "audio device\n"); |
559 | dbgprintf( "audio device\n"); |
585 | break; |
560 | break; |
586 | case USB_CLASS_HID: |
561 | case USB_CLASS_HID: |
587 | dev->conf = conf; |
562 | dev->conf = conf; |
588 | list_remove(&dev->link); |
563 | list_del(&dev->list); |
589 | return init_hid(dev); |
564 | return init_hid(dev); |
590 | 565 | ||
Line 591... | Line 566... | ||
591 | case USB_CLASS_PRINTER: |
566 | case USB_CLASS_PRINTER: |
592 | dbgprintf("printer\n"); |
567 | dbgprintf("printer\n"); |
593 | break; |
568 | break; |