Subversion Repositories Kolibri OS

Rev

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;