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 + -
显示快捷键?