Rev 1600 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1600 | Rev 1605 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #define UHCI_USBLEGSUP 0x00c0 /* legacy support */ |
1 | #define UHCI_USBLEGSUP 0x00c0 /* legacy support */ |
2 | #define UHCI_USBCMD 0 /* command register */ |
- | |
3 | #define UHCI_USBINTR 4 /* interrupt register */ |
2 | #define UHCI_USBLEGSUP_DEFAULT 0x2000 /* only PIRQ enable set */ |
4 | #define UHCI_USBLEGSUP_RWC 0x8f00 /* the R/WC bits */ |
3 | #define UHCI_USBLEGSUP_RWC 0x8f00 /* the R/WC bits */ |
5 | #define UHCI_USBLEGSUP_RO 0x5040 /* R/O and reserved bits */ |
4 | #define UHCI_USBLEGSUP_RO 0x5040 /* R/O and reserved bits */ |
- | 5 | ||
- | 6 | ||
- | 7 | #define UHCI_USBCMD 0 /* command register */ |
|
- | 8 | #define UHCI_USBINTR 4 /* interrupt register */ |
|
6 | #define UHCI_USBCMD_RUN 0x0001 /* RUN/STOP bit */ |
9 | #define UHCI_USBCMD_RUN 0x0001 /* RUN/STOP bit */ |
7 | #define UHCI_USBCMD_HCRESET 0x0002 /* Host Controller reset */ |
10 | #define UHCI_USBCMD_HCRESET 0x0002 /* Host Controller reset */ |
8 | #define UHCI_USBCMD_EGSM 0x0008 /* Global Suspend Mode */ |
11 | #define UHCI_USBCMD_EGSM 0x0008 /* Global Suspend Mode */ |
9 | #define UHCI_USBCMD_CONFIGURE 0x0040 /* Config Flag */ |
12 | #define UHCI_USBCMD_CONFIGURE 0x0040 /* Config Flag */ |
10 | #define UHCI_USBINTR_RESUME 0x0002 /* Resume interrupt enable */ |
13 | #define UHCI_USBINTR_RESUME 0x0002 /* Resume interrupt enable */ |
Line 115... | Line 118... | ||
115 | uhci_reset_hc(hc); |
118 | uhci_reset_hc(hc); |
116 | return 1; |
119 | return 1; |
117 | } |
120 | } |
118 | 121 | ||
Line -... | Line 122... | ||
- | 122 | void hc_interrupt() |
|
- | 123 | { |
|
- | 124 | hc_t *hc; |
|
- | 125 | ||
- | 126 | printf("USB interrupt\n"); |
|
- | 127 | ||
- | 128 | hc = (hc_t*)hc_list.next; |
|
- | 129 | ||
- | 130 | while( &hc->list != &hc_list) |
|
- | 131 | { |
|
- | 132 | hc_t *tmp; |
|
- | 133 | u16_t status; |
|
- | 134 | ||
- | 135 | tmp = hc; |
|
- | 136 | hc = (hc_t*)hc->list.next; |
|
- | 137 | ||
- | 138 | status = in16(tmp->iobase + USBSTS); |
|
- | 139 | if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */ |
|
- | 140 | continue; |
|
- | 141 | out16(tmp->iobase + USBSTS, status); /* Clear it */ |
|
- | 142 | } |
|
- | 143 | ||
- | 144 | }; |
|
- | 145 | ||
- | 146 | ||
Line 119... | Line 147... | ||
119 | 147 | ||
120 | bool init_hc(hc_t *hc) |
148 | bool init_hc(hc_t *hc) |
121 | { |
149 | { |
122 | int port; |
150 | int port; |
123 | u32_t ifl; |
151 | u32_t ifl; |
- | 152 | u16_t dev_status; |
|
124 | u16_t dev_status; |
153 | td_t *td; |
Line 125... | Line 154... | ||
125 | int i; |
154 | int i; |
Line 126... | Line 155... | ||
126 | 155 | ||
Line 164... | Line 193... | ||
164 | hc->frame_base = (u32_t*)KernelAlloc(4096); |
193 | hc->frame_base = (u32_t*)KernelAlloc(4096); |
165 | hc->frame_dma = GetPgAddr(hc->frame_base); |
194 | hc->frame_dma = GetPgAddr(hc->frame_base); |
166 | hc->frame_number = 0; |
195 | hc->frame_number = 0; |
Line -... | Line 196... | ||
- | 196 | ||
- | 197 | ||
- | 198 | for (i = 0; i < UHCI_NUM_SKELQH; i++) |
|
167 | 199 | { |
|
Line 168... | Line 200... | ||
168 | qh_t *qh = alloc_qh(); |
200 | qh_t *qh = alloc_qh(); |
169 | 201 | ||
Line 170... | Line 202... | ||
170 | qh->qlink = 1; |
202 | qh->qlink = 1; |
- | 203 | qh->qelem = 1; |
|
- | 204 | ||
- | 205 | hc->qh[i] = qh; |
|
Line -... | Line 206... | ||
- | 206 | } |
|
- | 207 | for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i) |
|
- | 208 | hc->qh[i]->qlink = hc->qh[SKEL_ASYNC]->dma | 2; |
|
- | 209 | ||
- | 210 | /* |
|
171 | qh->qelem = 1; |
211 | td = alloc_td(); |
- | 212 | ||
- | 213 | td->link = 1; |
|
- | 214 | td->status = (1<<24) | (1<<23) ; |
|
Line 172... | Line 215... | ||
172 | 215 | td->token = TOKEN( 0x7FF, DATA0, 0, 0, 0xE1); |
|
- | 216 | td->buffer = 0; |
|
173 | hc->qh1 = qh; |
217 | td->bk = NULL; |
Line -... | Line 218... | ||
- | 218 | */ |
|
- | 219 | ||
- | 220 | for (i = 0; i < 1024; i++) |
|
- | 221 | { |
|
- | 222 | int qnum; |
|
- | 223 | ||
- | 224 | qnum = 8 - (int) __bsf( i | 1024); |
|
- | 225 | ||
- | 226 | if (qnum <= 1) |
|
Line 174... | Line 227... | ||
174 | 227 | qnum = 9; |
|
175 | // dbgprintf("alloc qh %x dma %x\n", qh, qh->dma); |
228 | |
Line 176... | Line 229... | ||
176 | 229 | hc->frame_base[i] = hc->qh[qnum]->dma | 2; |
|
Line 187... | Line 240... | ||
187 | /* Set the current frame number */ |
240 | /* Set the current frame number */ |
188 | out16(hc->iobase + USBFRNUM, 0); |
241 | out16(hc->iobase + USBFRNUM, 0); |
Line 189... | Line 242... | ||
189 | 242 | ||
- | 243 | out16(hc->iobase + USBSTS, 0x3F); |
|
- | 244 | ||
- | 245 | out16(hc->iobase + UHCI_USBINTR, 4); |
|
- | 246 | ||
- | 247 | AttachIntHandler(hc->irq_line, hc_interrupt, 0); |
|
- | 248 | ||
- | 249 | pciWriteWord(hc->PciTag, UHCI_USBLEGSUP, UHCI_USBLEGSUP_DEFAULT); |
|
190 | out16(hc->iobase + USBSTS, 0x3F); |
250 | |
191 | out16(hc->iobase + USBCMD, USBCMD_RS | USBCMD_CF | |
251 | out16(hc->iobase + USBCMD, USBCMD_RS | USBCMD_CF | |
Line 192... | Line 252... | ||
192 | USBCMD_MAXP); |
252 | USBCMD_MAXP); |
193 | 253 | ||
Line 345... | Line 405... | ||
345 | rq->td_head = td; |
405 | rq->td_head = td; |
346 | 406 | ||
Line 347... | Line 407... | ||
347 | if( td_prev ) |
407 | if( td_prev ) |
348 | td_prev->link = td->dma | 4; |
408 | td_prev->link = td->dma | 4; |
349 | td->status = 0x00800000 | dev->speed; |
409 | td->status = TD_CTRL_ACTIVE | dev->speed; |
350 | td->token = TOKEN(packet_size,enp->toggle,enp->address, |
410 | td->token = TOKEN(packet_size,enp->toggle,enp->address, |
351 | dev->addr,dir); |
411 | dev->addr,dir); |
352 | td->buffer = data_dma; |
412 | td->buffer = data_dma; |
353 | td->bk = td_prev; |
413 | td->bk = td_prev; |
Line 354... | Line 414... | ||
354 | 414 | ||
Line 355... | Line 415... | ||
355 | td_prev = td; |
415 | td_prev = td; |
356 | 416 | ||
357 | data_dma+= packet_size; |
417 | data_dma+= packet_size; |
358 | size-= packet_size; |
418 | size-= packet_size; |
- | 419 | enp->toggle ^= DATA1; |
|
- | 420 | }; |
|
359 | enp->toggle ^= DATA1; |
421 | |
360 | } |
- | |
361 | rq->td_tail = td; |
- | |
362 | /* |
- | |
363 | dbgprintf("create request %x\n" |
- | |
364 | "head %x\n" |
- | |
365 | "tail %x\n" |
- | |
366 | "data %x\n" |
- | |
367 | "size %x\n", |
- | |
368 | rq, rq->td_head, rq->td_tail, |
- | |
369 | rq->data, rq->size); |
422 | td->status |= TD_CTRL_IOC; |
370 | */ |
423 | rq->td_tail = td; |
Line 371... | Line 424... | ||
371 | return rq; |
424 | return rq; |
372 | } |
425 | } |
Line 403... | Line 456... | ||
403 | }; |
456 | }; |
404 | 457 | ||
Line 405... | Line 458... | ||
405 | td = alloc_td(); |
458 | td = alloc_td(); |
406 | td_prev->link = td->dma | 4; |
459 | td_prev->link = td->dma | 4; |
407 | td->status = 0x00800000 | dev->speed; |
460 | td->status = TD_CTRL_ACTIVE | dev->speed; |
408 | td->token = TOKEN(packet_size, toggle, 0,dev->addr, pid); |
461 | td->token = TOKEN(packet_size, toggle, 0,dev->addr, pid); |
409 | td->buffer = data_dma; |
462 | td->buffer = data_dma; |
410 | td->bk = td_prev; |
463 | td->bk = td_prev; |
Line 411... | Line 464... | ||
411 | 464 | ||
Line 421... | Line 474... | ||
421 | 474 | ||
Line 422... | Line 475... | ||
422 | pid = (pid == DIN) ? DOUT : DIN; |
475 | pid = (pid == DIN) ? DOUT : DIN; |
Line 423... | Line 476... | ||
423 | 476 | ||
424 | td->link = 1; |
477 | td->link = 1; |
425 | td->status = 0x00800000 | dev->speed; |
478 | td->status = TD_CTRL_ACTIVE | TD_CTRL_IOC | dev->speed ; |
426 | td->token = (0x7FF<<21)|DATA1|(dev->addr<<8)|pid; |
479 | td->token = (0x7FF<<21)|DATA1|(dev->addr<<8)|pid; |
427 | td->buffer = 0; |
480 | td->buffer = 0; |
Line 428... | Line 481... | ||
428 | td->bk = td_prev; |
481 | td->bk = td_prev; |
Line 429... | Line 482... | ||
429 | 482 | ||
- | 483 | qh = dev->host->qh[SKEL_ASYNC]; |
|
- | 484 | ||
430 | qh = dev->host->qh1; |
485 | qh->qelem = td0->dma; |
Line 431... | Line 486... | ||
431 | 486 | ||
432 | qh->qelem = td0->dma; |
487 | mb(); |
433 | __asm__ __volatile__ ("":::"memory"); |
488 | // __asm__ __volatile__ ("":::"memory"); |
434 | 489 |