Subversion Repositories Kolibri OS

Rev

Rev 1161 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1159 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
;driver sceletone
9
 
10
format MS COFF
11
 
12
API_VERSION     equ 0  ;debug
13
 
14
include '../proc32.inc'
15
include '../imports.inc'
16
include 'urb.inc'
17
 
18
struc UHCI
19
{
20
   .bus                dd ?
21
   .devfn              dd ?
22
   .io_base            dd ?
23
   .mm_base            dd ?
24
   .irq                dd ?
25
   .flags              dd ?
26
   .reset              dd ?
27
   .start              dd ?
28
   .stop               dd ?
29
 
30
   .port_c_suspend     dd ?
31
   .resuming_ports     dd ?
32
   .rh_state           dd ?
33
   .rh_numports        dd ?
34
   .is_stopped         dd ?
35
   .dead               dd ?
36
 
37
   .sizeof:
38
}
39
 
40
virtual at 0
41
  UHCI UHCI
42
end virtual
43
 
44
struc IOCTL
45
{  .handle      dd ?
46
   .io_code     dd ?
47
   .input       dd ?
48
   .inp_size    dd ?
49
   .output      dd ?
50
   .out_size    dd ?
51
}
52
 
53
virtual at 0
54
  IOCTL IOCTL
55
end virtual
56
 
57
struc TD   ;transfer descriptor
58
{
59
   .link        dd ?
60
   .status      dd ?
61
   .token       dd ?
62
   .buffer      dd ?
63
 
64
   .addr        dd ?
65
   .frame       dd ?
66
   .fd          dd ?
67
   .bk          dd ?
68
   .sizeof:
69
}
70
 
71
virtual at 0
72
  TD TD
73
end virtual
74
 
75
public START
76
public service_proc
77
public version
78
 
79
DEBUG        equ 1
80
 
81
DRV_ENTRY    equ 1
82
DRV_EXIT     equ -1
83
STRIDE       equ 4      ;size of row in devices table
84
 
85
SRV_GETVERSION  equ 0
86
 
87
section '.flat' code readable align 16
88
 
89
proc START stdcall, state:dword
90
 
91
           cmp [state], 1
92
           jne .exit
93
.entry:
94
 
95
     if DEBUG
96
           mov esi, msgInit
97
           call SysMsgBoardStr
98
     end if
99
 
100
           call init
101
 
102
           stdcall RegService, my_service, service_proc
103
           ret
104
.fail:
105
.exit:
106
           xor eax, eax
107
           ret
108
endp
109
 
110
handle     equ  IOCTL.handle
111
io_code    equ  IOCTL.io_code
112
input      equ  IOCTL.input
113
inp_size   equ  IOCTL.inp_size
114
output     equ  IOCTL.output
115
out_size   equ  IOCTL.out_size
116
 
117
align 4
118
proc service_proc stdcall, ioctl:dword
119
 
120
           mov ebx, [ioctl]
121
           mov eax, [ebx+io_code]
122
           cmp eax, SRV_GETVERSION
123
           jne @F
124
 
125
           mov eax, [ebx+output]
126
           cmp [ebx+out_size], 4
127
           jne .fail
128
           mov [eax], dword API_VERSION
129
           xor eax, eax
130
           ret
131
@@:
132
.fail:
133
           or eax, -1
134
           ret
135
endp
136
 
137
restore   handle
138
restore   io_code
139
restore   input
140
restore   inp_size
141
restore   output
142
restore   out_size
143
 
144
align 4
145
proc detect
146
           locals
147
            last_bus   dd ?
148
            bus        dd ?
149
            devfn      dd ?
150
           endl
151
 
152
           xor eax, eax
153
           mov [bus], eax
154
           inc eax
155
           call PciApi
156
           cmp eax, -1
157
           je .err
158
 
159
           mov [last_bus], eax
160
 
161
.next_bus:
162
           and [devfn], 0
163
.next_dev:
164
           stdcall PciRead32, [bus], [devfn], dword 0
165
           test eax, eax
166
           jz .next
167
           cmp eax, -1
168
           je .next
169
 
170
           mov edi, devices
171
@@:
172
           mov ebx, [edi]
173
           test ebx, ebx
174
           jz .next
175
 
176
           cmp eax, ebx
177
           je .found
178
 
179
           add edi, STRIDE
180
           jmp @B
181
.next:
182
           inc [devfn]
183
           cmp [devfn], 256
184
           jb  .next_dev
185
           mov eax, [bus]
186
           inc eax
187
           mov [bus], eax
188
           cmp eax, [last_bus]
189
           jna .next_bus
190
           xor eax, eax
191
           ret
192
.found:
193
           mov eax, UHCI.sizeof
194
           call Kmalloc
195
           test eax, eax
196
           jz .mem_fail
197
 
198
           mov ebx, [bus]
199
           mov [eax+UHCI.bus], ebx
200
 
201
           mov ecx, [devfn]
202
           mov [eax+UHCI.devfn], ecx
203
           ret
204
.mem_fail:
205
     if DEBUG
206
           mov esi, msgMemFail
207
           call SysMsgBoardStr
208
     end if
209
.err:
210
           xor eax, eax
211
           ret
212
endp
213
 
214
PCI_BASE    equ 0x20
215
USB_LEGKEY  equ 0xC0
216
 
217
align 4
218
proc init
219
           locals
220
            uhci       dd ?
221
           endl
222
 
223
           call detect
224
           test eax, eax
225
           jz .fail
226
 
227
           mov [uhci], eax
228
 
229
           stdcall PciRead32, [eax+UHCI.bus], [eax+UHCI.devfn], PCI_BASE
230
           and eax, 0xFFC0
231
           mov esi, [uhci]
232
           mov [esi+UHCI.io_base], eax
233
 
234
           stdcall uhci_reset, esi
235
 
236
           stdcall finish_reset, [uhci]
237
 
238
.fail:
239
     if DEBUG
240
           mov esi, msgDevNotFound
241
           call SysMsgBoardStr
242
     end if
243
           ret
244
endp
245
 
246
UHCI_USBINTR            equ  4             ; interrupt register
247
 
248
UHCI_USBLEGSUP_RWC      equ  0x8f00        ; the R/WC bits
249
UHCI_USBLEGSUP_RO       equ  0x5040        ; R/O and reserved bits
250
 
251
UHCI_USBCMD_RUN         equ  0x0001        ; RUN/STOP bit
252
UHCI_USBCMD_HCRESET     equ  0x0002        ; Host Controller reset
253
UHCI_USBCMD_EGSM        equ  0x0008        ; Global Suspend Mode
254
UHCI_USBCMD_CONFIGURE   equ  0x0040        ; Config Flag
255
UHCI_USBINTR_RESUME     equ  0x0002        ; Resume interrupt enable
256
 
257
PORTSC0                 equ  0x10
258
PORTSC1                 equ  0x12
259
 
260
 
261
UHCI_RH_RESET           equ  0
262
UHCI_RH_SUSPENDED       equ  1
263
UHCI_RH_AUTO_STOPPED    equ  2
264
UHCI_RH_RESUMING        equ  3
265
 
266
; In this state the HC changes from running to halted
267
; so it can legally appear either way.
268
UHCI_RH_SUSPENDING      equ  4
269
 
270
; In the following states it's an error if the HC is halted.
271
; These two must come last.
272
UHCI_RH_RUNNING         equ 5  ; The normal state
273
UHCI_RH_RUNNING_NODEVS  equ 6  ; Running with no devices
274
 
275
UHCI_IS_STOPPED         equ 9999
276
 
277
align 4
278
proc uhci_reset stdcall, uhci:dword
279
           mov esi, [uhci]
280
           stdcall PciRead16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY
281
           test eax, not (UHCI_USBLEGSUP_RO or UHCI_USBLEGSUP_RWC)
282
           jnz .reset
283
 
284
           mov edx, [esi+UHCI.io_base]
285
           in ax, dx
286
           test ax, UHCI_USBCMD_RUN
287
           jnz .reset
288
 
289
           test ax, UHCI_USBCMD_CONFIGURE
290
           jz .reset
291
 
292
           test ax, UHCI_USBCMD_EGSM
293
           jz .reset
294
 
295
           add edx, UHCI_USBINTR
296
           in ax, dx
297
           test ax, not UHCI_USBINTR_RESUME
298
           jnz .reset
299
           ret
300
.reset:
301
           stdcall PciWrite16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY, UHCI_USBLEGSUP_RWC
302
 
303
           mov edx, [esi+UHCI.io_base]
304
           mov ax, UHCI_USBCMD_HCRESET
305
           out dx, ax
306
 
307
           xor eax, eax
308
           out dx, ax
309
           add edx, UHCI_USBINTR
310
           out dx, ax
311
           ret
312
endp
313
 
314
proc finish_reset stdcall, uhci:dword
315
 
316
           mov esi, [uhci]
317
           mov edx, [esi+UHCI.io_base]
318
           add edx, PORTSC0
319
           xor eax, eax
320
           out dx, ax
321
           add edx, (PORTSC1-PORTSC0)
322
           out dx, ax
323
 
324
           mov [esi+UHCI.port_c_suspend], eax
325
           mov [esi+UHCI.resuming_ports], eax
326
           mov [esi+UHCI.rh_state], UHCI_RH_RESET
327
           mov [esi+UHCI.rh_numports], 2
328
 
329
           mov [esi+UHCI.is_stopped], UHCI_IS_STOPPED
330
     ;      mov [ uhci_to_hcd(uhci)->state = HC_STATE_HALT;
331
     ;      uhci_to_hcd(uhci)->poll_rh = 0;
332
 
333
           mov [esi+UHCI.dead], eax  ; Full reset resurrects the controller
334
 
335
           ret
336
endp
337
 
338
proc insert_td stdcall, td:dword, frame:dword
339
 
340
           mov edi, [td]
341
           mov eax, [frame]
342
           and eax, -1024
343
           mov [edi+TD.frame], eax
344
 
345
           mov ebx, [framelist]
346
           mov edx, [dma_framelist]
347
           shl eax, 5
348
 
349
           mov ecx, [eax+ebx]
350
           test ecx, ecx
351
           jz .empty
352
 
353
           mov ecx, [ecx+TD.bk]               ;last TD
354
 
355
           mov edx, [ecx+TD.fd]
356
           mov [edi+TD.fd], edx
357
           mov [edi+TD.bk], ecx
358
           mov [ecx+TD.fd], edi
359
           mov [edx+TD.bk], edi
360
 
361
           mov eax, [ecx+TD.link]
362
           mov [edi+TD.link], eax
363
           mov ebx, [edi+TD.addr]
364
           mov [ecx+TD.link], ebx
365
           ret
366
.empty:
367
           mov ecx, [eax+edx]
368
           mov [edi+TD.link], ecx
369
           mov [ebx+eax], edi
370
           mov ecx, [edi+TD.addr]
371
           mov [eax+edx], ecx
372
           ret
373
endp
374
 
375
 
376
align 4
377
proc usb_get_descriptor stdcall, dev:dword, type:dword, index:dword,\
378
                                 buf:dword, size:dword
379
 
380
           locals
381
             count        dd ?
382
           endl
383
 
384
           mov esi, [buf]
385
           mov ecx, [size]
386
           xor eax, eax
387
           cld
388
           rep stosb
389
 
390
           mov [count], 3
391
@@:
392
           mov eax, [type]
393
           shl eax, 8
394
           add eax, [index]
395
           stdcall usb_control_msg, [dev],pipe,USB_REQ_GET_DESCRIPTOR,\
396
                                    USB_DIR_IN, eax,0,[buf], [size],\
397
                                    USB_CTRL_GET_TIMEOUT
398
           test eax, eax
399
           jz .next
400
           cmp eax, -1
401
           je .next
402
           jmp. ok
403
.next:
404
           dec [count]
405
           jnz @B
406
           mov eax, -1
407
.ok:
408
           ret
409
endp
410
 
411
DEVICE_ID    equ  0x24D2     ;  pci device id
412
VENDOR_ID    equ  0x8086     ;  device vendor id
413
QEMU_USB     equ  0x7020
414
 
415
;all initialized data place here
416
 
417
align 4
418
devices         dd (DEVICE_ID shl 16)+VENDOR_ID
419
                dd (QEMU_USB  shl 16)+VENDOR_ID
420
                dd 0      ;terminator
421
 
422
version         dd (5 shl 16) or (API_VERSION and 0xFFFF)
423
 
424
my_service      db 'UHCI',0  ;max 16 chars include zero
425
 
426
msgInit         db 'detect hardware...',13,10,0
427
msgPCI          db 'PCI accsess not supported',13,10,0
428
msgDevNotFound  db 'device not found',13,10,0
429
msgMemFail      db 'Kmalloc failed', 10,10,0
430
;msgFail         db 'device not found',13,10,0
431
 
432
section '.data' data readable writable align 16
433
 
434
;all uninitialized data place here
435