Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 serge 1
 
2
 
3
4
#include 
5
 
6
#include 
7
8
#include "pci.h"
9
 
10
#include "syscall.h"
11
 
12
13
static Bool FindPciDevice();
14
 
15
int __stdcall srv_usb(ioctl_t *io);
16
 
17
Bool init_hc(hc_t *hc);
18
 
19
static slab_t   qh_slab;
20
 
21
22
static link_t  hc_list;
23
 
24
static link_t  rq_list;
25
26
u32_t __stdcall drvEntry(int action)
27
 
28
    u32_t   retval;
29
    hc_t   *hc;
30
    udev_t *dev;
31
32
    int     i;
33
 
34
    if(action != 1)
35
 
36
37
    if(!dbg_open("/rd/1/drivers/usb.log"))
38
 
39
        printf("Can't open /rd/1/drivers/usb.log\nExit\n");
40
        return 0;
41
    }
42
43
    list_initialize(&hc_list);
44
 
45
    list_initialize(&rq_list);
46
47
    if( !FindPciDevice() ) {
48
 
49
        return 0;
50
    };
51
52
     qh_slab.available = 256;
53
 
54
     qh_slab.nextavail = (addr_t)qh_slab.start;
55
     qh_slab.dma       = GetPgAddr(qh_slab.start);
56
57
     qh_t    *p;
58
 
59
60
     for (i = 0, p = (qh_t*)qh_slab.start, dma = qh_slab.dma;
61
 
62
     {
63
        p->qlink  = (addr_t)(p+1);
64
        p->qelem  = 1;
65
        p->dma    = dma;
66
        p->r1     = 0;
67
     };
68
69
     td_slab.available = 128;
70
 
71
     td_slab.nextavail = (addr_t)td_slab.start;
72
     td_slab.dma       = GetPgAddr(td_slab.start);
73
74
     td_t *td;
75
 
76
          i < 128; i++, td++, dma+= sizeof(td_t))
77
     {
78
        td->link   = (addr_t)(td+1);
79
        td->status = 0;
80
        td->token  = 0;
81
        td->buffer = 0;
82
        td->dma    = dma;
83
     };
84
85
86
 
87
 
88
    while( &hc->link != &hc_list)
89
 
90
        init_hc(hc);
91
        hc = (hc_t*)hc->link.next;
92
    }
93
94
    dbgprintf("\n");
95
 
96
    dev = (udev_t*)newdev_list.next;
97
 
98
    {
99
        udev_t *tmp = dev;
100
        dev = (udev_t*)dev->link.next;
101
102
        if(tmp->id != 0)
103
 
104
    }
105
106
    while(1)
107
 
108
        udev_t    *dev;
109
        request_t *rq;
110
111
        rq = (request_t*)rq_list.next;
112
 
113
        {
114
            qh_t      *qh;
115
            td_t      *td;
116
117
            td  = rq->td_head;
118
 
119
            qh  = dev->host->qh1;
120
121
            qh->qelem = td->dma;
122
 
123
            __asm__ __volatile__ ("":::"memory");
124
 
125
        };
126
127
        delay(10/10);
128
 
129
        rq = (request_t*)rq_list.next;
130
 
131
        {
132
            request_t *tmp;
133
            td_t      *td;
134
135
            tmp = rq;
136
 
137
138
            td  = tmp->td_head;
139
 
140
            if( td->status & TD_CTRL_ACTIVE)
141
 
142
143
            tmp->handler(tmp->dev, tmp);
144
 
145
    };
146
147
    retval = RegService("USB", srv_usb);
148
 
149
150
    return retval;
151
 
152
153
154
 
155
 
156
#define SRV_GETVERSION  0
157
 
158
159
 
160
 
161
  u32_t *inp;
162
  u32_t *outp;
163
164
  inp = io->input;
165
 
166
167
  switch(io->io_code)
168
 
169
    case SRV_GETVERSION:
170
      if(io->out_size==4)
171
      {
172
        *outp = API_VERSION;
173
        return 0;
174
      }
175
      break;
176
177
178
 
179
 
180
  };
181
  return ERR_PARAM;
182
}
183
184
185
 
186
 
187
    if( qh_slab.available )
188
    {
189
        qh_t *qh;
190
191
        qh_slab.available--;
192
 
193
        qh_slab.nextavail = qh->qlink;
194
        return qh;
195
     }
196
     return NULL;
197
};
198
199
static void  free_qh(qh_t *qh)
200
 
201
     qh->qlink = qh_slab.nextavail;
202
     qh_slab.nextavail = (addr_t)qh;
203
     qh_slab.available++;
204
};
205
206
static td_t* alloc_td()
207
 
208
    if( td_slab.available )
209
    {
210
        td_t *td;
211
212
        td_slab.available--;
213
 
214
        td_slab.nextavail = td->link;
215
        return td;
216
     }
217
     return NULL;
218
};
219
220
static void  free_td(td_t *td)
221
 
222
     td->link = td_slab.nextavail;
223
     td_slab.nextavail = (addr_t)td;
224
     td_slab.available++;
225
};
226
227
#include "pci.inc"
228
 
229
#include "hcd.inc"
230
#include "hid.inc"
231