Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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