gxinit.asm

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· 汇编 代码 · 共 381 行

ASM
381
字号
;
;THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
;ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
;THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
;PARTICULAR PURPOSE.
;Copyright (c) 1995-2000  Microsoft Corporation
;
;Module Name: gxinit.asm
;
;Abstract: MediaGX CPU/system setup code.
;
;Functions:
;
;    BridgeConfig
;    BridgePrintConfig
;    InitVideo
;
;Notes:
;

.486p
.model FLAT

INCLUDE         macro.inc
INCLUDE         gx.inc

.code

align 4


BridgeConfig PROC NEAR C PUBLIC

    ;
    ; Program CPU registers
    ; ----------------------------------------------------

    ; CCR3[0] should be 0 to write to some of the following regs
    CREG_WRITE  CREG_INDEX_CCR3,    00H

    CREG_WRITE  CREG_INDEX_CCR1,    02H ; 2
    CREG_WRITE  CREG_INDEX_CCR2,    56H ; 56
    CREG_WRITE  CREG_INDEX_SMAR0,   40H ; 40
    CREG_WRITE  CREG_INDEX_SMAR1,   40H ; 40
    CREG_WRITE  CREG_INDEX_SMAR2,   06H ; 6

    CREG_WRITE  CREG_INDEX_CCR7,    00H ; FF

    CREG_WRITE  CREG_INDEX_VGACTL,  0FFH ; FF
    CREG_WRITE  CREG_INDEX_VGAM0_0, 0FFH ; FF
    CREG_WRITE  CREG_INDEX_VGAM0_1, 0FFH ; FF
    CREG_WRITE  CREG_INDEX_VGAM0_2, 0FFH ; FF
    CREG_WRITE  CREG_INDEX_VGAM0_3, 0FFH ; FF

    ; Program CCR3 with MAPEN on, so we can reach the other regs (off-chip)
    CREG_WRITE  CREG_INDEX_CCR3, 010H

    ; Program configuration registers that rely on MAPEN being on
    CREG_WRITE  CREG_INDEX_CCR4,  0D8H ; D8
    CREG_WRITE  CREG_INDEX_PCR,   00H ; 0
    CREG_WRITE  CREG_INDEX_SMHR0, 00H ; 0
    CREG_WRITE  CREG_INDEX_SMHR1, 00H ; 0 
    CREG_WRITE  CREG_INDEX_SMHR2, 41H ; 41
    CREG_WRITE  CREG_INDEX_SMHR3, 40H ; 40

    ; Initialize 3KB scratchpad (set GCR, preload L1, set up blit buffers)
    mov ebx, GX_BASE
    or  ebx, SCPD_SIZE_3KB
    rol ebx, GX_BASE_ROL
    CREG_WRITE  CREG_INDEX_GCR, bl	; CREG_WRITE uses eax

    ;
    ; Preload L1 cache with scratchpad addresses (blit buffer performance)
    ;
   
    mov eax, GX_BASE 
    mov TR4, eax	; Load GX_BASE as tag
    mov eax, SCPD_BASE
    or al, 1        	; Prep TR5 value

fillCache:
    mov TR5, eax	; Set cache line tag
    add eax, 10h	; Go to next cache line
    cmp eax, 1001h
    jb fillCache	; If at top of cache then we are done


    ; 
    ; Set up both blit buffers (base and pointer)
    ; ---------------------------------------------------
    ; This sets up the L1 cache access to the scratchpad region which
    ; is used, amongst other things, for bitblts, etc.  Setting up the base and
    ; current pointer values requires the GCR to be set up with a non-zero
    ; scratchpad area.  As well, special CPU instructions are required to set
    ; the values.  See Pg. 99.
    ;
    ; Program L1_BB0_BASE
    ;
    mov ebx, L1_BB0_BASE
    mov eax, BB0_BASE_OFFSET
    CPU_WRITE
    ;
    ; Program L1_BB1_BASE
    ;
    mov ebx, L1_BB1_BASE
    mov eax, BB1_BASE_OFFSET
    CPU_WRITE
    ;
    ; Reset L1_BB0_POINTER to base
    ;
    CPU_BB0_RESET
    ;
    ; Reset L1_BB1_POINTER to base
    ;
    CPU_BB1_RESET
    ;
    ; Program PM_BASE
    ;
    mov ebx, PM_BASE
    mov eax, 0
    CPU_WRITE
    ;
    ; Program PM_MASK
    ;
    mov ebx, PM_MASK
    mov eax, 0
    CPU_WRITE

    ; 
    ; Display blit buffer base/pointer addresses
    ;
IF 0
    WriteChar('B')
    WriteChar('l')
    WriteChar('i')
    WriteChar('t')
    WriteChar(' ')
    WriteChar('B')
    WriteChar('u')
    WriteChar('f')
    WriteChar('f')
    WriteChar('e')
    WriteChar('r')
    WriteChar('s')
    WriteChar(':')
    WriteChar(0dH)
    WriteChar(0aH)
    mov ebx, L1_BB0_BASE        ; L1_BB0_BASE
    CPU_READ
    mov ebx, eax
    WriteHex_EBX
    WriteChar(0dH)
    WriteChar(0aH)
    mov ebx, L1_BB1_BASE        ; L1_BB1_BASE
    CPU_READ
    mov ebx, eax
    WriteHex_EBX
    WriteChar(0dH)
    WriteChar(0aH)
    mov ebx, L1_BB0_POINTER     ; L1_BB0_POINTER
    CPU_READ
    mov ebx, eax
    WriteHex_EBX
    WriteChar(0dH)
    WriteChar(0aH)
    mov ebx, L1_BB1_POINTER     ; L1_BB1_POINTER
    CPU_READ
    mov ebx, eax
    WriteHex_EBX
    WriteChar(0dH)
    WriteChar(0aH)
ENDIF

    ; Program CCR3 with MAPEN off
    CREG_WRITE  CREG_INDEX_CCR3, 0E4H


    ;
    ; Program Bridge/Controller Registers (GX_BASE=0x4000.0000)
    ; ---------------------------------------------------------

    ; IBus Controller Registers:

    MMREG_WRITE_32  BC_DRAM_TOP, 07D7FFFFH    ; Gran=128KB TopOfRam=3EB
    MMREG_WRITE_32  BC_XMAP_1,   0000C073H    ; R/W A.0000->A.FFFF , A20M dsbl
    MMREG_WRITE_32  BC_XMAP_2,   00000011H    ; R/O C.0000->C.7FFF (UMB Exp ROM)
    MMREG_WRITE_32  BC_XMAP_3,   33331111H    ; R/O E.0000->E.FFFF,R/WF.0000->F.FFFF
; TODO - dynamically size DRAM.
; *** 128 MB RAM ***
    ;MMREG_WRITE_32  BC_DRAM_TOP, 07D7FFFFH    ; Gran=128KB TopOfRam=3EB
; *** 32 MB RAM ***
    MMREG_WRITE_32  BC_DRAM_TOP, 01D7FFFFH    ; Gran=128KB TopOfRam=EB


    ; Memory Controller Registers:
    MMREG_WRITE_32  MC_MEM_CNTRL1, 00000000H  ; Turn off SDRAM refreshes

    MMREG_WRITE_32  MC_MEM_CNTRL2, 00000021H  ; Sdclkmsks=0
; *** 128 MB RAM ***
    ;MMREG_WRITE_32  MC_BANK_CFG,   00701530H  ; DIM0, 128MB, 8KB page, 1 mod, 4 bank
    ;MMREG_WRITE_32  MC_GBASE_ADD,  000000FBH  ; GBADDR=7D8.0000 > BC_DRAM_TOP
    ;MMREG_WRITE_32  MC_DR_ACC,     000003FEH
; *** 32 MB RAM ***
    MMREG_WRITE_32  MC_BANK_CFG,   00701310H  ; DIM0, 32MB, 2KB page, 1 mod, 4 bank
    MMREG_WRITE_32  MC_GBASE_ADD,  0000003BH  ; GBADDR=1D8.0000 > BC_DRAM_TOP
    MMREG_WRITE_32  MC_DR_ACC,     000003FCH

    MMREG_WRITE_32  MC_SYNC_TIM1,  37533110H  ; Numclks between cycles
    MMREG_WRITE_32  MC_DR_ADD,     000003FFH  ; Index to dirty RAM=3FF

    ; Enable memory refresh, etc.
    MMREG_WRITE_32  MC_MEM_CNTRL1, 0B694390CH ; Set values
    MMREG_WRITE_32  MC_MEM_CNTRL1, 0B696390DH ; Turn on sdclk and program SDRAM
    MMREG_WRITE_32  MC_MEM_CNTRL1, 0B696390CH ; Sdclk on and program done

    ; Initialize video and display splash screen.
    ;EXTRN   _InitVideo:NEAR
    ;NoMemCall _InitVideo

    ; Power Management Registers:
    MMREG_WRITE_32  PM_STAT_SMI,        40008001H
    MMREG_WRITE_32  PM_CNTRL_TEN,       40008019H
    MMREG_WRITE_32  PM_CNTRL_CSTP,      40008000H
    MMREG_WRITE_32  PM_SER_PACK,        40008000H

    NoMemRet

BridgeConfig ENDP


BridgePrintConfig PROC NEAR C PUBLIC

    WriteChar 'B'
    WriteChar 'r'
    WriteChar 'i'
    WriteChar 'd'
    WriteChar 'g'
    WriteChar 'e'
    WriteChar ' '
    WriteChar 'C'
    WriteChar 'o'
    WriteChar 'n'
    WriteChar 'f'
    WriteChar 'i'
    WriteChar 'g'
    WriteChar 'u'
    WriteChar 'r'
    WriteChar 'a'
    WriteChar 't'
    WriteChar 'i'
    WriteChar 'o'
    WriteChar 'n'
    WriteChar ':'
    WriteChar 0dH
    WriteChar 0aH

    ; CPU control registers

    PRINT_CREG_VAL   CREG_INDEX_CCR1
    PRINT_CREG_VAL   CREG_INDEX_CCR2
    PRINT_CREG_VAL   CREG_INDEX_SMAR0
    PRINT_CREG_VAL   CREG_INDEX_SMAR1
    PRINT_CREG_VAL   CREG_INDEX_SMAR2
    PRINT_CREG_VAL   CREG_INDEX_CCR7
    PRINT_CREG_VAL   CREG_INDEX_VGACTL
    PRINT_CREG_VAL   CREG_INDEX_VGAM0_0
    PRINT_CREG_VAL   CREG_INDEX_VGAM0_1
    PRINT_CREG_VAL   CREG_INDEX_VGAM0_2
    PRINT_CREG_VAL   CREG_INDEX_VGAM0_3
    PRINT_CREG_VAL   CREG_INDEX_DIR0
    PRINT_CREG_VAL   CREG_INDEX_DIR1

    ; ** The next set of regs require the MAPEN bit to be unset
    ; Program CCR3 with MAPEN on, so we can reach the other regs (off-chip)
    CREG_WRITE  CREG_INDEX_CCR3, 0F4H

    ; Program configuration registers that rely on MAPEN being on
    PRINT_CREG_VAL   CREG_INDEX_CCR4
    PRINT_CREG_VAL   CREG_INDEX_PCR
    PRINT_CREG_VAL   CREG_INDEX_SMHR0
    PRINT_CREG_VAL   CREG_INDEX_SMHR1
    PRINT_CREG_VAL   CREG_INDEX_SMHR2
    PRINT_CREG_VAL   CREG_INDEX_SMHR3
    PRINT_CREG_VAL   CREG_INDEX_GCR

    ; Program CCR3 with MAPEN off
    ; *** Turn the MAPEN bit back off
    CREG_WRITE  CREG_INDEX_CCR3, 0E4H

    ; Controller Registers

    WriteChar 0dH
    WriteChar 0aH

    ; IBus Controller Registers:
    PRINT_MMREG_VAL   BC_DRAM_TOP
    PRINT_MMREG_VAL   BC_XMAP_1
    PRINT_MMREG_VAL   BC_XMAP_2
    PRINT_MMREG_VAL   BC_XMAP_3

    ; Memory Controller Registers:
    PRINT_MMREG_VAL   MC_MEM_CNTRL1
    PRINT_MMREG_VAL   MC_MEM_CNTRL2
    PRINT_MMREG_VAL   MC_BANK_CFG
    PRINT_MMREG_VAL   MC_SYNC_TIM1
    PRINT_MMREG_VAL   MC_GBASE_ADD
    PRINT_MMREG_VAL   MC_DR_ADD
    PRINT_MMREG_VAL   MC_DR_ACC

    ; Power Management Registers:
    PRINT_MMREG_VAL   PM_STAT_SMI
    PRINT_MMREG_VAL   PM_CNTRL_TEN
    PRINT_MMREG_VAL   PM_CNTRL_CSTP
    PRINT_MMREG_VAL   PM_SER_PACK

    NoMemRet

BridgePrintConfig ENDP


InitVideo PROC NEAR C PUBLIC

    ; Graphics Pipeline Registers:
    MMREG_WRITE_32  GP_DST,            01bd0001H
    MMREG_WRITE_32  GP_WIDTH,          0e0007H
    MMREG_WRITE_32  GP_SRC_X,          01bd0000H
    MMREG_WRITE_32  GP_SRC_COLOR_0,    0ffffH
    MMREG_WRITE_32  GP_PAT_COLOR_0,    0ffffH
    MMREG_WRITE_32  GP_PAT_COLOR_2,    0ffffbfffH
    MMREG_WRITE_32  GP_PAT_DATA_0,     07ff07ffH
    MMREG_WRITE_32  GP_PAT_DATA_1,     07ff07ffH
    MMREG_WRITE_32  GP_PAT_DATA_2,     0ffffffffH
    MMREG_WRITE_32  GP_PAT_DATA_3,     0ffffffffH
    MMREG_WRITE_32  GP_VGA_WRITE,      0f0000ffH
    MMREG_WRITE_32  GP_VGA_READ,       070f0H
    MMREG_WRITE_32  GP_RASTER_MODE,    0550055H
    MMREG_WRITE_32  GP_VECTOR_MODE,    0000000H

    MMREG_WRITE_32  GP_BLT_MODE,       0500050H

    MMREG_WRITE_32  GP_BLT_STATUS,     0000000H
    MMREG_WRITE_32  GP_VGA_BASE,       00H
    MMREG_WRITE_32  GP_VGA_LATCH,      01753H


    ; Display Controller Registers:
    MMREG_WRITE_32  DC_UNLOCK,          04758H ; Unlock DC regs for write.

    MMREG_WRITE_32  DC_GENERAL_CFG,    20006583H
    MMREG_WRITE_32  DC_TIMING_CFG,     02fH
    MMREG_WRITE_32  DC_OUTPUT_CFG,     03005H
    MMREG_WRITE_32  DC_FB_ST_OFFSET,   00H
    MMREG_WRITE_32  DC_CB_ST_OFFSET,   00H
    MMREG_WRITE_32  DC_CURS_ST_OFFSET, 01fff00H
    MMREG_WRITE_32  DC_VID_ST_OFFSET,  010410H
    MMREG_WRITE_32  DC_LINE_DELTA,     0100H
    MMREG_WRITE_32  DC_BUF_SIZE,       052H
    MMREG_WRITE_32  DC_H_TIMING_1,     0347027fH
    MMREG_WRITE_32  DC_H_TIMING_2,     0347027fH
    MMREG_WRITE_32  DC_H_TIMING_3,     02cf028fH
    MMREG_WRITE_32  DC_FP_H_TIMING,    02cf028fH
    MMREG_WRITE_32  DC_V_TIMING_1,     01f301dfH
    MMREG_WRITE_32  DC_V_TIMING_2,     01f301dfH
    MMREG_WRITE_32  DC_V_TIMING_3,     01e301e0H
    MMREG_WRITE_32  DC_FP_V_TIMING,    01e301e0H
    MMREG_WRITE_32  DC_CURSOR_X,       020000140H
    MMREG_WRITE_32  DC_CURSOR_Y,       0200000f0H
    MMREG_WRITE_32  DC_SS_LINE_CMP,    02000eef2H
    MMREG_WRITE_32  DC_CURSOR_COLOR,   01e30000H
    MMREG_WRITE_32  DC_BORDER_COLOR,   01e30000H

    ; Test registers
    MMREG_WRITE_32  DC_PAL_ADDRESS,    025c0105H
    MMREG_WRITE_32  DC_PAL_DATA,       025c7ce5H
    MMREG_WRITE_32  DC_DFIFO_DIAG,     00H
    MMREG_WRITE_32  DC_CFIFO_DIAG,     0ffffffffH

InitVideo ENDP

END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?