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"> |