Subversion Repositories Kolibri OS

Rev

Rev 1875 | Blame | Last modification | View Log | Download | RSS feed

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