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