Subversion Repositories Kolibri OS

Rev

Rev 557 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 557 Rev 567
Line 12... Line 12...
12
API_VERSION     equ 0  ;debug
12
API_VERSION     equ 0  ;debug
Line 13... Line 13...
13
 
13
 
14
include '../proc32.inc'
14
include '../proc32.inc'
Line 15... Line -...
15
include '../imports.inc'
-
 
16
 
-
 
17
OS_BASE         equ 0x80000000
-
 
18
SLOT_BASE       equ OS_BASE+0x0080000
15
include '../imports.inc'
19
 
16
 
20
struc UHCI
17
struc UHCI
21
{
18
{
22
   .bus         dd ?
19
   .bus                dd ?
Line 26... Line 23...
26
   .irq         dd ?
23
   .irq                dd ?
27
   .flags       dd ?
24
   .flags              dd ?
28
   .reset       dd ?
25
   .reset              dd ?
29
   .start       dd ?
26
   .start              dd ?
30
   .stop        dd ?
27
   .stop               dd ?
-
 
28
 
-
 
29
   .port_c_suspend     dd ?
-
 
30
   .resuming_ports     dd ?
-
 
31
   .rh_state           dd ?
-
 
32
   .rh_numports        dd ?
-
 
33
   .is_stopped         dd ?
-
 
34
   .dead               dd ?
-
 
35
 
31
   .sizeof:
36
   .sizeof:
32
}
37
}
Line 33... Line 38...
33
 
38
 
34
virtual at 0
39
virtual at 0
Line 46... Line 51...
46
 
51
 
47
virtual at 0
52
virtual at 0
48
  IOCTL IOCTL
53
  IOCTL IOCTL
Line -... Line 54...
-
 
54
end virtual
-
 
55
 
-
 
56
struc TD   ;transfer descriptor
-
 
57
{
-
 
58
   .link        dd ?
-
 
59
   .status      dd ?
-
 
60
   .token       dd ?
-
 
61
   .buffer      dd ?
-
 
62
 
-
 
63
   .addr        dd ?
-
 
64
   .frame       dd ?
-
 
65
   .fd          dd ?
-
 
66
   .bk          dd ?
-
 
67
   .sizeof:
-
 
68
}
-
 
69
 
-
 
70
virtual at 0
-
 
71
  TD TD
49
end virtual
72
end virtual
50
 
73
 
51
public START
74
public START
Line 52... Line 75...
52
public service_proc
75
public service_proc
Line 207... Line 230...
207
           mov esi, [uhci]
230
           mov esi, [uhci]
208
           mov [esi+UHCI.io_base], eax
231
           mov [esi+UHCI.io_base], eax
Line 209... Line 232...
209
 
232
 
Line -... Line 233...
-
 
233
           stdcall uhci_reset, esi
Line 210... Line 234...
210
           stdcall uhci_reset, esi
234
 
211
 
235
           stdcall finish_reset, [uhci]
212
 
236
 
213
.fail:
237
.fail:
Line 227... Line 251...
227
UHCI_USBCMD_HCRESET   equ  0x0002        ; Host Controller reset
251
UHCI_USBCMD_HCRESET     equ  0x0002        ; Host Controller reset
228
UHCI_USBCMD_EGSM      equ  0x0008        ; Global Suspend Mode
252
UHCI_USBCMD_EGSM        equ  0x0008        ; Global Suspend Mode
229
UHCI_USBCMD_CONFIGURE equ  0x0040        ; Config Flag
253
UHCI_USBCMD_CONFIGURE   equ  0x0040        ; Config Flag
230
UHCI_USBINTR_RESUME   equ  0x0002        ; Resume interrupt enable
254
UHCI_USBINTR_RESUME     equ  0x0002        ; Resume interrupt enable
Line -... Line 255...
-
 
255
 
-
 
256
PORTSC0                 equ  0x10
-
 
257
PORTSC1                 equ  0x12
-
 
258
 
-
 
259
 
-
 
260
UHCI_RH_RESET           equ  0
-
 
261
UHCI_RH_SUSPENDED       equ  1
-
 
262
UHCI_RH_AUTO_STOPPED    equ  2
-
 
263
UHCI_RH_RESUMING        equ  3
-
 
264
 
-
 
265
; In this state the HC changes from running to halted
-
 
266
; so it can legally appear either way.
-
 
267
UHCI_RH_SUSPENDING      equ  4
-
 
268
 
-
 
269
; In the following states it's an error if the HC is halted.
-
 
270
; These two must come last.
-
 
271
UHCI_RH_RUNNING         equ 5  ; The normal state
-
 
272
UHCI_RH_RUNNING_NODEVS  equ 6  ; Running with no devices
-
 
273
 
Line 231... Line 274...
231
 
274
UHCI_IS_STOPPED         equ 9999
232
 
275
 
233
align 4
-
 
234
proc uhci_reset stdcall, uhci:dword
276
align 4
235
 
277
proc uhci_reset stdcall, uhci:dword
236
           mov esi, [uhci]
278
           mov esi, [uhci]
237
           stdcall PciRead16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY
279
           stdcall PciRead16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY
Line 246... Line 288...
246
           test ax, UHCI_USBCMD_CONFIGURE
288
           test ax, UHCI_USBCMD_CONFIGURE
247
           jz .reset
289
           jz .reset
Line 248... Line 290...
248
 
290
 
249
           test ax, UHCI_USBCMD_EGSM
291
           test ax, UHCI_USBCMD_EGSM
-
 
292
           jz .reset
-
 
293
 
-
 
294
           add edx, UHCI_USBINTR
-
 
295
           in ax, dx
-
 
296
           test ax, not UHCI_USBINTR_RESUME
250
           jz .reset
297
           jnz .reset
251
           ret
298
           ret
252
.reset:
299
.reset:
Line 253... Line 300...
253
           stdcall PciWrite16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY, UHCI_USBLEGSUP_RWC
300
           stdcall PciWrite16, [esi+UHCI.bus], [esi+UHCI.devfn], USB_LEGKEY, UHCI_USBLEGSUP_RWC
Line 261... Line 308...
261
           add edx, UHCI_USBINTR
308
           add edx, UHCI_USBINTR
262
           out dx, ax
309
           out dx, ax
263
           ret
310
           ret
264
endp
311
endp
Line -... Line 312...
-
 
312
 
-
 
313
proc finish_reset stdcall, uhci:dword
-
 
314
 
-
 
315
           mov esi, [uhci]
-
 
316
           mov edx, [esi+UHCI.io_base]
-
 
317
           add edx, PORTSC0
-
 
318
           xor eax, eax
-
 
319
           out dx, ax
-
 
320
           add edx, (PORTSC1-PORTSC0)
-
 
321
           out dx, ax
-
 
322
 
-
 
323
           mov [esi+UHCI.port_c_suspend], eax
-
 
324
           mov [esi+UHCI.resuming_ports], eax
-
 
325
           mov [esi+UHCI.rh_state], UHCI_RH_RESET
-
 
326
           mov [esi+UHCI.rh_numports], 2
-
 
327
 
-
 
328
           mov [esi+UHCI.is_stopped], UHCI_IS_STOPPED
-
 
329
     ;      mov [ uhci_to_hcd(uhci)->state = HC_STATE_HALT;
Line -... Line 330...
-
 
330
     ;      uhci_to_hcd(uhci)->poll_rh = 0;
-
 
331
 
-
 
332
           mov [esi+UHCI.dead], eax  ; Full reset resurrects the controller
-
 
333
 
-
 
334
           ret
-
 
335
endp
-
 
336
 
-
 
337
proc insert_td stdcall, td:dword, frame:dword
-
 
338
 
-
 
339
           mov edi, [td]
-
 
340
           mov eax, [frame]
-
 
341
           and eax, -1024
-
 
342
           mov [edi+TD.frame], eax
265
 
343
 
-
 
344
           mov ebx, [framelist]
-
 
345
           mov edx, [dma_framelist]
-
 
346
           shl eax, 5
-
 
347
 
-
 
348
           mov ecx, [eax+ebx]
-
 
349
           test ecx, ecx
-
 
350
           jz .empty
-
 
351
 
-
 
352
           mov ecx, [ecx+TD.bk]               ;last TD
-
 
353
 
-
 
354
           mov edx, [ecx+TD.fd]
-
 
355
           mov [edi+TD.fd], edx
-
 
356
           mov [edi+TD.bk], ecx
-
 
357
           mov [ecx+TD.fd], edi
-
 
358
           mov [edx+TD.bk], edi
-
 
359
 
-
 
360
           mov eax, [ecx+TD.link]
-
 
361
           mov [edi+TD.link], eax
-
 
362
           mov ebx, [edi+TD.addr]
-
 
363
           mov [ecx+TD.link], ebx
-
 
364
           ret
-
 
365
.empty:
-
 
366
           mov ecx, [eax+edx]
266
 
367
           mov [edi+TD.link], ecx
-
 
368
           mov [ebx+eax], edi
-
 
369
           mov ecx, [edi+TD.addr]
-
 
370
           mov [eax+edx], ecx
Line -... Line 371...
-
 
371
           ret
-
 
372
endp
-
 
373
 
Line 267... Line 374...
267
DEVICE_ID    equ  0x8086;  pci device id
374
DEVICE_ID    equ  0x24D2     ;  pci device id
Line 268... Line 375...
268
VENDOR_ID    equ  0x24D4;  device vendor id
375
VENDOR_ID    equ  0x8086     ;  device vendor id
269
 
376
QEMU_USB     equ  0x7020
-
 
377
 
270
 
378
;all initialized data place here
Line 271... Line 379...
271
;all initialized data place here
379
 
Line 272... Line 380...
272
 
380
align 4