Subversion Repositories Kolibri OS

Rev

Rev 4979 | Go to most recent revision | Details | 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
 
10
include '../proc32.inc'
11
include '../imports.inc'
12
include '../fdo.inc'
13
include '../../struct.inc'
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
129
bcdUSB                  dw      ?
130
bDeviceClass            db      ?
131
bDeviceSubClass         db      ?
132
bDeviceProtocol         db      ?
133
bMaxPacketSize0         db      ?
134
idVendor                dw      ?
135
idProduct               dw      ?
136
bcdDevice               dw      ?
137
iManufacturer           db      ?
138
iProduct                db      ?
139
iSerialNumber           db      ?
140
bNumConfigurations      db      ?
141
ends
142
 
143
section '.flat' code readable align 16
144
; The start procedure.
145
proc START stdcall, .reason:DWORD
146
 
147
        xor     eax, eax        ; initialize return value
148
        cmp     [.reason], 1    ; compare the argument
149
        jnz     .nothing
150
        call    linkedlist.init
151
        stdcall RegUSBDriver, my_driver, service_proc, usb_functions
152
 
153
.nothing:
154
        ret     4
155
endp
156
 
157
 
158
proc AddDevice stdcall uses ebx, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD
159
 
160
        stdcall USBGetParam, [.config_pipe], 0
161
        cmp     [eax+usb_descr.idVendor], 0x0403
162
        jnz     .notftdi
163
        DEBUGF 1,'K : FTDI USB device detected\n'
164
        movi    eax, sizeof.ftdi_context
165
        call    Kmalloc
166
        test    eax, eax
167
        jnz     @f
168
        mov     esi, nomemory_msg
169
        call    SysMsgBoardStr
170
        xor     eax, eax
171
        jmp     .nothing
172
@@:
173
        DEBUGF 1,'K : Adding struct to list %x\n', eax
174
        call    linkedlist.add
175
 
176
        mov     ebx, [.config_pipe]
177
        mov     [eax + ftdi_context.nullP], ebx
178
 
179
        DEBUGF 1,'K : Open first pipe\n'
180
        mov     ebx, eax
181
        stdcall USBOpenPipe, [.config_pipe],  0x81,  0x40,  BULK_PIPE, 0
182
        mov     [ebx + ftdi_context.inEP], eax
183
        DEBUGF 1,'K : Open second pipe\n'
184
        stdcall USBOpenPipe, [.config_pipe],  0x02,  0x40,  BULK_PIPE, 0
185
        mov     [ebx + ftdi_context.outEP], eax
186
 
187
  .nothing:
188
        ret
189
  .notftdi:
190
        DEBUGF 1,'K : Skipping not FTDI device\n'
191
        xor     eax, eax
192
        ret
193
endp
194
 
195
 
196
handle     equ  IOCTL.handle
197
io_code    equ  IOCTL.io_code
198
input      equ  IOCTL.input
199
inp_size   equ  IOCTL.inp_size
200
output     equ  IOCTL.output
201
out_size   equ  IOCTL.out_size
202
 
203
align 4
204
proc service_proc stdcall uses ebx esi edi, ioctl:DWORD
205
locals
206
ConfPacket  rb  8
207
EventData   rd  2
208
endl
209
        mov edi, [ioctl]
210
        mov eax, [edi + io_code]
211
        DEBUGF 1,'K : FTDI got the request: %d\n', eax
212
        test eax, eax           ;0
213
        jz  .version
214
        dec eax                 ;1
215
        jz  .ftdi_get_list
216
        dec eax                 ;2
217
        jz  .ftdi_set_bitmode
218
 
219
  .version:
220
  .endswitch:
221
        xor eax, eax
222
	    ret
223
 
224
  .ftdi_set_bitmode:
225
        DEBUGF 1,'K : FTDI Seting bitmode\n'
226
        call    CreateEvent
227
        DEBUGF 1,'K : Event created %x %x\n' , eax, edx
228
        mov     [EventData], eax
229
        mov     [EventData+1], edx
230
        mov     si, (FTDI_DEVICE_IN_REQTYPE) + (SIO_SET_BITMODE_REQUEST shl 8)
231
        mov     word[ConfPacket], si
232
        mov     edi, [edi+input]
233
        mov     si, word[edi+1]
234
        DEBUGF 1,'K : Pin value is %x\n', si
235
        mov     word[ConfPacket+4], si
236
        mov     ebx, [edi]
237
        lea     esi, [ConfPacket]
238
        lea     edi, [EventData]
239
        stdcall USBControlTransferAsync, [ebx + ftdi_context.nullP],  esi, 0, 0, control_callback, edi, 0
240
        DEBUGF 1, 'K : Returned value is %d\n', eax
241
        call    WaitEvent
242
        jmp     .endswitch
243
  .ftdi_read_pins:
244
        DEBUGF 1,'K : FTDI Reading pins\n'
245
        call    CreateEvent
246
        mov     [EventData], eax
247
        mov     [EventData+1], edx
248
        mov     eax, FTDI_DEVICE_IN_REQTYPE + (SIO_READ_PINS_REQUEST shl 8)
249
        mov     dword[ConfPacket], eax
250
        jmp     .endswitch
251
   .ftdi_get_list:
252
        call    linkedlist.gethead
253
        DEBUGF 1, 'K : FTDI Device pointer %x\n' , eax
254
        mov     edi, [edi+output]
255
        mov     edi, eax
256
        mov     eax, 4
257
        mov     edi, [ioctl]
258
        mov     [edi+out_size], eax
259
        jmp     .endswitch
260
endp
261
restore   handle
262
restore   io_code
263
restore   input
264
restore   inp_size
265
restore   output
266
restore   out_size
267
 
268
 
269
align 4
270
proc control_callback stdcall uses ebx, .pipe:DWORD, .status:DWORD, .buffer:DWORD, .length:DWORD, .calldata:DWORD
271
 
272
        mov     eax, [.calldata]
273
        mov     ebx, [.calldata+1]
274
        call    RaiseEvent
275
        DEBUGF 1, 'K : status is %d\n', [.status+24h]
276
        ret
277
endp
278
 
279
 
280
proc DeviceDisconnected stdcall uses  ebx esi edi, .device_data:DWORD
281
 
282
        DEBUGF 1, 'K : FTDI deleting device data\n'
283
        mov     eax, [.device_data]
284
        ;call    linkedlist.delete
285
endp
286
 
287
include 'linkedlist.inc'
288
 
289
; Exported variable: kernel API version.
290
align 4
291
version dd      50005h
292
; Structure with callback functions.
293
usb_functions:
294
        dd      12
295
        dd      AddDevice
296
        dd      DeviceDisconnected
297
 
298
;for DEBUGF macro
299
include_debug_strings
300
 
301
 
302
 
303
 
304
; for uninitialized data
305
;section '.data' data readable writable align 16