1 #include "l1c_reg.h"
2 #include "bl602_common.h"
3
4 /** @addtogroup BL602_Periph_Driver
5 * @{
6 */
7
8 /****************************************************************************/ /**
9 * @brief delay us
10 *
11 * @param[in] core: systemcoreclock
12 *
13 * @param[in] cnt: delay cnt us
14 *
15 * @return none
16 *
17 *******************************************************************************/
18 #ifndef BFLB_USE_ROM_DRIVER
19 #ifdef ARCH_ARM
20 #ifndef __GNUC__
21 __WEAK
ASM_Delay_Us(uint32_t core,uint32_t cnt)22 __ASM void ATTR_TCM_SECTION ASM_Delay_Us(uint32_t core, uint32_t cnt)
23 {
24 lsrs r0, #0x10 muls r0, r1, r0 mov r2, r0 lsrs r2, #0x04 lsrs r2, #0x03 cmp r2, #0x01 beq end cmp r2, #0x00 beq end loop mov r0, r0 mov r0, r0 mov r0, r0 mov r0, r0 mov r0, r0 subs r2, r2, #0x01 cmp r2, #0x00 bne loop end bx lr
25 }
26 #else
27 __WEAK
ASM_Delay_Us(uint32_t core,uint32_t cnt)28 void ATTR_TCM_SECTION ASM_Delay_Us(uint32_t core, uint32_t cnt)
29 {
30 __asm__ __volatile__(
31 "lsr r0,#0x10\n\t"
32 "mul r0,r1,r0\n\t"
33 "mov r2,r0\n\t"
34 "lsr r2,#0x04\n\t"
35 "lsr r2,#0x03\n\t"
36 "cmp r2,#0x01\n\t"
37 "beq end\n\t"
38 "cmp r2,#0x00\n\t"
39 "beq end\n"
40 "loop :"
41 "mov r0,r0\n\t"
42 "mov r0,r0\n\t"
43 "mov r0,r0\n\t"
44 "mov r0,r0\n\t"
45 "mov r0,r0\n\t"
46 "sub r2,r2,#0x01\n\t"
47 "cmp r2,#0x00\n\t"
48 "bne loop\n"
49 "end :"
50 "mov r0,r0\n\t");
51 }
52 #endif
53 #endif
54 #ifdef ARCH_RISCV
55 __WEAK
ASM_Delay_Us(uint32_t core,uint32_t cnt)56 void ATTR_TCM_SECTION ASM_Delay_Us(uint32_t core, uint32_t cnt)
57 {
58 uint32_t codeAddress = 0;
59 uint32_t divVal = 40;
60
61 codeAddress = (uint32_t)&ASM_Delay_Us;
62
63 /* 1M=100K*10, so multiple is 10 */
64 /* loop function take 4 instructions, so instructionNum is 4 */
65 /* if codeAddress locate at IROM space and irom_2t_access is 1, then irom2TAccess=2, else irom2TAccess=1 */
66 /* divVal = multiple*instructionNum*irom2TAccess */
67 if (((codeAddress & (0xF << 24)) >> 24) == 0x01) {
68 /* IROM space */
69 if (BL_GET_REG_BITS_VAL(BL_RD_REG(L1C_BASE, L1C_CONFIG), L1C_IROM_2T_ACCESS)) {
70 /* instruction 2T */
71 divVal = 80;
72 }
73 }
74
75 __asm__ __volatile__(
76 ".align 4\n\t"
77 "lw a4,%1\n\t"
78 "lui a5,0x18\n\t"
79 "addi a5,a5,1696\n\t"
80 "divu a5,a4,a5\n\t"
81 "sw a5,%1\n\t"
82 "lw a4,%1\n\t"
83 "lw a5,%0\n\t"
84 "mul a5,a4,a5\n\t"
85 "sw a5,%1\n\t"
86 "lw a4,%1\n\t"
87 "lw a5,%2\n\t"
88 "divu a5,a4,a5\n\t"
89 "sw a5,%1\n\t"
90 "lw a5,%1\n\t"
91 "li a4,0x1\n\t"
92 "beq a5,zero,end\n\t"
93 "beq a5,a4,end\n\t"
94 "nop\n\t"
95 "nop\n\t"
96 ".align 4\n\t"
97 "loop :\n"
98 "addi a4,a5,-1\n\t"
99 "mv a5,a4\n\t"
100 "bnez a5,loop\n\t"
101 "nop\n\t"
102 "end :\n\t"
103 "nop\n"
104 : /* output */
105 : "m"(cnt), "m"(core), "m"(divVal) /* input */
106 : "t1", "a4", "a5" /* destruct description */
107 );
108 }
109 #endif
110
111 /****************************************************************************/ /**
112 * @brief delay us
113 *
114 * @param[in] cnt: delay cnt us
115 *
116 * @return none
117 *
118 *******************************************************************************/
119 __WEAK
BL602_Delay_US(uint32_t cnt)120 void ATTR_TCM_SECTION BL602_Delay_US(uint32_t cnt)
121 {
122 ASM_Delay_Us(SystemCoreClockGet(), cnt);
123 }
124
125 /****************************************************************************/ /**
126 * @brief delay ms
127 *
128 * @param[in] cnt: delay cnt ms
129 *
130 * @return none
131 *
132 *******************************************************************************/
133 __WEAK
BL602_Delay_MS(uint32_t cnt)134 void ATTR_TCM_SECTION BL602_Delay_MS(uint32_t cnt)
135 {
136 uint32_t i = 0;
137 uint32_t count = 0;
138
139 if (cnt >= 1024) {
140 /* delay (n*1024) ms */
141 count = 1024;
142
143 for (i = 0; i < (cnt / 1024); i++) {
144 BL602_Delay_US(1024 * 1000);
145 }
146 }
147
148 if (cnt & 0x3FF) {
149 /* delay (1-1023)ms */
150 count = cnt & 0x3FF;
151 BL602_Delay_US(count * 1000);
152 }
153
154 //BL602_Delay_US((count<<10)-(count<<4)-(count<<3));
155 }
156 #endif
157
158 /*@} end of group DRIVER_Public_Functions */
159
160 /*@} end of group DRIVER_COMMON */
161
162 /*@} end of group BL602_Periph_Driver */
163