Subversion Repositories Kolibri OS

Rev

Rev 1616 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1616 Rev 1875
Line 234... Line 234...
234
    }
234
    }
235
    for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i)
235
    for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i)
236
        hc->qh[i]->qlink = hc->qh[SKEL_ASYNC]->dma | 2;
236
        hc->qh[i]->qlink = hc->qh[SKEL_ASYNC]->dma | 2;
237
 
237
 
Line 238... Line -...
238
/*
-
 
239
    td = alloc_td();
-
 
240
 
-
 
241
    td->link   = 1;
-
 
242
    td->status =  (1<<24) | (1<<23) ;
-
 
243
    td->token  = TOKEN( 0x7FF, DATA0, 0, 0, 0xE1);
-
 
244
    td->buffer = 0;
-
 
245
    td->bk     = NULL;
-
 
246
*/
-
 
247
 
-
 
248
    for (i = 0; i < 1024; i++)
238
    for (i = 0; i < 1024; i++)
249
    {
239
    {
250
        int qnum;
240
        int qnum;
Line 251... Line 241...
251
 
241
 
Line 280... Line 270...
280
                               USBCMD_MAXP);
270
                               USBCMD_MAXP);
281
 
271
 
Line 282... Line 272...
282
    for (port = 0; port < hc->numports; ++port)
272
    for (port = 0; port < hc->numports; ++port)
283
        out16(hc->iobase + USBPORTSC1 + (port * 2), 0x200);
273
        out16(hc->iobase + USBPORTSC1 + (port * 2), 0x200);
284
    delay(100/10);
-
 
Line 285... Line 274...
285
 
274
 
286
    for (port = 0; port < 2; ++port)
275
    for (port = 0; port < 2; ++port)
287
    {
276
    {
Line -... Line 277...
-
 
277
        time_t timeout;
-
 
278
 
288
        time_t timeout;
279
        delay(100/10);
289
 
280
 
Line 290... Line 281...
290
        u32_t status = in16(hc->iobase + USBPORTSC1 + (port * 2));
281
        u32_t status = in16(hc->iobase + USBPORTSC1 + (port * 2));
Line 402... Line 393...
402
 
393
 
Line 403... Line 394...
403
    return true;
394
    return true;
404
}
395
}
Line -... Line 396...
-
 
396
 
-
 
397
#define ALIGN16(x) (((x)+15)&~15)
-
 
398
 
-
 
399
#define MakePtr( cast, ptr, addValue ) (cast)((addr_t)(ptr)+(addr_t)(addValue))
405
 
400
 
406
request_t *create_request(udev_t *dev, endp_t *enp, u32_t dir,
401
request_t *alloc_rq_buffer(udev_t *dev, endp_t *enp, u32_t dir,
407
                          void *data, size_t req_size)
402
                           size_t data_size)
408
{
403
{
409
    td_t  *td, *td_prev;
-
 
410
    addr_t data_dma;
404
    size_t  packet_size = dev->ep0_size;
411
    hc_t     *hc = dev->host;
405
    int     dsize = data_size;
-
 
406
    size_t  buf_size;
412
    size_t  packet_size = enp->size;
407
 
413
    size_t  size = req_size;
408
    addr_t  buf_dma;
-
 
409
    addr_t  td_dma;
Line -... Line 410...
-
 
410
    addr_t  data_dma;
-
 
411
 
-
 
412
    request_t *rq;
-
 
413
 
-
 
414
    td_t  *td, *td_prev;
-
 
415
    int td_count = 0;
-
 
416
 
-
 
417
    while(dsize > 0)
-
 
418
    {
-
 
419
        td_count++;
-
 
420
        dsize-= packet_size;
-
 
421
    };
-
 
422
 
-
 
423
    buf_size = ALIGN16(sizeof(request_t)) + ALIGN16(data_size) +
-
 
424
               td_count*sizeof(td_t);
-
 
425
 
-
 
426
    rq = (request_t*)hcd_buffer_alloc(buf_size, &buf_dma);
414
    addr_t  td_dma;
427
    memset(rq, 0, buf_size);
-
 
428
 
Line 415... Line 429...
415
 
429
    data_dma = buf_dma + ALIGN16(sizeof(request_t));
Line -... Line 430...
-
 
430
    td_dma = data_dma + ALIGN16(data_size);
-
 
431
 
416
    request_t *rq = (request_t*)kmalloc(sizeof(request_t),0);
432
    INIT_LIST_HEAD(&rq->list);
417
 
433
 
418
    INIT_LIST_HEAD(&rq->list);
434
    rq->data = MakePtr(addr_t, rq, ALIGN16(sizeof(request_t)));
Line 419... Line -...
419
 
-
 
420
    rq->data = (addr_t)data;
-
 
421
    rq->size = req_size;
-
 
422
    rq->dev  = dev;
435
    td = MakePtr(td_t*, rq->data, ALIGN16(data_size));
Line -... Line 436...
-
 
436
    rq->td_head = td;
-
 
437
    rq->size = data_size;
423
 
438
    rq->dev  = dev;
424
    if(data)
439
 
425
        data_dma = DMA(data);
440
    td_prev = NULL;
426
 
441
 
427
    td_prev = NULL;
442
    dsize = data_size;
428
 
443
 
Line 429... Line -...
429
    while(size > 0)
-
 
430
    {
444
    while(dsize != 0)
Line 431... Line 445...
431
        if ( size < packet_size)
445
    {
Line 432... Line -...
432
        {
-
 
433
            packet_size = size;
-
 
434
        };
-
 
435
 
446
        if ( dsize < packet_size)
436
        td = dma_pool_alloc(hc->td_pool, 0, &td_dma);
447
        {
437
        td->dma = td_dma;
448
            packet_size = dsize;
438
 
449
        };
439
        td->link = 1;
450
 
440
 
451
        td->dma = td_dma;
441
        if(rq->td_head == NULL)
452
 
Line 442... Line 453...
442
            rq->td_head = td;
453
        td->link = 1;
Line -... Line 454...
-
 
454
 
-
 
455
        if( td_prev )
443
 
456
            td_prev->link   = td->dma | 4;
-
 
457
        td->status = TD_CTRL_ACTIVE | dev->speed;
444
        if( td_prev )
458
        td->token  = TOKEN(packet_size,enp->toggle,enp->address,
445
            td_prev->link   = td->dma | 4;
459
                           dev->addr,dir);
446
        td->status = TD_CTRL_ACTIVE | dev->speed;
460
        td->buffer = data_dma;
Line 447... Line 461...
447
        td->token  = TOKEN(packet_size,enp->toggle,enp->address,
461
        td->bk     = td_prev;
448
                           dev->addr,dir);
462
 
Line 449... Line 463...
449
        td->buffer = data_dma;
463
        td_prev = td;
Line 450... Line 464...
450
        td->bk     = td_prev;
464
 
451
 
465
        td++;
Line 497... Line 511...
497
 
511
 
Line 498... Line 512...
498
    td0 = dma_pool_alloc(hc->td_pool, 0, &td_dma);
512
    td0 = dma_pool_alloc(hc->td_pool, 0, &td_dma);
499
    td0->dma = td_dma;
513
    td0->dma = td_dma;
Line 500... Line 514...
500
 
514
 
Line 501... Line 515...
501
    dbgprintf("alloc td0 %x dma %x\n", td0, td_dma);
515
//    dbgprintf("alloc td0 %x dma %x\n", td0, td_dma);
502
 
516
 
503
    td0->status = 0x00800000 | dev->speed;
517
    td0->status = 0x00800000 | dev->speed;
504
    td0->token  = TOKEN( 8, DATA0, 0, dev->addr, 0x2D);
518
    td0->token  = TOKEN( 8, DATA0, 0, dev->addr, 0x2D);
Line 519... Line 533...
519
 
533
 
Line 520... Line 534...
520
        td = dma_pool_alloc(hc->td_pool, 0, &td_dma);
534
        td = dma_pool_alloc(hc->td_pool, 0, &td_dma);
521
        td->dma = td_dma;
535
        td->dma = td_dma;
Line 522... Line 536...
522
 
536
 
Line 523... Line 537...
523
        dbgprintf("alloc td %x dma %x\n", td, td->dma);
537
//        dbgprintf("alloc td %x dma %x\n", td, td->dma);
524
 
538
 
525
        td_prev->link   = td->dma | 4;
539
        td_prev->link   = td->dma | 4;
526
        td->status = TD_CTRL_ACTIVE | dev->speed;
540
        td->status = TD_CTRL_ACTIVE | dev->speed;
Line 537... Line 551...
537
 
551
 
Line 538... Line 552...
538
    td = dma_pool_alloc(hc->td_pool, 0, &td_dma);
552
    td = dma_pool_alloc(hc->td_pool, 0, &td_dma);
539
    td->dma = td_dma;
553
    td->dma = td_dma;
Line 540... Line 554...
540
 
554
 
Line 541... Line 555...
541
    dbgprintf("alloc td %x dma %x\n", td, td->dma);
555
//    dbgprintf("alloc td %x dma %x\n", td, td->dma);
Line 542... Line 556...
542
 
556