Subversion Repositories Kolibri OS

Rev

Rev 1613 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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