📄 usb_pwr.s79
字号:
LDR R1,[R0, #+0]
UXTH R1,R1
// 110 wCNTR |= CNTR_FSUSP;
// 111 _SetCNTR(wCNTR);
ORRS R1,R1,#0x8
STR R1,[R0, #+0]
// 112
// 113 /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */
// 114 /* power reduction */
// 115 /* ... on connected devices */
// 116
// 117
// 118 /* force low-power mode in the macrocell */
// 119 wCNTR = _GetCNTR();
LDR R1,[R0, #+0]
UXTH R1,R1
// 120 wCNTR |= CNTR_LPMODE;
// 121 _SetCNTR(wCNTR);
ORRS R1,R1,#0x4
STR R1,[R0, #+0]
// 122
// 123 /* switch-off the clocks */
// 124 /* ... */
// 125 Enter_LowPowerMode();
_BF.W Enter_LowPowerMode,??Enter_LowPowerMode??rT
CFI EndBlock cfiBlock2
// 126
// 127 }
// 128
// 129 /*******************************************************************************
// 130 * Function Name : Resume_Init
// 131 * Description : Handles wake-up restoring normal operations
// 132 * Input : None.
// 133 * Output : None.
// 134 * Return : USB_SUCCESS.
// 135 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock3 Using cfiCommon0
CFI Function Resume_Init
THUMB
// 136 void Resume_Init(void)
// 137 {
// 138 u16 wCNTR;
// 139 /* ------------------ ONLY WITH BUS-POWERED DEVICES ---------------------- */
// 140 /* restart the clocks */
// 141 /* ... */
// 142
// 143 /* CNTR_LPMODE = 0 */
// 144 wCNTR = _GetCNTR();
// 145 wCNTR &= (~CNTR_LPMODE);
// 146 _SetCNTR(wCNTR);
Resume_Init:
LDR.N R1,??Resume_Init_0 ;; 0xfffb
PUSH {R4,LR}
CFI ?RET Frame(CFA, -4)
CFI R4 Frame(CFA, -8)
CFI CFA R13+8
LDR.N R4,??DataTable6 ;; 0x40005c40
LDR R0,[R4, #+0]
ANDS R1,R1,R0
STR R1,[R4, #+0]
// 147
// 148 /* restore full power */
// 149 /* ... on connected devices */
// 150 Leave_LowPowerMode();
_BLF Leave_LowPowerMode,??Leave_LowPowerMode??rT
// 151
// 152 /* reset FSUSP bit */
// 153 _SetCNTR(IMR_MSK);
MOVS R0,#+34304
STR R0,[R4, #+0]
// 154
// 155 /* reverse suspend preparation */
// 156 /* ... */
// 157
// 158 }
POP {R4,PC} ;; return
DATA
??Resume_Init_0:
DC32 0xfffb
CFI EndBlock cfiBlock3
// 159
// 160 /*******************************************************************************
// 161 * Function Name : Resume
// 162 * Description : This is the state machine handling resume operations and
// 163 * timing sequence. The control is based on the Resume structure
// 164 * variables and on the ESOF interrupt calling this subroutine
// 165 * without changing machine state.
// 166 * Input : a state machine value (RESUME_STATE)
// 167 * RESUME_ESOF doesn't change ResumeS.eState allowing
// 168 * decrementing of the ESOF counter in different states.
// 169 * Output : None.
// 170 * Return : None.
// 171 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock4 Using cfiCommon0
CFI Function Resume
THUMB
// 172 void Resume(RESUME_STATE eResumeSetVal)
// 173 {
Resume:
PUSH {R4-R6,LR}
CFI ?RET Frame(CFA, -4)
CFI R6 Frame(CFA, -8)
CFI R5 Frame(CFA, -12)
CFI R4 Frame(CFA, -16)
CFI CFA R13+16
// 174 u16 wCNTR;
// 175
// 176 if (eResumeSetVal != RESUME_ESOF)
LDR.N R4,??Resume_1 ;; ResumeS
CMP R0,#+7
IT NE
// 177 ResumeS.eState = eResumeSetVal;
STRBNE R0,[R4, #+0]
// 178
// 179 switch (ResumeS.eState)
LDR.N R0,??DataTable6 ;; 0x40005c40
LDRB R1,[R4, #+0]
MOVS R6,#+4
MOVS R5,#+6
CMP R1,#+5
BHI.N ??Resume_2
TBB [PC, R1]
DATA
??Resume_0:
DC8 +3,+6,+9,+14
DC8 +21,+31
THUMB
// 180 {
// 181 case RESUME_EXTERNAL:
// 182 Resume_Init();
??Resume_3:
BL Resume_Init
// 183 ResumeS.eState = RESUME_OFF;
B.N ??Resume_4
// 184 break;
// 185 case RESUME_INTERNAL:
// 186 Resume_Init();
??Resume_5:
BL Resume_Init
// 187 ResumeS.eState = RESUME_START;
B.N ??Resume_6
// 188 break;
// 189 case RESUME_LATER:
// 190 ResumeS.bESOFcnt = 2;
??Resume_7:
MOVS R0,#+2
STRB R0,[R4, #+1]
// 191 ResumeS.eState = RESUME_WAIT;
MOVS R0,#+3
STRB R0,[R4, #+0]
POP {R4-R6,PC}
// 192 break;
// 193 case RESUME_WAIT:
// 194 ResumeS.bESOFcnt--;
??Resume_8:
LDRB R0,[R4, #+1]
SUBS R0,R0,#+1
STRB R0,[R4, #+1]
// 195 if (ResumeS.bESOFcnt == 0)
LDRB R0,[R4, #+1]
CBNZ R0,??Resume_9
// 196 ResumeS.eState = RESUME_START;
??Resume_6:
STRB R6,[R4, #+0]
POP {R4-R6,PC}
// 197 break;
// 198 case RESUME_START:
// 199 wCNTR = _GetCNTR();
??Resume_10:
LDR R1,[R0, #+0]
UXTH R1,R1
// 200 wCNTR |= CNTR_RESUME;
// 201 _SetCNTR(wCNTR);
ORRS R1,R1,#0x10
STR R1,[R0, #+0]
// 202 ResumeS.eState = RESUME_ON;
MOVS R0,#+5
STRB R0,[R4, #+0]
// 203 ResumeS.bESOFcnt = 10;
MOVS R0,#+10
STRB R0,[R4, #+1]
POP {R4-R6,PC}
// 204 break;
// 205 case RESUME_ON:
// 206 ResumeS.bESOFcnt--;
??Resume_11:
LDRB R1,[R4, #+1]
SUBS R1,R1,#+1
STRB R1,[R4, #+1]
// 207 if (ResumeS.bESOFcnt == 0)
LDRB R1,[R4, #+1]
CBNZ R1,??Resume_9
// 208 {
// 209 wCNTR = _GetCNTR();
LDR R1,[R0, #+0]
// 210 wCNTR &= (~CNTR_RESUME);
// 211 _SetCNTR(wCNTR);
LDR.N R2,??Resume_1+0x4 ;; 0xffef
ANDS R2,R2,R1
STR R2,[R0, #+0]
// 212 ResumeS.eState = RESUME_OFF;
??Resume_4:
STRB R5,[R4, #+0]
POP {R4-R6,PC}
// 213 }
// 214 break;
// 215 case RESUME_OFF:
// 216 case RESUME_ESOF:
// 217 default:
// 218 ResumeS.eState = RESUME_OFF;
??Resume_2:
STRB R5,[R4, #+0]
// 219 break;
// 220 }
// 221 }
??Resume_9:
POP {R4-R6,PC} ;; return
Nop
DATA
??Resume_1:
DC32 ResumeS
DC32 0xffef
CFI EndBlock cfiBlock4
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable6:
DC32 0x40005c40
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock5 Using cfiCommon0
CFI NoFunction
THUMB
??USB_Cable_Config??rT:
LDR.N R3,??Subroutine0_0 ;; USB_Cable_Config
BX R3
DATA
??Subroutine0_0:
DC32 USB_Cable_Config
CFI EndBlock cfiBlock5
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock6 Using cfiCommon0
CFI NoFunction
THUMB
??Enter_LowPowerMode??rT:
LDR.N R3,??Subroutine1_0 ;; Enter_LowPowerMode
BX R3
DATA
??Subroutine1_0:
DC32 Enter_LowPowerMode
CFI EndBlock cfiBlock6
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock7 Using cfiCommon0
CFI NoFunction
THUMB
??Leave_LowPowerMode??rT:
LDR.N R3,??Subroutine2_0 ;; Leave_LowPowerMode
BX R3
DATA
??Subroutine2_0:
DC32 Leave_LowPowerMode
CFI EndBlock cfiBlock7
RSEG DATA_ID:CONST:SORT:NOROOT(0)
`?<Initializer for fSuspendEnabled>`:
DATA
DC8 1
RSEG DATA_ID:CONST:SORT:NOROOT(2)
`?*?DATA_ID`:
RSEG INITTAB:CODE:ROOT(2)
DATA
?init?tab?DATA_I:
DCD sfe(DATA_I) - sfb(DATA_I), sfb(DATA_I), sfb(DATA_ID)
RSEG INITTAB:CODE:ROOT(2)
DATA
?init?tab?DATA_Z:
DCD sfe(DATA_Z) - sfb(DATA_Z), sfb(DATA_Z), sfb(DATA_Z)
END
// 222
// 223 /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
//
// 278 bytes in segment CODE
// 1 byte in segment DATA_I
// 1 byte in segment DATA_ID
// 6 bytes in segment DATA_Z
// 24 bytes in segment INITTAB
//
// 254 bytes of CODE memory (+ 48 bytes shared)
// 1 byte of CONST memory
// 7 bytes of DATA memory
//
//Errors: none
//Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -