📄 pmc.lst
字号:
###############################################################################
# #
# 24/Apr/2009 16:18:24 #
# IAR ARM ANSI C/C++ Compiler V5.11.0.20622/W32 EVALUATION #
# Copyright 1999-2007 IAR Systems. All rights reserved. #
# #
# Cpu mode = arm #
# Endian = little #
# Source file = D:\basic-dataflash-project-at91sam7se-ek\at91lib\periphe #
# rals\pmc\pmc.c #
# Command line = D:\basic-dataflash-project-at91sam7se-ek\at91lib\periphe #
# rals\pmc\pmc.c -D at91sam7se512 -D sram -D #
# TRACE_LEVEL=4 -lC D:\basic-dataflash-project-at91sam7se- #
# ek\at91sam7se-ek\basic-dataflash-project\ewp\at91sam7se5 #
# 12_sram\List\ --remarks --diag_suppress Pe826,Pe1375 -o #
# D:\basic-dataflash-project-at91sam7se-ek\at91sam7se-ek\b #
# asic-dataflash-project\ewp\at91sam7se512_sram\Obj\ #
# --no_cse --no_unroll --no_inline --no_code_motion #
# --no_tbaa --no_clustering --no_scheduling --debug #
# --endian little --cpu ARM7TDMI -e --fpu None #
# --dlib_config "D:\Program Files\arm\ARM\INC\DLib_Config_ #
# Full.h" -I D:\basic-dataflash-project-at91sam7se-ek\at91 #
# sam7se-ek\basic-dataflash-project\ewp\..\..\..\at91lib/p #
# eripherals\ -I D:\basic-dataflash-project-at91sam7se-ek\ #
# at91sam7se-ek\basic-dataflash-project\ewp\..\..\..\at91l #
# ib\ -I D:\basic-dataflash-project-at91sam7se-ek\at91sam7 #
# se-ek\basic-dataflash-project\ewp\..\..\..\at91lib/memor #
# ies\ -I D:\basic-dataflash-project-at91sam7se-ek\at91sam #
# 7se-ek\basic-dataflash-project\ewp\..\..\..\at91lib/boar #
# ds/at91sam7se-ek\ -I "D:\Program Files\arm\ARM\INC\" #
# --interwork --cpu_mode arm -Oh #
# List file = D:\basic-dataflash-project-at91sam7se-ek\at91sam7se-ek\b #
# asic-dataflash-project\ewp\at91sam7se512_sram\List\pmc.l #
# st #
# Object file = D:\basic-dataflash-project-at91sam7se-ek\at91sam7se-ek\b #
# asic-dataflash-project\ewp\at91sam7se512_sram\Obj\pmc.o #
# #
# #
###############################################################################
D:\basic-dataflash-project-at91sam7se-ek\at91lib\peripherals\pmc\pmc.c
1 /* ----------------------------------------------------------------------------
2 * ATMEL Microcontroller Software Support
3 * ----------------------------------------------------------------------------
4 * Copyright (c) 2008, Atmel Corporation
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the disclaimer below.
13 *
14 * Atmel's name may not be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * ----------------------------------------------------------------------------
28 */
29
30 //------------------------------------------------------------------------------
31 // Headers
32 //------------------------------------------------------------------------------
33
34 #include "pmc.h"
35 #include <board.h>
36 #include <utility/assert.h>
37 #include <utility/trace.h>
38
39 #ifdef CP15_PRESENT
40 #include <cp15/cp15.h>
41 #endif
42
43 #define MASK_STATUS 0x3FFFFFFC
44
45 //------------------------------------------------------------------------------
46 // Global functions
47 //------------------------------------------------------------------------------
48
49 #if defined(at91sam7l64) || defined(at91sam7l128)
50 //------------------------------------------------------------------------------
51 /// Sets the fast wake-up inputs that can get the device out of Wait mode.
52 /// \param inputs Fast wake-up inputs to enable.
53 //------------------------------------------------------------------------------
54 void PMC_SetFastWakeUpInputs(unsigned int inputs)
55 {
56 SANITY_CHECK((inputs & ~0xFF) == 0);
57 AT91C_BASE_PMC->PMC_FSMR = inputs;
58 }
59
60 #if !defined(__ICCARM__)
61 __attribute__ ((section (".ramfunc"))) // GCC
62 #endif
63 //------------------------------------------------------------------------------
64 /// Disables the main oscillator, making the device enter Wait mode.
65 //------------------------------------------------------------------------------
66 void PMC_DisableMainOscillatorForWaitMode(void)
67 {
68 AT91C_BASE_PMC->PMC_MOR = 0x37 << 16;
69 while ((AT91C_BASE_PMC->PMC_MOR & AT91C_PMC_MAINSELS) != AT91C_PMC_MAINSELS);
70 }
71
72 #endif
73
74 #if defined(at91sam7l)
75 //------------------------------------------------------------------------------
76 /// Disables the main oscillator when NOT running on it.
77 //------------------------------------------------------------------------------
78 void PMC_DisableMainOscillator(void)
79 {
80 AT91C_BASE_PMC->PMC_MOR = 0x37 << 16;
81 while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MAINSELS) == AT91C_PMC_MAINSELS);
82 }
83 #endif
84
85 //------------------------------------------------------------------------------
86 /// Disables the processor clock
87 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
88 void PMC_DisableProcessorClock(void)
89 {
90 AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_PCK;
\ PMC_DisableProcessorClock:
\ 00000000 FB00E0E3 MVN R0,#+251
\ 00000004 C00FC0E3 BIC R0,R0,#0x300
\ 00000008 0110A0E3 MOV R1,#+1
\ 0000000C 001080E5 STR R1,[R0, #+0]
91 while ((AT91C_BASE_PMC->PMC_SCSR & AT91C_PMC_PCK) != AT91C_PMC_PCK);
\ ??PMC_DisableProcessorClock_0:
\ 00000010 F700E0E3 MVN R0,#+247
\ 00000014 C00FC0E3 BIC R0,R0,#0x300
\ 00000018 000090E5 LDR R0,[R0, #+0]
\ 0000001C 010010E3 TST R0,#0x1
\ 00000020 FAFFFF0A BEQ ??PMC_DisableProcessorClock_0
92 }
\ 00000024 1EFF2FE1 BX LR ;; return
93
94 //------------------------------------------------------------------------------
95 /// Enables the clock of a peripheral. The peripheral ID (AT91C_ID_xxx) is used
96 /// to identify which peripheral is targetted.
97 /// Note that the ID must NOT be shifted (i.e. 1 << AT91C_ID_xxx).
98 /// \param id Peripheral ID (AT91C_ID_xxx).
99 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
100 void PMC_EnablePeripheral(unsigned int id)
101 {
\ PMC_EnablePeripheral:
\ 00000000 01402DE9 PUSH {R0,LR}
102 SANITY_CHECK(id < 32);
\ 00000004 200050E3 CMP R0,#+32
\ 00000008 0600003A BCC ??PMC_EnablePeripheral_0
\ 0000000C ........ LDR R0,??DataTable3 ;; `?<Constant "-F- ASSERT: ">`
\ 00000010 ........ BL printf
\ 00000014 6620A0E3 MOV R2,#+102
\ 00000018 ........ LDR R1,??DataTable4 ;; `?<Constant "D:\\\\basic-dataflash-pr...">`
\ 0000001C ........ LDR R0,??DataTable5 ;; `?<Constant "Sanity check failed a...">`
\ 00000020 ........ BL printf
\ ??PMC_EnablePeripheral_1:
\ 00000024 FEFFFFEA B ??PMC_EnablePeripheral_1
103
104 if ((AT91C_BASE_PMC->PMC_PCSR & (1 << id)) == (1 << id)) {
\ ??PMC_EnablePeripheral_0:
\ 00000028 E710E0E3 MVN R1,#+231
\ 0000002C C01FC1E3 BIC R1,R1,#0x300
\ 00000030 001091E5 LDR R1,[R1, #+0]
\ 00000034 0120A0E3 MOV R2,#+1
\ 00000038 121001E0 AND R1,R1,R2, LSL R0
\ 0000003C 120051E1 CMP R1,R2, LSL R0
\ 00000040 1200A011 LSLNE R0,R2,R0
\ 00000044 EF10E013 MVNNE R1,#+239
\ 00000048 C01FC113 BICNE R1,R1,#0x300
\ 0000004C 00008115 STRNE R0,[R1, #+0]
105
106 TRACE_INFO("PMC_EnablePeripheral: clock of peripheral"
107 " %u is already enabled\n\r",
108 id);
\ 00000050 0010A001 MOVEQ R1,R0
\ 00000054 08009F05 LDREQ R0,??PMC_EnablePeripheral_2 ;; `?<Constant "-I- PMC_EnablePeriphe...">`
\ 00000058 ........ BLEQ printf
109 }
110 else {
111
112 AT91C_BASE_PMC->PMC_PCER = 1 << id;
113 }
114 }
\ 0000005C 0050BDE8 POP {R12,LR}
\ 00000060 1EFF2FE1 BX LR ;; return
\ ??PMC_EnablePeripheral_2:
\ 00000064 ........ DC32 `?<Constant "-I- PMC_EnablePeriphe...">`
115
116 //------------------------------------------------------------------------------
117 /// Disables the clock of a peripheral. The peripheral ID (AT91C_ID_xxx) is used
118 /// to identify which peripheral is targetted.
119 /// Note that the ID must NOT be shifted (i.e. 1 << AT91C_ID_xxx).
120 /// \param id Peripheral ID (AT91C_ID_xxx).
121 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
122 void PMC_DisablePeripheral(unsigned int id)
123 {
\ PMC_DisablePeripheral:
\ 00000000 01402DE9 PUSH {R0,LR}
124 SANITY_CHECK(id < 32);
\ 00000004 200050E3 CMP R0,#+32
\ 00000008 0600003A BCC ??PMC_DisablePeripheral_0
\ 0000000C ........ LDR R0,??DataTable3 ;; `?<Constant "-F- ASSERT: ">`
\ 00000010 ........ BL printf
\ 00000014 7C20A0E3 MOV R2,#+124
\ 00000018 ........ LDR R1,??DataTable4 ;; `?<Constant "D:\\\\basic-dataflash-pr...">`
\ 0000001C ........ LDR R0,??DataTable5 ;; `?<Constant "Sanity check failed a...">`
\ 00000020 ........ BL printf
\ ??PMC_DisablePeripheral_1:
\ 00000024 FEFFFFEA B ??PMC_DisablePeripheral_1
125
126 if ((AT91C_BASE_PMC->PMC_PCSR & (1 << id)) != (1 << id)) {
\ ??PMC_DisablePeripheral_0:
\ 00000028 E710E0E3 MVN R1,#+231
\ 0000002C C01FC1E3 BIC R1,R1,#0x300
\ 00000030 001091E5 LDR R1,[R1, #+0]
\ 00000034 0120A0E3 MOV R2,#+1
\ 00000038 121001E0 AND R1,R1,R2, LSL R0
\ 0000003C 120051E1 CMP R1,R2, LSL R0
\ 00000040 1200A001 LSLEQ R0,R2,R0
\ 00000044 EB10E003 MVNEQ R1,#+235
\ 00000048 C01FC103 BICEQ R1,R1,#0x300
\ 0000004C 00008105 STREQ R0,[R1, #+0]
127
128 TRACE_INFO("PMC_DisablePeripheral: clock of peripheral"
129 " %u is not enabled\n\r",
130 id);
\ 00000050 0010A011 MOVNE R1,R0
\ 00000054 08009F15 LDRNE R0,??PMC_DisablePeripheral_2 ;; `?<Constant "-I- PMC_DisablePeriph...">`
\ 00000058 ........ BLNE printf
131 }
132 else {
133
134 AT91C_BASE_PMC->PMC_PCDR = 1 << id;
135 }
136 }
\ 0000005C 0050BDE8 POP {R12,LR}
\ 00000060 1EFF2FE1 BX LR ;; return
\ ??PMC_DisablePeripheral_2:
\ 00000064 ........ DC32 `?<Constant "-I- PMC_DisablePeriph...">`
137
138 //------------------------------------------------------------------------------
139 /// Enable all the periph clock via PMC
140 /// (Becareful of the last 2 bits, it is not periph clock)
141 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
142 void PMC_EnableAllPeripherals(void)
143 {
\ PMC_EnableAllPeripherals:
\ 00000000 01402DE9 PUSH {R0,LR}
144 AT91C_BASE_PMC->PMC_PCER = MASK_STATUS;
\ 00000004 EF00E0E3 MVN R0,#+239
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -