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 |