Subversion Repositories Kolibri OS

Rev

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