Subversion Repositories Kolibri OS

Rev

Rev 1616 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. #include <ddk.h>
  4. #include <mutex.h>
  5. #include <pci.h>
  6. #include <linux/dmapool.h>
  7. #include <linux/string.h>
  8. #include <syscall.h>
  9. #include "usb.h"
  10.  
  11. int __stdcall srv_usb(ioctl_t *io);
  12.  
  13. bool init_hc(hc_t *hc);
  14.  
  15. static slab_t   qh_slab;
  16.  
  17. LIST_HEAD( hc_list );
  18. LIST_HEAD( newdev_list );
  19. LIST_HEAD( rq_list );
  20.  
  21. u32_t drvEntry(int action, char *cmdline)
  22. {
  23.     u32_t   retval;
  24.     hc_t   *hc;
  25.     udev_t *dev;
  26.  
  27.     int     i;
  28.  
  29.     if(action != 1)
  30.         return 0;
  31.  
  32.     if(!dbg_open("/rd/1/drivers/usb.log"))
  33.     {
  34.         printf("Can't open /rd/1/drivers/usb.log\nExit\n");
  35.         return 0;
  36.     }
  37.  
  38.     if( !FindUSBControllers() ) {
  39.         dbgprintf("no uhci devices found\n");
  40.         return 0;
  41.     };
  42.  
  43.     hcd_buffer_create();
  44.  
  45.     qh_slab.available = 256;
  46.     qh_slab.start     = KernelAlloc(4096);
  47.     qh_slab.nextavail = (addr_t)qh_slab.start;
  48.     qh_slab.dma       = GetPgAddr(qh_slab.start);
  49.  
  50.     qh_t    *p;
  51.     addr_t  dma;
  52.  
  53.     for (i = 0, p = (qh_t*)qh_slab.start, dma = qh_slab.dma;
  54.          i < 256; i++, p++, dma+= sizeof(qh_t))
  55.     {
  56.        p->qlink  = (addr_t)(p+1);
  57.        p->qelem  = 1;
  58.        p->dma    = dma;
  59.        p->r1     = 0;
  60.     };
  61.  
  62.     hc = (hc_t*)hc_list.next;
  63.  
  64.     while( &hc->list != &hc_list)
  65.     {
  66.         hc_t *tmp = hc;
  67.         hc = (hc_t*)hc->list.next;
  68.  
  69.         if( !init_hc(tmp))
  70.             list_del(&tmp->list);
  71.     };
  72.  
  73.     dbgprintf("\n");
  74.  
  75.     dev = (udev_t*)newdev_list.next;
  76.     while( &dev->list != &newdev_list)
  77.     {
  78.         udev_t *tmp = dev;
  79.         dev = (udev_t*)dev->list.next;
  80.  
  81.         if(tmp->id != 0)
  82.             init_device(tmp);
  83.     }
  84.  
  85.     while(1)
  86.     {
  87.         udev_t    *dev;
  88.         request_t *rq;
  89.         kevent_t    event;
  90.         u32_t       handle;
  91.  
  92.         event.code    = 0;
  93.         event.data[0] = 0;
  94.  
  95.         handle = GetEvent(&event);
  96.  
  97. //        dbgprintf("event handle 0x%0x code 0x%0x\n",
  98. //                   handle, event.code);
  99.  
  100.         if(event.code != 0xFF000001)
  101.             continue;
  102.  
  103.         rq = (request_t*)event.data[0];
  104.  
  105. //        dbgprintf("rq = 0x%0x\n", rq);
  106.  
  107.         rq->handler(rq->dev, rq);
  108.     };
  109.  
  110.     retval = RegService("USB", srv_usb);
  111.     dbgprintf("reg service USB as: %x\n", retval);
  112.  
  113.     return retval;
  114. };
  115.  
  116.  
  117. #define API_VERSION     0x01000100
  118.  
  119. #define SRV_GETVERSION  0
  120.  
  121.  
  122. int __stdcall srv_usb(ioctl_t *io)
  123. {
  124.   u32_t *inp;
  125.   u32_t *outp;
  126.  
  127.   inp = io->input;
  128.   outp = io->output;
  129.  
  130.   switch(io->io_code)
  131.   {
  132.     case SRV_GETVERSION:
  133.       if(io->out_size==4)
  134.       {
  135.         *outp = API_VERSION;
  136.         return 0;
  137.       }
  138.       break;
  139.  
  140.  
  141.     default:
  142.       return ERR_PARAM;
  143.   };
  144.   return ERR_PARAM;
  145. }
  146.  
  147.  
  148. static qh_t* alloc_qh()
  149. {
  150.     if( qh_slab.available )
  151.     {
  152.         qh_t *qh;
  153.  
  154.         qh_slab.available--;
  155.         qh = (qh_t*)qh_slab.nextavail;
  156.         qh_slab.nextavail = qh->qlink;
  157.         return qh;
  158.      }
  159.      return NULL;
  160. };
  161.  
  162. static void  free_qh(qh_t *qh)
  163. {
  164.      qh->qlink = qh_slab.nextavail;
  165.      qh_slab.nextavail = (addr_t)qh;
  166.      qh_slab.available++;
  167. };
  168.  
  169.  
  170. #include "pci.inc"
  171. #include "detect.inc"
  172. #include "hcd.inc"
  173. #include "hid.inc"
  174.