Subversion Repositories Kolibri OS

Rev

Rev 1613 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1613 Rev 1616
1
#include 
1
#include 
2
#include 
2
#include 
3
#include 
3
#include 
4
 
4
#include 
5
//#include 
-
 
6
//#include 
-
 
7
//#include 
5
#include 
8
 
-
 
9
 
-
 
10
#include 
-
 
11
#include "usb.h"
6
#include "usb.h"
12
 
7
 
13
 
8
int __stdcall srv_usb(ioctl_t *io);
14
int __stdcall srv_usb(ioctl_t *io);
-
 
15
 
9
 
16
bool init_hc(hc_t *hc);
10
bool init_hc(hc_t *hc);
17
 
11
 
18
static slab_t   qh_slab;
12
static slab_t   qh_slab;
19
static slab_t   td_slab;
13
 
20
 
14
LIST_HEAD( hc_list );
21
LIST_HEAD( hc_list );
-
 
22
LIST_HEAD( newdev_list );
15
LIST_HEAD( newdev_list );
23
LIST_HEAD( rq_list );
16
LIST_HEAD( rq_list );
24
 
17
 
25
u32_t drvEntry(int action, char *cmdline)
18
u32_t drvEntry(int action, char *cmdline)
26
{
19
{
27
    u32_t   retval;
20
    u32_t   retval;
28
    hc_t   *hc;
21
    hc_t   *hc;
29
    udev_t *dev;
22
    udev_t *dev;
30
 
23
 
31
    int     i;
24
    int     i;
32
 
25
 
33
    if(action != 1)
26
    if(action != 1)
34
        return 0;
27
        return 0;
35
 
28
 
36
    if(!dbg_open("/rd/1/drivers/usb.log"))
29
    if(!dbg_open("/rd/1/drivers/usb.log"))
37
    {
30
    {
38
        printf("Can't open /rd/1/drivers/usb.log\nExit\n");
31
        printf("Can't open /rd/1/drivers/usb.log\nExit\n");
39
        return 0;
32
        return 0;
40
    }
33
    }
41
 
34
 
42
    if( !FindUSBControllers() ) {
35
    if( !FindUSBControllers() ) {
43
        dbgprintf("no uhci devices found\n");
36
        dbgprintf("no uhci devices found\n");
44
        return 0;
37
        return 0;
45
    };
38
    };
46
 
39
 
47
     qh_slab.available = 256;
40
     qh_slab.available = 256;
48
     qh_slab.start     = KernelAlloc(4096);
41
     qh_slab.start     = KernelAlloc(4096);
49
     qh_slab.nextavail = (addr_t)qh_slab.start;
42
     qh_slab.nextavail = (addr_t)qh_slab.start;
50
     qh_slab.dma       = GetPgAddr(qh_slab.start);
43
     qh_slab.dma       = GetPgAddr(qh_slab.start);
51
 
44
 
52
     qh_t    *p;
45
     qh_t    *p;
53
     addr_t  dma;
46
     addr_t  dma;
54
 
47
 
55
     for (i = 0, p = (qh_t*)qh_slab.start, dma = qh_slab.dma;
48
     for (i = 0, p = (qh_t*)qh_slab.start, dma = qh_slab.dma;
56
          i < 256; i++, p++, dma+= sizeof(qh_t))
49
          i < 256; i++, p++, dma+= sizeof(qh_t))
57
     {
50
     {
58
        p->qlink  = (addr_t)(p+1);
51
        p->qlink  = (addr_t)(p+1);
59
        p->qelem  = 1;
52
        p->qelem  = 1;
60
        p->dma    = dma;
53
        p->dma    = dma;
61
        p->r1     = 0;
54
        p->r1     = 0;
62
     };
55
     };
63
 
56
 
64
     td_slab.available = 128;
57
    hc = (hc_t*)hc_list.next;
65
     td_slab.start     = KernelAlloc(4096);
-
 
66
     td_slab.nextavail = (addr_t)td_slab.start;
-
 
67
     td_slab.dma       = GetPgAddr(td_slab.start);
-
 
68
 
-
 
69
     td_t *td;
-
 
70
     for (i = 0, td = (td_t*)td_slab.start, dma = td_slab.dma;
-
 
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
    hc = (hc_t*)hc_list.next;
-
 
82
 
58
 
83
    while( &hc->list != &hc_list)
59
    while( &hc->list != &hc_list)
84
    {
60
    {
85
        init_hc(hc);
61
        hc_t *tmp = hc;
86
        hc = (hc_t*)hc->list.next;
62
        hc = (hc_t*)hc->list.next;
87
    }
63
 
88
 
64
        if( !init_hc(tmp))
-
 
65
            list_del(&tmp->list);
-
 
66
    };
-
 
67
 
89
    dbgprintf("\n");
68
    dbgprintf("\n");
90
 
69
 
91
    dev = (udev_t*)newdev_list.next;
70
    dev = (udev_t*)newdev_list.next;
92
    while( &dev->list != &newdev_list)
71
    while( &dev->list != &newdev_list)
93
    {
72
    {
94
        udev_t *tmp = dev;
73
        udev_t *tmp = dev;
95
        dev = (udev_t*)dev->list.next;
74
        dev = (udev_t*)dev->list.next;
96
 
75
 
97
        if(tmp->id != 0)
76
        if(tmp->id != 0)
98
            init_device(tmp);
77
            init_device(tmp);
99
    }
78
    }
100
 
79
 
101
    while(1)
80
    while(1)
102
    {
81
    {
103
        udev_t    *dev;
82
        udev_t    *dev;
104
        request_t *rq;
83
        request_t *rq;
105
        kevent_t    event;
84
        kevent_t    event;
106
        u32_t       handle;
85
        u32_t       handle;
107
 
86
 
108
        event.code    = 0;
87
        event.code    = 0;
109
        event.data[0] = 0;
88
        event.data[0] = 0;
110
 
89
 
111
        handle = GetEvent(&event);
90
        handle = GetEvent(&event);
112
 
91
 
113
//        dbgprintf("event handle 0x%0x code 0x%0x\n",
92
//        dbgprintf("event handle 0x%0x code 0x%0x\n",
114
//                   handle, event.code);
93
//                   handle, event.code);
115
 
94
 
116
        if(event.code != 0xFF000001)
95
        if(event.code != 0xFF000001)
117
            continue;
96
            continue;
118
 
97
 
119
        rq = (request_t*)event.data[0];
98
        rq = (request_t*)event.data[0];
120
 
99
 
121
//        dbgprintf("rq = 0x%0x\n", rq);
100
//        dbgprintf("rq = 0x%0x\n", rq);
122
 
101
 
123
        rq->handler(rq->dev, rq);
102
        rq->handler(rq->dev, rq);
124
    };
103
    };
125
 
104
 
126
    retval = RegService("USB", srv_usb);
105
    retval = RegService("USB", srv_usb);
127
    dbgprintf("reg service USB as: %x\n", retval);
106
    dbgprintf("reg service USB as: %x\n", retval);
128
 
107
 
129
    return retval;
108
    return retval;
130
};
109
};
131
 
110
 
132
 
111
 
133
#define API_VERSION     0x01000100
112
#define API_VERSION     0x01000100
134
 
113
 
135
#define SRV_GETVERSION  0
114
#define SRV_GETVERSION  0
136
 
115
 
137
 
116
 
138
int __stdcall srv_usb(ioctl_t *io)
117
int __stdcall srv_usb(ioctl_t *io)
139
{
118
{
140
  u32_t *inp;
119
  u32_t *inp;
141
  u32_t *outp;
120
  u32_t *outp;
142
 
121
 
143
  inp = io->input;
122
  inp = io->input;
144
  outp = io->output;
123
  outp = io->output;
145
 
124
 
146
  switch(io->io_code)
125
  switch(io->io_code)
147
  {
126
  {
148
    case SRV_GETVERSION:
127
    case SRV_GETVERSION:
149
      if(io->out_size==4)
128
      if(io->out_size==4)
150
      {
129
      {
151
        *outp = API_VERSION;
130
        *outp = API_VERSION;
152
        return 0;
131
        return 0;
153
      }
132
      }
154
      break;
133
      break;
155
 
134
 
156
 
135
 
157
    default:
136
    default:
158
      return ERR_PARAM;
137
      return ERR_PARAM;
159
  };
138
  };
160
  return ERR_PARAM;
139
  return ERR_PARAM;
161
}
140
}
162
 
141
 
163
 
142
 
164
static qh_t* alloc_qh()
143
static qh_t* alloc_qh()
165
{
144
{
166
    if( qh_slab.available )
145
    if( qh_slab.available )
167
    {
146
    {
168
        qh_t *qh;
147
        qh_t *qh;
169
 
148
 
170
        qh_slab.available--;
149
        qh_slab.available--;
171
        qh = (qh_t*)qh_slab.nextavail;
150
        qh = (qh_t*)qh_slab.nextavail;
172
        qh_slab.nextavail = qh->qlink;
151
        qh_slab.nextavail = qh->qlink;
173
        return qh;
152
        return qh;
174
     }
153
     }
175
     return NULL;
154
     return NULL;
176
};
155
};
177
 
156
 
178
static void  free_qh(qh_t *qh)
157
static void  free_qh(qh_t *qh)
179
{
158
{
180
     qh->qlink = qh_slab.nextavail;
159
     qh->qlink = qh_slab.nextavail;
181
     qh_slab.nextavail = (addr_t)qh;
160
     qh_slab.nextavail = (addr_t)qh;
182
     qh_slab.available++;
161
     qh_slab.available++;
183
};
162
};
184
 
163
 
185
static td_t* alloc_td()
164
 
186
{
-
 
187
    if( td_slab.available )
-
 
188
    {
-
 
189
        td_t *td;
-
 
190
 
-
 
191
        td_slab.available--;
-
 
192
        td = (td_t*)td_slab.nextavail;
-
 
193
        td_slab.nextavail = td->link;
-
 
194
        return td;
-
 
195
     }
-
 
196
     return NULL;
-
 
197
};
-
 
198
 
-
 
199
static void  free_td(td_t *td)
-
 
200
{
-
 
201
     td->link = td_slab.nextavail;
-
 
202
     td_slab.nextavail = (addr_t)td;
-
 
203
     td_slab.available++;
-
 
204
};
-
 
205
 
-
 
206
#include "pci.inc"
165
#include "pci.inc"
207
#include "detect.inc"
166
#include "detect.inc"
208
#include "hcd.inc"
167
#include "hcd.inc"
209
#include "hid.inc"
168
#include "hid.inc"