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