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