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