📄 iar_pm674061_lib.s
字号:
LDR pc,[r2,r1,LSL #2]
pm_diva_clkgear_Jump_Table
DCD pm_diva_clkgear_s_f ; slow -> fast
DCD pm_diva_clkgear_f_s ; fast -> slow
;*****************************************************************************
;*** slow -> fast routine ***
pm_diva_clkgear_s_f
#ifdef __ML67Q405x__
;*** reconfigure memory parameter ***
BL mempara_set_normal
#endif
;*** change DIVA_CLK ***
LDR r1,=CLKCNT
LDR r2,[r1] ; get a value of CLKCNT
AND r2,r2,#0xffffffe3
ORR r2,r2,r0,LSL #2
STR r2,[r1] ; change DIVA_CLK
B pm_diva_clkgear_200
;*****************************************************************************
;*** fast -> slow routine ***
pm_diva_clkgear_f_s
;*** change DIVA_CLK ***
LDR r1,=CLKCNT
LDR r2,[r1] ; get a velue of CLKCNT
AND r2,r2,#0xffffffe3
ORR r2,r2,r0,LSL #2
STR r2,[r1] ; change DIVA_CLK
#ifdef __ML67Q405x__
;*** reconfigure memory parameter ***
BL mempara_set_normal
#endif
B pm_diva_clkgear_200
;*****************************************************************************
pm_diva_clkgear_200
;*** restore CPSR ***
LDR r1,=SAVE_CPSR ; get SAVE_CPSR
LDR r0,[r1] ; r0 <- SAVE_CPSR
SWI SWI_PM_IF_RECOV ; restore CPSR input parameter:r0 -> CPSR
;*** restore registers ***
LDMFD SP!,{r1-r3,lr} ; restore r1-r3,lr register
;*** set normal end return value(0) ***
MOV r0,#0 ; set normal end return value
pm_diva_clkgear_end
BX lr ; return
pm_diva_clkgear_error_end
ORR r0,r0,r1 ; set error end return value
BX lr ; return
;************************************************************************
;* *
;* change APB_CLK *
;* APB_CLK speed : 1/1, 1/2, 1/4 *
;* *
;* pm_apb_clkgear *
;* *
;* input *
;* r0:dividing ratio 0=1/1, 1=1/2, 2=1/4 *
;* *
;* r1:mode 0 = slow -> fast *
;* 1 = fast -> slow *
;* *
;*----------------------------------------------------------------------*
;* *
;* C API name unsigned long pm_apb_clkgear *
;* (unsigned long Change_apb_clk) *
;* *
;* input unsigned long Change_apb_clk *
;* 0 = 1/1 *
;* 1 = 1/2 *
;* 2 = 1/4 *
;* *
;* output 0 : normal end *
;* non 0 : input parameter error *
;* *
;*----------------------------------------------------------------------*
;* *
;* using registers r0,r1,r2,r3 *
;* *
;************************************************************************
EXPORT pm_apb_clkgear
pm_apb_clkgear ; unsigned long pm_apb_clkgear(unsigned long Change_apb_clk)
;*** check input parameter ***
CMP r0,#0x2
BHI pm_apb_clkgear_error_end ; error end
;*** save registers ***
STMFD SP!,{r1-r3,lr} ; save r1,r2,lr register
;*** mask IRQ and FIQ. and get pre-masked CPSR ***
MOV r2,r0 ; save r0->r2
SWI SWI_PM_IF_DIS ; mask IRQ and FIQ, return value:r0 = pre-masked CPSR
;*** save pre-masked CPSR ***
LDR r3,=SAVE_CPSR ; save CPSR ->SAVE_CPSR
STR r0,[r3]
MOV r0,r2 ; restore r2->r0
;*** wait ***
nop ; NOP * 2
nop
;*** change APB_CLK ***
LDR r1,=CLKCNT
LDR r2,[r1] ; get a velue of CLKCNT
AND r2,r2,#0xfffff3ff
ORR r2,r2,r0,LSL #10
STR r2,[r1] ; change APB_CLK
;*** restore CPSR ***
LDR r1,=SAVE_CPSR ; get SAVE_CPSR
LDR r0,[r1] ; r0 <- SAVE_CPSR
SWI SWI_PM_IF_RECOV ; restore CPSR input parameter:r0 -> CPSR
;*** restore registers ***
LDMFD SP!,{r1-r3,lr} ; restore r1,r2,lr register
;*** set normal end return value(0) ***
MOV r0,#0 ; set normal end return value
pm_apb_clkgear_end
BX lr ; return
pm_apb_clkgear_error_end
ORR r0,r0,r1 ; set error end return value
BX lr ; return
;************************************************************************
;* Set MASK *
;* Function : iptmask_set *
;* *
;* Parameters *
;* input : r1 = allowed IRQ No. *
;* output : nothing *
;* *
;* using registers : r1,r2,r3,r4 *
;* *
;************************************************************************
iptmask_set1
STMFD SP!,{r1-r5} ; save r1-r5 register
ADR r3,ipmask_set_jt1 ; get an address of jump table
BIC r4,r2,#0x00000007
LDR pc,[r3,r4,LSR #1] ; branch each process
ipmask_set_jt1 ; jump table
DCD ipmask_set_0_7
DCD ipmask_set_8_15
DCD ipmask_set_16_23
DCD ipmask_set_24_31
ipmask_set_0_7 ; IRQ0-IRQ7
LDR r5,=ILC0 ; get an address of ILC0
B iptmask_set_common1
ipmask_set_8_15 ; IRQ8-IRQ15
LDR r5,=ILC1 ; get an address of ILC1
B iptmask_set_common1
ipmask_set_16_23 ; IRQ16-IRQ23
ipmask_set_24_31 ; IRQ24-IRQ31
LDR r5,=EXILCA ; get an address of EXILCA
B iptmask_set_common1
iptmask_set_common1
LDR r4,[r5] ; get IRQ information
LDR r3,=INTMASK_VAL ; get an IRQ priority data from table
LDR r3,[r3,r2,LSL#2]
ORR r1,r4,r3
STR r1,[r5] ; set IRQ priority
LDMFD SP!,{r1-r5} ; restore r1-r4 register
MOV pc,lr ; return
iptmask_set2
STMFD SP!,{r1-r5} ; save r1-r5 register
ADR r3,ipmask_set_jt2 ; get an address of jump table
BIC r4,r2,#0x00000007
LDR pc,[r3,r4,LSR #1] ; branch each process
ipmask_set_jt2 ; jump table
DCD ipmask_set_32_39
DCD ipmask_set_40_47
DCD ipmask_set_48_55
DCD ipmask_set_56_63
ipmask_set_32_39 ; IRQ32-IRQ29
ipmask_set_40_47 ; IRQ40-IRQ47
LDR r5,=EXILCB ; get an address of EXILCB
B iptmask_set_common2
ipmask_set_48_55 ; IRQ48-IRQ55
ipmask_set_56_63 ; IR56-IRQ63
LDR r5,=EXILCC ; get an address of EXILCC
B iptmask_set_common2
iptmask_set_common2
LDR r4,[r5] ; get IRQ information
LDR r3,=INTMASK_VAL2 ; get an IRQ priority data from table
LDR r3,[r3,r2,LSL#2]
ORR r1,r4,r3
STR r1,[r5] ; set IRQ priority
LDMFD SP!,{r1-r5} ; restore r1-r4 register
MOV pc,lr ; return
;************************************************************************
;* Set Memory Parameter (normal speed) *
;* Function : mempara_set_normal *
;* *
;* Parameters *
;* Input : r0:Clock Gear No. *
;* Output : Nothing *
;* *
;* using registers : r0,r1,r2 *
;* *
;************************************************************************
mempara_set_normal
STMFD SP!,{r0-r2} ; save r0-r2 register
LDR r1,=ROMAC_VAL ; get a setting value of ROMAC from table
LDR r1,[r1,r0,LSL#2]
LDR r2,=ROMAC ; set ROMAC
STR r1,[r2]
LDR r1,=RAMAC_VAL ; get a setting value of RAMAC from table
LDR r1,[r1,r0,LSL#2]
LDR r2,=RAMAC ; set RAMAC
STR r1,[r2]
LDR r1,=IO0AC_VAL ; get a setting value of IO0AC from table
LDR r1,[r1,r0,LSL#2]
LDR r2,=IO0AC ; set IO0AC
STR r1,[r2]
LDR r1,=IO1AC_VAL ; get a setting value of IO1AC from table
LDR r1,[r1,r0,LSL#2]
LDR r2,=IO1AC ; set IO1AC
STR r1,[r2]
LDMFD SP!,{r0-r2} ; restore r0-r2 register
MOV pc,lr ; return
;*******************************************************************************
;*******************************************************************************
;*******************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -