Subversion Repositories Kolibri OS

Rev

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