118,7 → 118,7 |
} |
|
|
bool init_hc(hc_t *hc) |
Bool init_hc(hc_t *hc) |
{ |
int port; |
u32_t ifl; |
212,7 → 212,7 |
status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
if(status & 1) |
{ |
udev_t *dev = kmalloc(sizeof(udev_t),0); |
udev_t *dev = malloc(sizeof(udev_t)); |
|
out16(hc->iobase + USBPORTSC1 + (port * 2), 0x0E); |
|
222,9 → 222,10 |
status = in16(hc->iobase + USBPORTSC1 + (port * 2)); |
dbgprintf("port%d status %x\n", port, status); |
|
INIT_LIST_HEAD(&dev->list); |
|
link_initialize(&dev->link); |
dev->id = 0; |
dev->host = hc; |
dev->addr = 0; |
dev->port = port; |
dev->ep0_size = 8; |
dev->status = status; |
243,7 → 244,7 |
}; |
|
if(set_address(dev)) { |
list_add_tail(&dev->list, &newdev_list); |
list_prepend(&dev->link, &newdev_list); |
hc->port_map |= 1<<port; |
} |
else { |
254,7 → 255,7 |
}; |
}; |
}; |
return true; |
return TRUE; |
}; |
|
u16_t __attribute__((aligned(16))) |
268,7 → 269,7 |
*/ |
|
|
bool set_address(udev_t *dev) |
Bool set_address(udev_t *dev) |
{ |
static udev_id = 0; |
static udev_addr = 0; |
291,7 → 292,7 |
req_addr[1] = address; |
|
if( !ctrl_request(dev, &req_addr, DOUT, NULL, 0)) |
return false; |
return FALSE; |
|
dev->addr = address; |
dev->id = (++udev_id << 8) | address; |
302,12 → 303,12 |
data[1] = 0; |
|
if( !ctrl_request(dev, &req_descr, DIN, data, 8)) |
return false; |
return FALSE; |
|
dev_descr_t *descr = (dev_descr_t*)&data; |
dev->ep0_size = descr->bMaxPacketSize0; |
|
return true; |
return TRUE; |
} |
|
request_t *create_request(udev_t *dev, endp_t *enp, u32_t dir, |
316,12 → 317,12 |
td_t *td, *td_prev; |
addr_t data_dma; |
|
size_t packet_size = enp->size; |
size_t size = req_size; |
request_t *rq = (request_t*)malloc(sizeof(request_t)); |
|
request_t *rq = (request_t*)kmalloc(sizeof(request_t),0); |
link_initialize(&rq->link); |
|
INIT_LIST_HEAD(&rq->list); |
rq->td_head = 0; |
rq->td_tail = 0; |
|
rq->data = (addr_t)data; |
rq->size = req_size; |
332,13 → 333,8 |
|
td_prev = NULL; |
|
while(size > 0) |
while(req_size >= enp->size) |
{ |
if ( size < packet_size) |
{ |
packet_size = size; |
}; |
|
td = alloc_td(); |
td->link = 1; |
|
348,7 → 344,7 |
if( td_prev ) |
td_prev->link = td->dma | 4; |
td->status = 0x00800000 | dev->speed; |
td->token = TOKEN(packet_size,enp->toggle,enp->address, |
td->token = TOKEN(enp->size,enp->toggle,enp->address, |
dev->addr,dir); |
td->buffer = data_dma; |
td->bk = td_prev; |
355,10 → 351,29 |
|
td_prev = td; |
|
data_dma+= packet_size; |
size-= packet_size; |
data_dma+= enp->size; |
req_size-= enp->size; |
enp->toggle ^= DATA1; |
} |
if(req_size) |
{ |
td = alloc_td(); |
td->link = 1; |
|
if(rq->td_head == NULL) |
rq->td_head = td; |
|
if( td_prev ) |
td_prev->link = td->dma | 4; |
|
td->status = 0x00800000 | dev->speed; |
td->token = TOKEN( req_size, enp->toggle, enp->address, |
dev->addr, dir); |
td->buffer = data_dma; |
td->bk = td_prev; |
|
enp->toggle ^= DATA1; |
} |
rq->td_tail = td; |
/* |
dbgprintf("create request %x\n" |
372,7 → 387,7 |
return rq; |
} |
|
bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
Bool ctrl_request(udev_t *dev, void *req, u32_t pid, |
void *data, size_t req_size) |
{ |
size_t packet_size = dev->ep0_size; |
382,7 → 397,7 |
td_t *td0, *td, *td_prev; |
qh_t *qh; |
addr_t data_dma = 0; |
bool retval; |
Bool retval; |
|
td0 = alloc_td(); |
|
396,13 → 411,8 |
|
td_prev = td0; |
|
while(size > 0) |
while(size >= packet_size) |
{ |
if ( size < packet_size) |
{ |
packet_size = size; |
}; |
|
td = alloc_td(); |
td_prev->link = td->dma | 4; |
td->status = 0x00800000 | dev->speed; |
416,7 → 426,22 |
size-= packet_size; |
toggle ^= DATA1; |
} |
if(size) |
{ |
td = alloc_td(); |
td_prev->link = td->dma | 4; |
td->status = 0x00800000 | dev->speed; |
td->token = ((size-1)<<21)|toggle|(dev->addr<<8)|pid; |
td->buffer = data_dma; |
td->bk = td_prev; |
|
td_prev = td; |
|
data_dma+= packet_size; |
size-= packet_size; |
toggle ^= DATA1; |
} |
|
td = alloc_td(); |
td_prev->link = td->dma | 4; |
|
455,8 → 480,8 |
dbgprintf("td status %x\n",td->status); |
dbgprintf("qh %x \n", qh->qelem); |
|
retval = false; |
} else retval = true; |
retval = FALSE; |
} else retval = TRUE; |
|
do |
{ |
469,7 → 494,7 |
}; |
|
|
bool init_device(udev_t *dev) |
Bool init_device(udev_t *dev) |
{ |
static u16_t __attribute__((aligned(16))) |
req_descr[4] = {0x0680,0x0100,0x0000,18}; |
561,7 → 586,7 |
break; |
case USB_CLASS_HID: |
dev->conf = conf; |
list_del(&dev->list); |
list_remove(&dev->link); |
return init_hid(dev); |
|
case USB_CLASS_PRINTER: |