ccisrs.src
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· SRC 代码 · 共 424 行
SRC
424 行
;
; Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
;
; Module Name:
;
; cc.src
;
; Revision History:
;
; 26th April 1999 Released
; 25th June 1999 Fixed minor bug
; 1st July 1999 Renamed function
; 16th July 1999 Masked disabled interrupt in _HD64465_ISR
;
.include "kxshx.h"
.include "boot.inc"
.include "oalintr.inc"
.include "shx.inc"
.include "platform.inc"
.include "cc.inc"
.section .text,code
;/*****************************************************************************
;* Function : _HD64465_ISR
;* Description : Interrupt Service Routine for the HD64461 Companion Chip
;* Inputs : r0 = interrupt disposition info
;* Outputs : r0 = return Interrupt ID.
;* Notes : This routine decodes the Companion Chip interrupts
;* and dispatches to the appropriate handler for that interrupt.
;*
;* The interrupt from the CC is set up as a low level,
;* not edge detected, so clearing IRR0 is not needed.
;*
;* Handles : Keyboard Scan Timer Interrupt (TMU0) (EXTERNAL!)
;* IrDA UART interrupts (not fast IrDA, only the UART) (INTERNAL)
;*
;* NOTE : The keyboard ISR is implemented in keyISRs.src
;*
;* NOTE : Registers: r0-r3,r6 available for use.
;*
;* ENTRY : in register bank 1, exceptions blocked
;* Exit : (r0) = interrupt dispostion information
;* (see nkintr.h for values)
;* CAUTIONS : Use only r0-r3,r6
;*****************************************************************************/
LEAF_ENTRY _HD64465_ISR
; debug only - set the led an interrupt occurred
; Write something to the LED first.
mov.l #h'35,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
mov #CC_INTC_NIRR,r0 ; HD64465 INTC NIRR address
mov.w @r0,r1 ; what interrupt(s) happened?
mov #CC_INTC_NIMR,r0 ; HD64465 Interrupt MASK Register
mov.w @r0,r3
not r3,r3
and r3,r1 ; what enabled interrupt(s) happened?
mov #CC_INTC_NIRR_UART0R,r2 ; try Serial interrupt
tst r2,r1
bf HD64465_ISR_uart ; Serial interrupt occurred on companion chip
mov #CC_INTC_NIRR_IRDAR,r2 ; try IrDA interrupt
tst r2,r1
bf HD64465_ISR_irda ; IrDA interrupt occurred on companion chip
mov #CC_INTC_NIRR_USBR,r2 ; try USB interrupt
tst r2,r1
bf HD64465_ISR_usb ; USB interrupt occurred on companion chip
mov #CC_INTC_NIRR_PCC0R, r2 ; check for interrupts on PCMCIA card 0
tst r2, r1
bf HD64465_ISR_pcmcia0 ; interrupt occurred on Card 0
mov #CC_INTC_NIRR_PCC1R, r2 ; check for interrupts on PCMCIA card 1
tst r2, r1
bf HD64465_ISR_pcmcia1 ; interrupt occurred on Card 1
; test for the HD64465 Keyboard Interrupt
mov #CC_INTC_NIRR_PS2KBR, r2 ; check for interrupts HD64465 Keyboard PS/2 port
tst r2, r1
bt not_kbd465
bra HD64465_ISR_kbd465 ; interrupt occurred on HD64465 Keyboard
nop
not_kbd465:
; test for the HD64465 Mouse Interrupt
mov #CC_INTC_NIRR_PS2MSR, r2 ; check for interrupts HD64465 Mouse PS/2 port
tst r2, r1
bt not_mse465
bra HD64465_ISR_mse465 ; interrupt occurred on HD64465 Mouse
nop
not_mse465:
; test for the HD64465 Parallel Port Interrupt
mov #CC_INTC_NIRR_PPR, r2 ; check for interrupts HD64465 Parallel port
tst r2, r1
bt not_ppr465
bra HD64465_ISR_ppr465 ; interrupt occurred on HD64465 Mouse
nop
not_ppr465:
rts ; WHAT HAPPENED HERE? IRQ w/ no interrupt!
mov #SYSINTR_NOP, r0 ; delayed slot instruction
;--------------------------------------------------------------------------
; CC Serial interrupt
;
HD64465_ISR_uart: ; handle Serial UART interrupt
mov.l #h'53,r1
mov.l #LED_ALPHA,r2 ; Display 'S' for Serial.
mov.l r1, @r2
.aif 0
; NKCH: The code down here does not seem to make sense.
; It is trying to write to UART offset to mask off interrupts, but the
; interrupt mask register is in the interrupt controller INTC, and not
; here.
; Infact what i believe this code was trying to achieve was to remove the
; parallel port interrupts.
; Anyway i remove this code for the time being.
mov #(HD64465_BASE + HD64465_UART_OFFSET + 8),r0 ; ASIC INTC IMR address
mov.w @r0, r1 ; what interrupts are already masked...
mov #h'FFF7,r2 ; Serial interrupt mask value
and r2,r1 ; mask the Serial interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
.aendi
mov #CC_INTC_NIMR,r0 ; ASIC INTC IMR address
mov.w @r0, r1 ; what interrupts are already masked...
mov #CC_INTC_NIMR_UART0M_MASK,r2 ; Serial interrupt mask value
or r2,r1 ; mask the Serial interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; return Serial interrupt occurred
mov #SYSINTR_SERIAL, r0 ; delayed slot instruction
;--------------------------------------------------------------------------
; CC irda interrupt
;
HD64465_ISR_irda: ; handle IrDA UART interrupt
mov.l #h'49,r1
mov.l #LED_ALPHA,r2 ; Display I for IRDA
mov.l r1, @r2
; debug
; mov.l #h'DA6465DA,r1
; mov.l #LED_ALPHA,r2 ; Strike On LED Display
; mov.l r1,@r2 ;
; mask the IrDA interrupt on the HD64461.IMR.TMU0M
; this will prevent the interrupt from occurring again until
; it is unmasked in OEMInterruptEnable/OEMInterruptDone
mov #CC_INTC_NIMR,r0 ; ASIC INTC IMR address
mov.w @r0, r1 ; what interrupts are already masked...
mov #CC_INTC_NIMR_IRDAM_MASK,r2 ; IrDA interrupt mask value
or r2,r1 ; mask the IrDA interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; return IrDA interrupt occurred
mov #SYSINTR_IR, r0 ; delayed slot instruction
HD64465_ISR_usb: ; handle USB interrupt
mov.l #h'55,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
mov #CC_INTC_NIMR,r0 ; ASIC INTC IMR address
mov.w @r0, r1 ; what interrupts are already masked...
mov #CC_INTC_NIMR_USBM_MASK,r2 ; USB interrupt mask value
or r2,r1 ; mask the USB interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; return USB interrupt occurred
mov #SYSINTR_USB, r0 ; delayed slot instruction
;---------------------------------------------------------------------------
; CC Pcmcia Card 0 Interrupt
;
HD64465_ISR_pcmcia0:
; debug
; mov.l #LED_ALPHA,r2
; mov.l #h'C1A00000,r1
; mov.l r1,@r2
mov.l #h'70,r1
mov.l #LED_ALPHA,r2 ; Display lower case 'p' for Slot 0.
mov.l r1, @r2
mov #CC_INTC_NIMR, r0 ; ASIC_INTC IMR address
mov.w @r0, r1 ; get current mask values
mov #CC_INTC_NIMR_PCC0M_MASK,r2 ; PCMCIA0 interrupt mask value
or r2,r1 ; mask the PCMCIA interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
; now we must decide if it is a level int or a status int
mov #CC_PCMCIA_REGBASE, r1 ; get the PCMCIA base reg
mov #CC_PCMCIA_PCC0CSCR_OFFSET, r0
mov.w @(r0, r1), r3 ; get the value of this reg
extu.b r3, r2
mov #CC_PCMCIA_CSCR_IREQ_INT_REQ, r0 ; get the cmp value
extu.b r0, r3
tst r2, r3
bt HD64465_ISR_pcmcia_state
; lets check to make sure that the IREQ is enabled, and this is not a
; ghost int
mov #CC_PCMCIA_PCC0CSCIER_OFFSET, r0
mov.w @(r0, r1), r3 ; get hte value of this reg
mov #CC_PCMCIA_CSCIER_IREQ_MASK, r2
tst r2, r3
bt HD64465_ISR_pcmcia_state ; if no int enabled, it's not ours
bra HD64465_ISR_pcmcia_level
nop
;---------------------------------------------------------------------------
; CC Pcmcia Card 1 Interrupt
;
HD64465_ISR_pcmcia1:
; debug
; mov.l #LED_ALPHA,r2
; mov.l #h'C1A00001,r1
; mov.l r1,@r2
mov.l #h'50,r1
mov.l #LED_ALPHA,r2 ; Display upper case 'P' for Slot 0.
mov.l r1, @r2
mov #CC_INTC_NIMR, r0 ; ASIC_INTC IMR address
mov.w @r0, r1 ; get current mask values
mov #CC_INTC_NIMR_PCC1M_MASK,r2 ; PCMCIA0 interrupt mask value
or r2,r1 ; mask the PCMCIA interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
mov #CC_PCMCIA_REGBASE, r1 ; get the PCMCIA base reg
mov #CC_PCMCIA_PCC1CSCR_OFFSET, r0
mov.w @(r0, r1), r3 ; get the value of this reg
extu.b r3, r2
mov #CC_PCMCIA_CSCR_IREQ_INT_REQ, r0 ; get the cmp value
extu.b r0, r3
tst r2, r3
bt HD64465_ISR_pcmcia_state
; lets check to make sure that the IREQ is enabled, and this is not a
; ghost int
mov #CC_PCMCIA_PCC1CSCIER_OFFSET, r0
mov.w @(r0, r1), r3 ; get hte value of this reg
mov #CC_PCMCIA_CSCIER_IREQ_MASK, r2
tst r2, r3
bt HD64465_ISR_pcmcia_state ; if no int enabled, it's not ours
bra HD64465_ISR_pcmcia_level
nop
HD64465_ISR_pcmcia_state:
rts
mov #SYSINTR_PCMCIA_STATE, r0
HD64465_ISR_pcmcia_level:
rts
mov #SYSINTR_PCMCIA_LEVEL, r0
; mask the PS/2 keyboard interrupt on the HD64465
; this will prevent the interrupt from occurring
; again until it is unmasked in OEMInterruptEnable
; or OEMInterruptDone
HD64465_ISR_kbd465: ; Keyboard Interrupt
; Write something to the LED first.
mov.l #h'4B,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
mov #CC_INTC_NIMR, r0 ; ASIC_INTC IMR address
mov.w @r0, r1 ; get current mask values
mov #CC_INTC_NIMR_PS2KBM_MASK,r2 ; PS/2 keyboard interrupt mask value
or r2,r1 ; mask the PS/2 keyboard interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; use branch delay slot to set return register
mov #SYSINTR_KEYBOARD, r0
; mask the PS/2 mouse interrupt on the HD64465
; this will prevent the interrupt from occurring
; again until it is unmasked in OEMInterruptEnable
; or OEMInterruptDone
HD64465_ISR_mse465: ; Mouse Interrupt
; Write something to the LED first.
mov.l #h'4D,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
mov #CC_INTC_NIMR, r0 ; ASIC_INTC IMR address
mov.w @r0, r1 ; get current mask values
mov #CC_INTC_NIMR_PS2MSM_MASK,r2 ; PS/2 mouse interrupt mask value
or r2,r1 ; mask the PS/2 mouse interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; use branch delay slot to set return register
mov #SYSINTR_MOUSE, r0
;; Mask parallel port interrupts.
HD64465_ISR_ppr465: ; Mouse Interrupt
; Write something to the LED first.
mov.l #h'50,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
mov #CC_INTC_NIMR, r0 ; ASIC_INTC IMR address
mov.w @r0, r1 ; get current mask values
mov #CC_INTC_NIMR_PPM_MASK,r2 ; PS/2 mouse interrupt mask value
or r2,r1 ; mask the PS/2 mouse interrupt
mov.w r1,@r0 ; store the new interrupt mask value back
rts ; use branch delay slot to set return register
mov #SYSINTR_PARALLEL, r0
; End if _HD64465_ISR function
.endf
;*************************************************
;
; HD64464_ISR
;
;*************************************************
LEAF_ENTRY _HD64464_ISR
mov.l #LED_ALPHA,r2
mov.l #h'34,r1
mov.l r1,@r2
rts
mov #SYSINTR_NOP, r0
.endf
;*****************************************************************************
;* Function : _Ethernet_ISR
;* Description : Interrupt Service Routine for SMC91C100 Ethernet controller
;* Inputs : None
;* Outputs : r0 = return Interrupt ID.
;* Notes : This routine replaces the ethernet interrupt handler
;* for S1 since on Aspen the interrupt lines are not
;* multiplexed by the FPGA. On the contrary, the interrupts
;* are level encoded and delivered to SH4.
;* CAUTIONS : Use only r0-r3,r6
;*****************************************************************************
LEAF_ENTRY _Ethernet_ISR
mov.l #h'45,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
.aif (SH_PLATFORM == PLATFORM_ASPEN)
mov #FPGA_IMASK,r0 ;
mov.l @r0,r3 ;
mov #FPGA_IMASK_ILAN,r1 ;
not r1, r1
and r1,r3 ;
mov.l r3,@r0 ;
.aendi
.aif (SH_PLATFORM == PLATFORM_BIGSUR)
mov #INT_IMASK3,r0 ;
mov.l @r0,r3 ;
mov #FPGA_IMASK_ENETINT,r1 ;
or r1,r3 ;
mov.l r3,@r0 ;
.aendi
rts
mov #SYSINTR_ETHER,r0 ;
.endf
;*****************************************************************************
;* Function : _Atapi_ISR
;* Description : Interrupt Service Routine for IDE controller
;* Inputs : None
;* Outputs : r0 = return Interrupt ID.
;* Notes :
;* CAUTIONS : Use only r0-r3,r6
;*****************************************************************************
LEAF_ENTRY _ATAPI_ISR
mov.l #h'30,r1
mov.l #LED_ALPHA,r2 ; Strike On LED Display
mov.l r1, @r2
.aif (SH_PLATFORM == PLATFORM_ASPEN)
mov #FPGA_IMASK,r0 ;
mov.l @r0,r3 ;
mov #FPGA_IMASK_IIDE,r1 ;
not r1, r1
and r1,r3 ;
mov.l r3,@r0 ;
.aendi
.aif (SH_PLATFORM == PLATFORM_BIGSUR)
mov #INT_IMASK1,r0 ;
mov.l @r0,r3 ;
mov #FPGA_IMASK_IDE_INT,r1 ;
or r1,r3 ;
mov.l r3,@r0 ;
.aendi
rts
mov #SYSINTR_IDE,r0 ;
.endf
.end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?