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 |