Subversion Repositories Kolibri OS

Rev

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