Rev 4980 | Rev 4985 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4975 | gtament | 1 | ; standard driver stuff |
2 | format MS COFF |
||
3 | |||
4 | DEBUG = 1 |
||
5 | |||
6 | ; this is for DEBUGF macro from 'fdo.inc' |
||
7 | __DEBUG__ = 1 |
||
8 | __DEBUG_LEVEL__ = 1 |
||
9 | |||
4980 | gtament | 10 | include '../../proc32.inc' |
11 | include '../../imports.inc' |
||
12 | include '../../fdo.inc' |
||
13 | include '../../struct.inc' |
||
4975 | gtament | 14 | |
15 | public START |
||
16 | public version |
||
17 | |||
18 | ; USB constants |
||
19 | DEVICE_DESCR_TYPE = 1 |
||
20 | CONFIG_DESCR_TYPE = 2 |
||
21 | STRING_DESCR_TYPE = 3 |
||
22 | INTERFACE_DESCR_TYPE = 4 |
||
23 | ENDPOINT_DESCR_TYPE = 5 |
||
24 | DEVICE_QUALIFIER_DESCR_TYPE = 6 |
||
25 | |||
26 | CONTROL_PIPE = 0 |
||
27 | ISOCHRONOUS_PIPE = 1 |
||
28 | BULK_PIPE = 2 |
||
29 | INTERRUPT_PIPE = 3 |
||
30 | |||
31 | ; USB HID constants |
||
32 | HID_DESCR_TYPE = 21h |
||
33 | REPORT_DESCR_TYPE = 22h |
||
34 | PHYSICAL_DESCR_TYPE = 23h |
||
35 | |||
36 | |||
37 | ; LibUSB constatnts |
||
38 | LIBUSB_REQUEST_TYPE_STANDARD = (0x00 shl 5) |
||
39 | LIBUSB_REQUEST_TYPE_CLASS = (0x01 shl 5) |
||
40 | LIBUSB_REQUEST_TYPE_VENDOR = (0x02 shl 5) |
||
41 | LIBUSB_REQUEST_TYPE_RESERVED = (0x03 shl 5) |
||
42 | |||
43 | LIBUSB_RECIPIENT_DEVICE = 0x00 |
||
44 | LIBUSB_RECIPIENT_INTERFACE = 0x01 |
||
45 | LIBUSB_RECIPIENT_ENDPOINT = 0x02 |
||
46 | LIBUSB_RECIPIENT_OTHER = 0x03 |
||
47 | |||
48 | LIBUSB_ENDPOINT_IN = 0x80 |
||
49 | LIBUSB_ENDPOINT_OUT = 0x00 |
||
50 | |||
51 | ; FTDI Constants |
||
52 | FTDI_DEVICE_OUT_REQTYPE = (LIBUSB_REQUEST_TYPE_VENDOR or LIBUSB_RECIPIENT_DEVICE or LIBUSB_ENDPOINT_OUT) |
||
53 | FTDI_DEVICE_IN_REQTYPE = (LIBUSB_REQUEST_TYPE_VENDOR or LIBUSB_RECIPIENT_DEVICE or LIBUSB_ENDPOINT_IN) |
||
54 | |||
55 | ; Requests |
||
56 | ;Definitions for flow control |
||
57 | SIO_RESET =0 ;Reset the port |
||
58 | SIO_MODEM_CTRL =1 ;Set the modem control register |
||
59 | SIO_SET_FLOW_CTRL =2 ;Set flow control register |
||
60 | SIO_SET_BAUD_RATE =3 ;Set baud rate |
||
61 | SIO_SET_DATA =4 ;Set the data characteristics of the port |
||
62 | |||
63 | SIO_RESET_REQUEST =SIO_RESET |
||
64 | SIO_SET_BAUDRATE_REQUEST =SIO_SET_BAUD_RATE |
||
65 | SIO_SET_DATA_REQUEST =SIO_SET_DATA |
||
66 | SIO_SET_FLOW_CTRL_REQUEST =SIO_SET_FLOW_CTRL |
||
67 | SIO_SET_MODEM_CTRL_REQUEST =SIO_MODEM_CTRL |
||
68 | SIO_POLL_MODEM_STATUS_REQUEST=0x05 |
||
69 | SIO_SET_EVENT_CHAR_REQUEST =0x06 |
||
70 | SIO_SET_ERROR_CHAR_REQUEST =0x07 |
||
71 | SIO_SET_LATENCY_TIMER_REQUEST=0x09 |
||
72 | SIO_GET_LATENCY_TIMER_REQUEST=0x0A |
||
73 | SIO_SET_BITMODE_REQUEST =0x0B |
||
74 | SIO_READ_PINS_REQUEST =0x0C |
||
75 | SIO_READ_EEPROM_REQUEST =0x90 |
||
76 | SIO_WRITE_EEPROM_REQUEST =0x91 |
||
77 | SIO_ERASE_EEPROM_REQUEST =0x92 |
||
78 | |||
79 | |||
80 | SIO_RESET_SIO=0 |
||
81 | SIO_RESET_PURGE_RX=1 |
||
82 | SIO_RESET_PURGE_TX=2 |
||
83 | |||
84 | SIO_DISABLE_FLOW_CTRL=0x0 |
||
85 | SIO_RTS_CTS_HS =(0x1 shl 8) |
||
86 | SIO_DTR_DSR_HS =(0x2 shl 8) |
||
87 | SIO_XON_XOFF_HS=(0x4 shl 8) |
||
88 | |||
89 | SIO_SET_DTR_MASK=0x1 |
||
90 | SIO_SET_DTR_HIGH=( 1 or ( SIO_SET_DTR_MASK shl 8)) |
||
91 | SIO_SET_DTR_LOW =( 0 or ( SIO_SET_DTR_MASK shl 8)) |
||
92 | SIO_SET_RTS_MASK=0x2 |
||
93 | SIO_SET_RTS_HIGH=( 2 or ( SIO_SET_RTS_MASK shl 8 )) |
||
94 | SIO_SET_RTS_LOW =( 0 or ( SIO_SET_RTS_MASK shl 8 )) |
||
95 | |||
96 | SIO_RTS_CTS_HS =(0x1 shl 8) |
||
97 | |||
98 | ;strings |
||
99 | my_driver db 'usbother',0 |
||
100 | nomemory_msg db 'K : no memory',13,10,0 |
||
101 | |||
102 | ; Structures |
||
103 | struct ftdi_context |
||
104 | chipType db ? |
||
105 | baudrate dd ? |
||
106 | bitbangEnabled db ? |
||
107 | readBufPtr dd ? |
||
108 | readBufOffs dd ? |
||
109 | readBufChunkSize dd ? |
||
110 | writeBufChunkSize dd ? |
||
111 | interface dd ? |
||
112 | index dd ? |
||
113 | inEP dd ? |
||
114 | outEP dd ? |
||
115 | nullP dd ? |
||
116 | next_context dd ? |
||
117 | ends |
||
118 | |||
119 | struct IOCTL |
||
120 | handle dd ? |
||
121 | io_code dd ? |
||
122 | input dd ? |
||
123 | inp_size dd ? |
||
124 | output dd ? |
||
125 | out_size dd ? |
||
126 | ends |
||
127 | |||
128 | struct usb_descr |
||
4979 | gtament | 129 | bLength db ? |
130 | bDescriptorType db ? |
||
4975 | gtament | 131 | bcdUSB dw ? |
132 | bDeviceClass db ? |
||
133 | bDeviceSubClass db ? |
||
134 | bDeviceProtocol db ? |
||
135 | bMaxPacketSize0 db ? |
||
136 | idVendor dw ? |
||
137 | idProduct dw ? |
||
138 | bcdDevice dw ? |
||
139 | iManufacturer db ? |
||
140 | iProduct db ? |
||
141 | iSerialNumber db ? |
||
142 | bNumConfigurations db ? |
||
143 | ends |
||
144 | |||
4979 | gtament | 145 | struct conf_packet |
146 | bmRequestType db ? |
||
147 | bRequest db ? |
||
148 | wValue dw ? |
||
149 | wIndex dw ? |
||
150 | wLength dw ? |
||
151 | ends |
||
152 | |||
4975 | gtament | 153 | section '.flat' code readable align 16 |
154 | ; The start procedure. |
||
155 | proc START stdcall, .reason:DWORD |
||
156 | |||
157 | xor eax, eax ; initialize return value |
||
158 | cmp [.reason], 1 ; compare the argument |
||
159 | jnz .nothing |
||
160 | stdcall RegUSBDriver, my_driver, service_proc, usb_functions |
||
161 | |||
162 | .nothing: |
||
4979 | gtament | 163 | ret |
4975 | gtament | 164 | endp |
165 | |||
166 | |||
167 | proc AddDevice stdcall uses ebx, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD |
||
168 | |||
169 | stdcall USBGetParam, [.config_pipe], 0 |
||
4979 | gtament | 170 | DEBUGF 1,'K : Device detected Vendor: %x\n', [eax+usb_descr.idVendor] |
171 | cmp word[eax+usb_descr.idVendor], 0x0403 |
||
4975 | gtament | 172 | jnz .notftdi |
173 | DEBUGF 1,'K : FTDI USB device detected\n' |
||
4984 | gtament | 174 | movi eax, sizeof.ftdi_context |
4975 | gtament | 175 | call Kmalloc |
176 | test eax, eax |
||
177 | jnz @f |
||
178 | mov esi, nomemory_msg |
||
179 | call SysMsgBoardStr |
||
180 | xor eax, eax |
||
181 | jmp .nothing |
||
182 | @@: |
||
183 | DEBUGF 1,'K : Adding struct to list %x\n', eax |
||
184 | call linkedlist.add |
||
185 | |||
186 | mov ebx, [.config_pipe] |
||
187 | mov [eax + ftdi_context.nullP], ebx |
||
188 | |||
189 | DEBUGF 1,'K : Open first pipe\n' |
||
190 | mov ebx, eax |
||
191 | stdcall USBOpenPipe, [.config_pipe], 0x81, 0x40, BULK_PIPE, 0 |
||
192 | mov [ebx + ftdi_context.inEP], eax |
||
193 | DEBUGF 1,'K : Open second pipe\n' |
||
194 | stdcall USBOpenPipe, [.config_pipe], 0x02, 0x40, BULK_PIPE, 0 |
||
195 | mov [ebx + ftdi_context.outEP], eax |
||
196 | |||
197 | .nothing: |
||
198 | ret |
||
199 | .notftdi: |
||
200 | DEBUGF 1,'K : Skipping not FTDI device\n' |
||
201 | xor eax, eax |
||
202 | ret |
||
203 | endp |
||
204 | |||
205 | |||
206 | handle equ IOCTL.handle |
||
207 | io_code equ IOCTL.io_code |
||
208 | input equ IOCTL.input |
||
209 | inp_size equ IOCTL.inp_size |
||
210 | output equ IOCTL.output |
||
211 | out_size equ IOCTL.out_size |
||
212 | |||
213 | align 4 |
||
214 | proc service_proc stdcall uses ebx esi edi, ioctl:DWORD |
||
215 | locals |
||
216 | ConfPacket rb 8 |
||
217 | EventData rd 2 |
||
218 | endl |
||
4979 | gtament | 219 | mov edi, [ioctl] |
220 | mov eax, [edi + io_code] |
||
4975 | gtament | 221 | DEBUGF 1,'K : FTDI got the request: %d\n', eax |
4979 | gtament | 222 | test eax, eax ;0 |
223 | jz .version |
||
224 | dec eax ;1 |
||
225 | jz .ftdi_get_list |
||
226 | dec eax ;2 |
||
227 | jz .ftdi_set_bitmode |
||
4984 | gtament | 228 | dec eax ;3 |
229 | jz .ftdi_setrtshigh |
||
230 | dec eax ;4 |
||
231 | jz .ftdi_setrtslow |
||
4975 | gtament | 232 | |
233 | .version: |
||
234 | .endswitch: |
||
4979 | gtament | 235 | xor eax, eax |
4975 | gtament | 236 | ret |
237 | |||
238 | .ftdi_set_bitmode: |
||
239 | DEBUGF 1,'K : FTDI Seting bitmode\n' |
||
4979 | gtament | 240 | xor ecx, ecx |
241 | xor esi, esi |
||
4975 | gtament | 242 | call CreateEvent |
4979 | gtament | 243 | mov edi, [ioctl] |
4975 | gtament | 244 | mov [EventData], eax |
4980 | gtament | 245 | mov [EventData+4], edx |
4984 | gtament | 246 | mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8) |
4975 | gtament | 247 | mov edi, [edi+input] |
4979 | gtament | 248 | mov dx, word[edi+4] |
4984 | gtament | 249 | mov word[ConfPacket+2], dx |
250 | mov dword[ConfPacket+4], 0 |
||
4979 | gtament | 251 | DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4] |
252 | mov ebx, [edi] |
||
4975 | gtament | 253 | lea esi, [ConfPacket] |
4979 | gtament | 254 | lea edi, [EventData] |
4975 | gtament | 255 | stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0, 0, control_callback, edi, 0 |
256 | DEBUGF 1, 'K : Returned value is %d\n', eax |
||
4979 | gtament | 257 | mov eax, [EventData] |
258 | mov ebx, [EventData+4] |
||
4975 | gtament | 259 | call WaitEvent |
260 | jmp .endswitch |
||
4979 | gtament | 261 | |
4984 | gtament | 262 | .ftdi_setrtshigh: |
263 | DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n' |
||
264 | xor ecx, ecx |
||
265 | xor esi, esi |
||
266 | call CreateEvent |
||
267 | mov edi, [ioctl] |
||
268 | mov [EventData], eax |
||
269 | mov [EventData+4], edx |
||
270 | mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_HIGH shl 16) |
||
271 | mov dword[ConfPacket+4], 0 |
||
272 | DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4] |
||
273 | mov edi, [edi+input] |
||
274 | mov ebx, [edi] |
||
275 | lea esi, [ConfPacket] |
||
276 | lea edi, [EventData] |
||
277 | stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0, 0, control_callback, edi, 0 |
||
278 | DEBUGF 1, 'K : Returned value is %d\n', eax |
||
279 | mov eax, [EventData] |
||
280 | mov ebx, [EventData+4] |
||
281 | call WaitEvent |
||
282 | jmp .endswitch |
||
283 | |||
284 | .ftdi_setrtslow: |
||
285 | DEBUGF 1,'K : FTDI Setting RTS pin HIGH\n' |
||
286 | xor ecx, ecx |
||
287 | xor esi, esi |
||
288 | call CreateEvent |
||
289 | mov edi, [ioctl] |
||
290 | mov [EventData], eax |
||
291 | mov [EventData+4], edx |
||
292 | mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) + (SIO_SET_MODEM_CTRL_REQUEST shl 8) + (SIO_SET_RTS_LOW shl 16) |
||
293 | mov dword[ConfPacket+4], 0 |
||
294 | DEBUGF 1,'K : ConfPacket %x %x\n', [ConfPacket], [ConfPacket+4] |
||
295 | mov edi, [edi+input] |
||
296 | mov ebx, [edi] |
||
297 | lea esi, [ConfPacket] |
||
298 | lea edi, [EventData] |
||
299 | stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0, 0, control_callback, edi, 0 |
||
300 | DEBUGF 1, 'K : Returned value is %d\n', eax |
||
301 | mov eax, [EventData] |
||
302 | mov ebx, [EventData+4] |
||
303 | call WaitEvent |
||
304 | jmp .endswitch |
||
305 | |||
4975 | gtament | 306 | .ftdi_read_pins: |
307 | DEBUGF 1,'K : FTDI Reading pins\n' |
||
308 | call CreateEvent |
||
309 | mov [EventData], eax |
||
4979 | gtament | 310 | mov [EventData+4], edx |
4975 | gtament | 311 | mov eax, FTDI_DEVICE_IN_REQTYPE + (SIO_READ_PINS_REQUEST shl 8) |
312 | mov dword[ConfPacket], eax |
||
313 | jmp .endswitch |
||
4979 | gtament | 314 | |
4975 | gtament | 315 | .ftdi_get_list: |
4979 | gtament | 316 | call linkedlist.gethead |
4975 | gtament | 317 | mov edi, [edi+output] |
4979 | gtament | 318 | mov [edi], eax |
319 | DEBUGF 1, 'K : FTDI Device pointer %x\n', [edi] |
||
320 | mov eax, 4 |
||
4975 | gtament | 321 | mov [edi+out_size], eax |
322 | jmp .endswitch |
||
323 | endp |
||
324 | restore handle |
||
325 | restore io_code |
||
326 | restore input |
||
327 | restore inp_size |
||
328 | restore output |
||
329 | restore out_size |
||
330 | |||
331 | |||
332 | align 4 |
||
4984 | gtament | 333 | proc control_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, .buffer:DWORD, .length:DWORD, .calldata:DWORD |
4975 | gtament | 334 | |
4984 | gtament | 335 | DEBUGF 1, 'K : status is %d\n', [.status+24h] |
4980 | gtament | 336 | mov ecx, [.calldata] |
337 | mov eax, [ecx] |
||
338 | mov ebx, [ecx+4] |
||
4979 | gtament | 339 | xor edx, edx |
4975 | gtament | 340 | call RaiseEvent |
4984 | gtament | 341 | |
4975 | gtament | 342 | ret |
343 | endp |
||
344 | |||
345 | |||
346 | proc DeviceDisconnected stdcall uses ebx esi edi, .device_data:DWORD |
||
347 | |||
348 | DEBUGF 1, 'K : FTDI deleting device data\n' |
||
349 | mov eax, [.device_data] |
||
4979 | gtament | 350 | call linkedlist.delete |
351 | ret |
||
4975 | gtament | 352 | endp |
353 | |||
354 | include 'linkedlist.inc' |
||
355 | |||
356 | ; Exported variable: kernel API version. |
||
357 | align 4 |
||
358 | version dd 50005h |
||
359 | ; Structure with callback functions. |
||
360 | usb_functions: |
||
361 | dd 12 |
||
362 | dd AddDevice |
||
363 | dd DeviceDisconnected |
||
364 | |||
365 | ;for DEBUGF macro |
||
366 | include_debug_strings |
||
367 | |||
368 | |||
369 | |||
370 | |||
371 | ; for uninitialized data |
||
372 | ;section '.data' data readable writable align 16 |