📄 hci.asm
字号:
mov word ptr ds:[0],0 ;R56
F000_call Ct_Disable_Shadow
Close_USBRAM_Exit:
ret
;************************************************************************
;* *
;* UHCI POST INTERFACE MODULE *
;* *
;************************************************************************
;[]========================================================================[]
;Procedure: Init_USBRAM
;Function: Initialize USB_RAM to default value
;Input: DS,ES=USB_RAM
;Output: none
;[]========================================================================[]
Init_USBRAM:
;R60 mov cx, 2000h
mov cx, 4000h ;R60
xor si, si
call Ex_Clear_Buffer
;R60;set the upper 8Kb content of shadow RAM to prevent SCT testing error
;R60 push es
;R60 push di
;R60 mov ax,ds
;R60 mov es,ax
;R60 mov ax,0ffffh ;pattern to fill
;R60 mov di,2000h ;start from 8Kb address
;R60 mov cx,2000h ;8Kb to fill
;R60;R21A rep stosw
;R60 rep stosb ;R21A
;R60 pop di
;R60 pop es
ifndef PATACH_AMIDIAG ;R42
mov word ptr ds:[0], 0AA55h
endif ;PATACH_AMIDIAG ;R42
;R60 mov word ptr ds:[2], 0CB10h
mov word ptr ds:[2], 0CB20h ;R60
mov dword ptr ds:[4], 'BSU$'
mov ax, ds
shl eax, 4
mov ds:dUsbRamAddr, eax
;R65 add eax, offset FrameList
;R65 mov ds:dFrameListAddr, eax
call Ex_Init_FL
mov word ptr wTaskLink, 0FFFFh ;task terminated
mov word ptr DevAddrMap+2, 0080h ;root hub device
;R65 - start
ifdef TWO_USB_HOST
mov word ptr DevAddrMap+4, 0080h ;root hub device
endif ;TWO_USB_HOST
;R65 - end
xor ax, ax ;R65
mov bLedStatus, al ;R65
;R39 - start
;R83 - start
mov byte ptr bDelayRate, 125 ;default typematic delay
mov byte ptr bRepeatRate, 25 ;default typematic repeat rate
;R83 - end
;R83 mov byte ptr bDelayRate, 31 ;default typematic delay
;R83 mov byte ptr bRepeatRate, 6 ;default typematic repeat rate
;R65 mov bUsbFlag, USBKBSUPPORT+USBMSSUPPORT ;R41
ifdef USB_MOUSE_SUPPORT ;R65
mov bDevCtrl, MSDISABLE ;R41
endif ;USB_MOUSE_SUPPORT ;R65
ifdef IOTRAP_SUPPORT
;R83 mov bMsStatus1, 0FAh ;dummy code
;R83 mov bMsDataPacket1, 0FAh ;dummy code
mov bMsStatus, 00h ;stream mode
;disabled
;scaling 1:1
;no mouse button pressed
mov bResolution, 02h ;4 counts/mm resolution
mov bSampleRate, 64h ;100 times/s sample rate
mov bCipFlag, 0
mov bEmuCmdByte, 65h ;emulated commnad byte
mov bRealCmdByte, 65h ;physical command byte
mov bTrapEnabled, TRAPENABLE
mov wKcCmdProc, offset NullProc SMI_OFFSET
mov wKbCmdProc, offset NullProc SMI_OFFSET
mov wMsCmdProc, offset NullProc SMI_OFFSET
ENDIF ;IOTRAP_SUPPORT
;R39 - end
ret
;[]========================================================================[]
;Procedure: System_Control_Init
;Function: Initialize system control task
;Input: none
;Output: none
;[]========================================================================[]
System_Control_Init:
; Initialize Root Hub task
;R65 xor ax, ax
;R65 mov wPort1Status, ax
;R65 mov wPort2Status, ax
;R65 mov bLedStatus, al
;R65 - start
ifdef TWO_USB_HOST
cmp byte ptr bHostNum, 1
jne Init_ControlQH
endif ;TWO_USB_HOST
;R65 - end
mov si, offset SysCtrlQH
call Ex_Init_QH
mov si, offset SysCtrlTD
call Ex_Init_TD
or byte ptr [si].bTdControl, ISS_IOC
mov si, offset SysCtrlTask
call Ex_Init_Task
mov byte ptr [si].bTkDevStatus, TK_WFP
mov byte ptr [si].bTkDevAddr, 1
mov byte ptr [si].bTkParentHost, 1 ;R65
mov word ptr [si].wTkInterval, 1024
mov word ptr [si].wTkQueueHead, offset SysCtrlQH
mov word ptr [si].wTkTransDesp, offset SysCtrlTD
mov word ptr [si].wTkProc, offset System_Control SMI_OFFSET
call Ex_Link_Task
;R83 ; Initialize Timer task, and no link at this stage until
;R83 ; the USB keyboard is attached.
;R83
;R83 mov si, offset TimerQH
;R83 call Ex_Init_QH
;R83 mov si, offset TimerTD
;R83 call Ex_Init_TD
;R83;R47 or byte ptr [si].bTdControl, ISS_IOC
;R83 call Ex_Init_TimerTD ;R47
;R83
;R83 mov si, offset TimerTask
;R83 call Ex_Init_Task
;R83 mov byte ptr [si].bTkDevStatus, TK_WFP
;R83 mov byte ptr [si].bTkDevAddr, 1
;R83 mov byte ptr [si].bTkParentHost, 1 ;R65
;R83;R41 mov word ptr [si].wTkInterval, 64
;R83 mov word ptr [si].wTkInterval, 16 ;R41
;R83 mov word ptr [si].wTkQueueHead, offset TimerQH
;R83 mov word ptr [si].wTkTransDesp, offset TimerTD
;R83 mov word ptr [si].wTkProc, offset Proc_Timer SMI_OFFSET
;R83;R50 - start
;R83ifdef IOTRAP_SUPPORT
;R83 ; Initialize Response task, and no link at this stage until
;R83 ; the keyboard command process need respond to system.
;R83
;R83 mov si, offset ResponseQH
;R83 call Ex_Init_QH
;R83 mov [si].wQhInterval, 4 ;2ms interval
;R83 call Ex_Link_QH_to_FL
;R83 mov si, offset ResponseTD
;R83 call Ex_Init_TD
;R83;R50A call Init_ResponseTD
;R83;R50A mov di, offset ResponseQH
;R83;R50A mov si, offset ResponseTD
;R83;R50A call Link_TD_to_QH
;R83
;R83 mov si, offset ResponseTask
;R83 call Ex_Init_Task
;R83 mov byte ptr [si].bTkDevStatus, TK_WFP
;R83 mov byte ptr [si].bTkDevAddr, 1 ;dummy device address
;R83 mov byte ptr [si].bTkParentHost, 1 ;R65
;R83 mov word ptr [si].wTkInterval, 4 ;2ms interval
;R83 mov word ptr [si].wTkQueueHead, offset ResponseQH
;R83 mov word ptr [si].wTkTransDesp, offset ResponseTD
;R83 mov word ptr [si].wTkProc, offset Proc_Response SMI_OFFSET
;R83endif ;IOTRAP_SUPPORT
;R83;R50 - end
Init_ControlQH: ;R65
; Link Control Transfer Queue Head for future using
; and no TD link
;R65 mov si, offset ControlQH
mov si, wControlQHAddr ;R65
call Ex_Init_QH
mov word ptr [si].wQhInterval, 1
call Ex_Link_QH_to_FL
ret
;R83 - start
;[]========================================================================[]
;Procedure: Init_Timer
;Function: Initialize Timer task, and skip at this stage until
; the timer is necessary.
;Input: none
;Output: none
;[]========================================================================[]
Init_Timer:
mov si, offset TimerQH
call Ex_Init_QH
mov si, offset TimerTD
call Ex_Init_TD
mov si, offset TimerTask
call Ex_Init_Task
mov byte ptr [si].bTkDevAddr, 1 ;dummy device address
mov byte ptr [si].bTkParentHost, 1
mov word ptr [si].wTkInterval, 4 ;4ms interval
mov word ptr [si].wTkQueueHead, offset TimerQH
mov word ptr [si].wTkTransDesp, offset TimerTD
mov word ptr [si].wTkProc, offset Proc_Timer SMI_OFFSET
call Ex_Link_Task
ret
;R83 - end
;[]========================================================================[]
;Procedure: Host_Init
;Function: Initialize host controller
;Input: none
;Output: none
;[]========================================================================[]
Host_Init:
;R65 call Ct_USB_ID
;R65 mov wHostID, ax
;R38 - start
; Turn on bus master and io space decoding,
; avoid that these two bits are not turn-on
; by PCI kernel.
mov cx, wHostID
add cx, 4 ;command register
F000_call Get_PCI
or al, 00000111b ;bus master/io space
F000_call Set_PCI
;R38 - end
mov cx, wHostID
add cx, LEGACY_LO
F000_call Get_PCI
ifdef IOTRAP_SUPPORT
;R39 or al, USBSMIEN+0Fh ;Enable Trap/SMI on USB IRQ
;R65 - start
ifdef TWO_USB_HOST
or al, USBSMIEN
cmp byte ptr bHostNum, 1
jne short Not_Enable_IoTrap
or al, A20PASSEN+TRAPENABLE
Not_Enable_IoTrap:
else ;TWO_USB_HOST
;R65 - end
or al, USBSMIEN+A20PASSEN+TRAPENABLE ;R39;Enable SMI
endif ;TWO_USB_HOST ;R65
else ;IOTRAP_SUPPORT
or al, USBSMIEN ;Enable Trap/SMI on USB IRQ
endif ;IOTRAP_SUPPORT
F000_call Set_PCI
;R65 mov cx, wHostID
;R65 add cx, (USBBASE+1)
;R65 F000_call Get_PCI
;R65 push ax
;R65 mov cx, wHostID
;R65 add cx, USBBASE
;R65 F000_call Get_PCI
;R65 pop dx
;R65 mov ah, dl
;R65 and al, 0FCh
;R65 mov ds:wHostIoBase, ax
; Global Reset
call Global_Reset
; Clear USB Status Register
mov ax, 0FFFFh ;write clear
mov dx, USBSTS
call Ex_Set_Host_Word
; USB Interrupt Enable Register
mov ax, IOC ;interrupt on complete
mov dx, USBINTR
call Ex_Set_Host_Word
; Frame Number Register
mov ax, 0 ;Starting from frame 0
mov dx, FRNUM
call Ex_Set_Host_Word
; Frame List Base Address Register
;R65 mov ax, ds
;R65 shl eax, 4
;R65 add eax, offset FrameList
mov eax, dFrameListAddr ;R65
mov dx, FRBASEADD
call Ex_Set_Host_Dword
ret
;[]========================================================================[]
;Procedure: Global_Reset
;Function: Global host controller reset
;Input: none
;Output: none
;[]========================================================================[]
Global_Reset:
pusha
; Issue global reset and set maximum packet size to 64
mov al, GRESET+MAX_PACKET ;Global reset/max packet=64
mov dx, USBCMD
call Ex_Set_Host_Byte
; Minimum delay time 10ms
call Ex_Delay_12ms
; Clear reset signal
mov al, MAX_PACKET ;max packet=64
mov dx, USBCMD
call Ex_Set_Host_Byte
popa
ret
;[]========================================================================[]
;Procedure: Host_Reset
;Function: Host controller reset
;Input: none
;Output: none
;[]========================================================================[]
Host_Reset:
pusha
; Issue host controller reset
mov al, HCRESET ;Host controller reset
mov dx, USBCMD
call Ex_Set_Host_Byte
popa
ret
;R65 - start
;[]========================================================================[]
;Procedure: Init_Host_Data
;Function: Initialize host controller specific data
;Input: none
;Output: none
;[]========================================================================[]
Init_Host_Data:
ifdef TWO_USB_HOST
; Get host controllers PCI address
call Ct_USB_ID
mov wHostID1, ax
mov wHostID2, dx
; Get host controller I/O space
mov cx, wHostID1
add cx, (USBBASE+1)
F000_call Get_PCI
push ax
mov cx, wHostID1
add cx, USBBASE
F000_call Get_PCI
pop dx
mov ah, dl
and al, 0FCh
mov ds:wHostIoBase1, ax
mov cx, wHostID2
add cx, (USBBASE+1)
F000_call Get_PCI
push ax
mov cx, wHostID2
add cx, USBBASE
F000_call Get_PCI
pop dx
mov ah, dl
and al, 0FCh
mov ds:wHostIoBase2, ax
; Set frame list address
xor edx, edx
mov dx, ds
shl edx, 4
mov eax, offset FrameList1
mov ds:wFrameListAddr1, ax
add eax, edx
mov ds:dFrameListAddr1, eax
mov eax, offset FrameList2
mov ds:wFrameListAddr2, ax
add eax, edx
mov ds:dFrameListAddr2, eax
; Set control QH/TD address
mov ax, offset ControlQH1
mov wControlQHAddr1, ax
mov ax, offset ControlTD1
mov wControlTDAddr1, ax
mov ax, offset ControlQH2
mov wControlQHAddr2, ax
mov ax, offset ControlTD2
mov wControlTDAddr2, ax
ret
else ;TWO_USB_HOST
; Get host controllers PCI address
call Ct_USB_ID
mov wHostID, ax
; Get host controller I/O space
mov cx, wHostID
add cx, (USBBASE+1)
F000_call Get_PCI
push ax
mov cx, wHostID
add cx, USBBASE
F000_call Get_PCI
pop dx
mov ah, dl
and al, 0FCh
mov ds:wHostIoBase, ax
; Set frame list address
xor edx, edx
mov dx, ds
shl edx, 4
mov eax, offset FrameList
mov ds:wFrameListAddr, ax
add eax, edx
mov ds:dFrameListAddr, eax
; Set control QH/TD address
mov ax, offset ControlQH
mov wControlQHAddr, ax
mov ax, offset ControlTD
mov wControlTDAddr, ax
ret
endif ;TWO_USB_HOST
;R65 - end
;[]==========================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -