Subversion Repositories Kolibri OS

Rev

Rev 1430 | Go to most recent revision | Details | Compare with Previous | 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
            qh  = dev->host->qh1;
115
116
            qh->qelem = td->dma;
117
 
118
            __asm__ __volatile__ ("":::"memory");
119
 
120
        };
1600 serge 121
1029 serge 122
        delay(10/10);
123
 
124
        rq = (request_t*)rq_list.next;
125
 
126
        {
1600 serge 127
            request_t *tmp;
1029 serge 128
            td_t      *td;
129
130
            tmp = rq;
131
 
132
1600 serge 133
            td  = tmp->td_head;
1029 serge 134
 
135
            if( td->status & TD_CTRL_ACTIVE)
136
 
137
138
            tmp->handler(tmp->dev, tmp);
139
 
140
    };
141
142
    retval = RegService("USB", srv_usb);
143
 
144
145
    return retval;
146
 
147
148
149
 
150
 
151
#define SRV_GETVERSION  0
152
 
153
154
 
155
 
156
  u32_t *inp;
157
  u32_t *outp;
158
159
  inp = io->input;
160
 
161
162
  switch(io->io_code)
163
 
164
    case SRV_GETVERSION:
165
      if(io->out_size==4)
166
      {
167
        *outp = API_VERSION;
168
        return 0;
169
      }
170
      break;
171
172
173
 
174
 
175
  };
176
  return ERR_PARAM;
177
}
178
179
180
 
181
 
182
    if( qh_slab.available )
183
    {
184
        qh_t *qh;
185
186
        qh_slab.available--;
187
 
188
        qh_slab.nextavail = qh->qlink;
189
        return qh;
190
     }
191
     return NULL;
192
};
193
194
static void  free_qh(qh_t *qh)
195
 
196
     qh->qlink = qh_slab.nextavail;
197
     qh_slab.nextavail = (addr_t)qh;
198
     qh_slab.available++;
199
};
200
201
static td_t* alloc_td()
202
 
203
    if( td_slab.available )
204
    {
205
        td_t *td;
206
207
        td_slab.available--;
208
 
209
        td_slab.nextavail = td->link;
210
        return td;
211
     }
212
     return NULL;
213
};
214
215
static void  free_td(td_t *td)
216
 
217
     td->link = td_slab.nextavail;
218
     td_slab.nextavail = (addr_t)td;
219
     td_slab.available++;
220
};
221
222
#include "pci.inc"
223
 
224
#include "hcd.inc"
225
#include "hid.inc"
226