Subversion Repositories Kolibri OS

Rev

Rev 557 | Go to most recent revision | Show entire file | Ignore 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 ?
23
   .devfn       dd ?
20
   .devfn              dd ?
24
   .io_base     dd ?
21
   .io_base            dd ?
25
   .mm_base     dd ?
22
   .mm_base            dd ?
26
   .irq         dd ?
23
   .irq                dd ?
27
   .flags       dd ?
24
   .flags              dd ?
-
 
25
   .reset              dd ?
-
 
26
   .start              dd ?
-
 
27
   .stop               dd ?
-
 
28
 
-
 
29
   .port_c_suspend     dd ?
-
 
30
   .resuming_ports     dd ?
28
   .reset       dd ?
31
   .rh_state           dd ?
-
 
32
   .rh_numports        dd ?
-
 
33
   .is_stopped         dd ?
29
   .start       dd ?
34
   .dead               dd ?
30
   .stop        dd ?
35
 
Line 31... Line 36...
31
   .sizeof:
36
   .sizeof:
32
}
37
}
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 185... Line 208...
185
.err:
208
.err:
186
           xor eax, eax
209
           xor eax, eax
187
           ret
210
           ret
188
endp
211
endp
Line 189... Line 212...
189
 
212
 
190
PCI_BASE     equ 0x20
213
PCI_BASE    equ 0x20
Line 191... Line 214...
191
USB_LEGKEY  equ 0xC0
214
USB_LEGKEY  equ 0xC0
192
 
215
 
193
align 4
216
align 4
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:
214
     if DEBUG
238
     if DEBUG
215
           mov esi, msgDevNotFound
239
           mov esi, msgDevNotFound
216
           call SysMsgBoardStr
240
           call SysMsgBoardStr
Line 217... Line 241...
217
     end if
241
     end if
Line 218... Line 242...
218
           ret
242
           ret
219
endp
243
endp
Line 220... Line 244...
220
 
244
 
221
UHCI_USBINTR          equ  4             ; interrupt register
245
UHCI_USBINTR            equ  4             ; interrupt register
222
 
246
 
223
UHCI_USBLEGSUP_RWC    equ  0x8f00        ; the R/WC bits
247
UHCI_USBLEGSUP_RWC      equ  0x8f00        ; the R/WC bits
224
UHCI_USBLEGSUP_RO     equ  0x5040        ; R/O and reserved bits
248
UHCI_USBLEGSUP_RO       equ  0x5040        ; R/O and reserved bits
Line -... Line 249...
-
 
249
 
-
 
250
UHCI_USBCMD_RUN         equ  0x0001        ; RUN/STOP bit
-
 
251
UHCI_USBCMD_HCRESET     equ  0x0002        ; Host Controller reset
-
 
252
UHCI_USBCMD_EGSM        equ  0x0008        ; Global Suspend Mode
-
 
253
UHCI_USBCMD_CONFIGURE   equ  0x0040        ; Config Flag
-
 
254
UHCI_USBINTR_RESUME     equ  0x0002        ; Resume interrupt enable
-
 
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
Line 225... Line 268...
225
 
268
 
226
UHCI_USBCMD_RUN       equ  0x0001        ; RUN/STOP bit
269
; In the following states it's an error if the HC is halted.
227
UHCI_USBCMD_HCRESET   equ  0x0002        ; Host Controller reset
-
 
228
UHCI_USBCMD_EGSM      equ  0x0008        ; Global Suspend Mode
270
; These two must come last.
229
UHCI_USBCMD_CONFIGURE equ  0x0040        ; Config Flag
271
UHCI_RH_RUNNING         equ 5  ; The normal state
230
UHCI_USBINTR_RESUME   equ  0x0002        ; Resume interrupt enable
272
UHCI_RH_RUNNING_NODEVS  equ 6  ; Running with no devices
231
 
273
 
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