⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xllp_cpdvm.s

📁 Intel PXA270底层设备驱动代码
💻 S
字号:
    INCLUDE xlli_Bulverde_defs.inc	
	EXPORT  XllpXSC1EnterTurbo  
	EXPORT  XllpXSC1ExitTurbo
	EXPORT  XllpXSC1ReadCLKCFG
	EXPORT	XllpXSC1WriteCLKCFG
	EXPORT  XllpXSC1ChangeVoltage
	EXPORT  XllpXSC1FreqChange
	EXPORT  XSC1GetCPUId
	EXPORT  XSC1GetCPSR
	EXPORT  XSC1GetSPSR
	EXPORT  XSC1GetSPSRIrq

	AREA    |.text|, CODE, READONLY, ALIGN=5        ; Align =5 required for "ALIGN 32" to work
	
IRQ_MODE    EQU 2_10010
SVC_MODE    EQU 2_10011
	
;
; XllpXSC1EnterTurbo - Enters Turbo Mode
;
;   Uses r0 - contains value for writing to PWRMODE coprocessor register
;   
;	Preserve the Fast Bus Mode, B bit.
;
XllpXSC1EnterTurbo   FUNCTION

	mrc		p14, 0, r0, c6, c0, 0			; read c6
	and     r0,  r0, #0xd                   ; clear F bit
	orr		r0, r0, #1						; or in Turbo bit
	mcr		p14, 0, r0, c6, c0, 0			; enter Turbo mode
      IF Interworking :LOR: Thumbing
         bx  lr
      ELSE
         mov  pc, lr          ; return
      ENDIF

;
; XllpXSC1ExitTurbo - Exits Turbo Mode
;
;   Uses r0 - contains value for writing to PWRMODE coprocessor register   
;
;	Preserve the Fast Bus Mode, B bit.
;
XllpXSC1ExitTurbo   FUNCTION

	mrc		p14, 0, r0, c6, c0, 0			; read c6
	and		r0, r0, #0xe					; clear Turbo bit to
	mcr		p14, 0, r0, c6, c0, 0			; exit Turbo mode
      IF Interworking :LOR: Thumbing
         bx  lr
      ELSE
         mov  pc, lr          ; return
      ENDIF

;
;XllpXSC1ReadCLKCFG - Reads CCLKCFG register
;
;   Uses r0 - contains return value -> CCLKCFG register contents
;
XllpXSC1ReadCLKCFG   FUNCTION

	mrc		p14, 0, r0, c6, c0, 0			; Read CCLKCFG

	IF Interworking :LOR: Thumbing
	  bx  lr
	ELSE
	  mov  pc, lr          ; return
	ENDIF


;----------------------------------------------------------------------------------------
; XSC1GetCPUId - Get the CPU ID from CP15 R0 Register
;
; This routine reads R0 from CoProcesser 15 to get the CPU ID
;
;       Uses r0 - return value of CPU ID
;----------------------------------------------------------------------------------------
;        LEAF_ENTRY XSC1GetCPUId
XSC1GetCPUId FUNCTION

    mrc     p15, 0, r0, c0, c0, 0

    IF Interworking :LOR: Thumbing
        bx  lr
    ELSE
        mov  pc, lr          ; return
    ENDIF

;----------------------------------------------------------------------------------------
; XSC1GetCPSR - Returns the Current Program Status Register
;
;       Uses r0 returns CPSR
;----------------------------------------------------------------------------------------
XSC1GetCPSR FUNCTION

    mrs     r0, CPSR

    IF Interworking :LOR: Thumbing
     bx  lr
    ELSE
     mov  pc, lr          ; return
    ENDIF
;----------------------------------------------------------------------------------------
; XSC1GetSPSR - Returns the Saved Program Status Register
;
; This routine is called by the IRQ interrupt handler when
; PMU is active and capturing data
;
;       Uses    r0 returns SPSR
;----------------------------------------------------------------------------------------
XSC1GetSPSR FUNCTION

    mrs     r0, SPSR
      IF Interworking :LOR: Thumbing
         bx  lr
      ELSE
         mov  pc, lr          ; return
      ENDIF

;----------------------------------------------------------------------------------------
; XSC1GetSPSRIrq - Returns the Saved Program Status Register
;
; This routine is called by the IRQ interrupt handler when
; PMU is active and capturing data
;
;       Uses    r0 returns SPSR
;----------------------------------------------------------------------------------------
XSC1GetSPSRIrq FUNCTION

    mrs     r1, cpsr
    msr     cpsr_c, #IRQ_MODE:OR:0x80:OR:0x40         ; switch to IRQ Mode w/IRQs&FIQs disabled
    mrs     r0, SPSR
    msr     cpsr_c, r1                                ; switch back to orginal mode
      IF Interworking :LOR: Thumbing
         bx  lr
      ELSE
         mov  pc, lr          ; return
      ENDIF

    
;
; XllpXSC1ChangeVoltage - change voltage
;
;   Uses r0 - contains value for writing to PWRMODE coprocessor register   
;
;	
;
XllpXSC1ChangeVoltage	FUNCTION

	mrc		p14, 0, r0, c7, c0, 0			; read c7
	orr  	r0, r0, #0x8					; Voltage change sequence begins
	mcr		p14, 0, r0, c7, c0, 0			; exit Turbo mode
      IF Interworking :LOR: Thumbing
         bx  lr
      ELSE
         mov  pc, lr          ; return
      ENDIF

XllpXSC1FreqChange	FUNCTION
;
; XSC1FreqChange - Do a Frequency Change
;
;       Uses    
;            r0 - arg1 - mask to set the CLKCFG register
;	          	 
	orr		r0, r0, #2						; set F=1				
	mcr		p14, 0, r0, c6, c0, 0			; do Freq Change
	
FreqRet
	 
	IF Interworking :LOR: Thumbing
		bx  lr
	ELSE
		mov  pc, lr          ; return
	ENDIF

	ENDFUNC
	
XllpXSC1WriteCLKCFG	FUNCTION
;
; XSC1FreqChange - Do a Frequency Change
;
;       Uses    
;            r0 - arg1 - mask to set the CLKCFG register
;	          	 
	mcr		p14, 0, r0, c6, c0, 0			; do Freq Change
	IF Interworking :LOR: Thumbing
		bx  lr
	ELSE
		mov  pc, lr          ; return
	ENDIF

	ENDFUNC
	
 END

⌨️ 快捷键说明

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