1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-08-27     Jiao         first version
9  */
10 
11 #include "board.h"
12 
FL_UART_GPIO_Init(UART_Type * UARTx)13 FL_ErrorStatus FL_UART_GPIO_Init(UART_Type *UARTx)
14 {
15     FL_ErrorStatus status = FL_FAIL;
16     FL_GPIO_InitTypeDef    GPIO_InitStruct;
17     if (UARTx ==  UART0)
18     {
19         GPIO_InitStruct.pin = FL_GPIO_PIN_13;
20         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
21         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
22         GPIO_InitStruct.pull = FL_DISABLE;
23         GPIO_InitStruct.remapPin = FL_DISABLE;
24 
25         status = FL_GPIO_Init(GPIOA, &GPIO_InitStruct);
26 
27         GPIO_InitStruct.pin = FL_GPIO_PIN_14;
28         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
29         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
30         GPIO_InitStruct.pull = FL_DISABLE;
31         GPIO_InitStruct.remapPin = FL_DISABLE;
32 
33         status = FL_GPIO_Init(GPIOA, &GPIO_InitStruct);
34     }
35     else if (UARTx ==  UART1)
36     {
37         GPIO_InitStruct.pin = FL_GPIO_PIN_13;
38         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
39         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
40         GPIO_InitStruct.pull = FL_DISABLE;
41         GPIO_InitStruct.remapPin = FL_DISABLE;
42 
43         status = FL_GPIO_Init(GPIOB, &GPIO_InitStruct);
44 
45         GPIO_InitStruct.pin = FL_GPIO_PIN_14;
46         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
47         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
48         GPIO_InitStruct.pull = FL_DISABLE;
49         GPIO_InitStruct.remapPin = FL_DISABLE;
50 
51         status = FL_GPIO_Init(GPIOB, &GPIO_InitStruct);
52     }
53     else if (UARTx ==  UART4)
54     {
55         GPIO_InitStruct.pin = FL_GPIO_PIN_0;
56         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
57         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
58         GPIO_InitStruct.pull = FL_DISABLE;
59         GPIO_InitStruct.remapPin = FL_DISABLE;
60 
61         status = FL_GPIO_Init(GPIOA, &GPIO_InitStruct);
62 
63         GPIO_InitStruct.pin = FL_GPIO_PIN_1;
64         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
65         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
66         GPIO_InitStruct.pull = FL_DISABLE;
67         GPIO_InitStruct.remapPin = FL_DISABLE;
68 
69         status = FL_GPIO_Init(GPIOA, &GPIO_InitStruct);
70     }
71     return status;
72 }
73 
FL_SPI_GPIO_Init(SPI_Type * SPIx)74 FL_ErrorStatus FL_SPI_GPIO_Init(SPI_Type *SPIx)
75 {
76     FL_ErrorStatus status = FL_FAIL;
77     FL_GPIO_InitTypeDef GPIO_InitStruct;
78     if (SPIx == SPI1)
79     {
80         GPIO_InitStruct.pin = FL_GPIO_PIN_11 | FL_GPIO_PIN_10 | FL_GPIO_PIN_9;
81         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
82         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
83         GPIO_InitStruct.pull = FL_DISABLE;
84         GPIO_InitStruct.remapPin = FL_DISABLE;
85 
86         status=FL_GPIO_Init(GPIOB, &GPIO_InitStruct);
87     }
88     else if (SPIx == SPI2)
89     {
90         GPIO_InitStruct.pin = FL_GPIO_PIN_8 | FL_GPIO_PIN_10 | FL_GPIO_PIN_9;
91         GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
92         GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
93         GPIO_InitStruct.pull = FL_DISABLE;
94         GPIO_InitStruct.remapPin = FL_DISABLE;
95 
96         status=FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
97     }
98 
99     return status;
100 }
101 
RCC_PLL_ConfigDomain_SYS(uint32_t Source,uint32_t PLL_R,uint32_t PLL_DB,uint32_t PLL_O)102 static void RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLL_R, uint32_t PLL_DB, uint32_t PLL_O)
103 {
104     MODIFY_REG(RCC->PLLCR, RCC_PLLCR_DB_Msk | RCC_PLLCR_REFPRSC_Msk | RCC_PLLCR_OSEL_Msk | RCC_PLLCR_INSEL_Msk,
105                (PLL_DB << RCC_PLLCR_DB_Pos) | PLL_R | PLL_O | Source);
106 }
107 
RCHFInit(uint32_t clock)108 static void RCHFInit(uint32_t clock)
109 {
110     switch (clock)
111     {
112     case FL_RCC_RCHF_FREQUENCY_8MHZ:
113         FL_RCC_RCHF_WriteTrimValue(RCHF8M_TRIM);
114         break;
115 
116     case FL_RCC_RCHF_FREQUENCY_16MHZ:
117         FL_RCC_RCHF_WriteTrimValue(RCHF16M_TRIM);
118         break;
119 
120     case FL_RCC_RCHF_FREQUENCY_24MHZ:
121         FL_RCC_RCHF_WriteTrimValue(RCHF24M_TRIM);
122         break;
123 
124     default:
125         FL_RCC_RCHF_WriteTrimValue(RCHF8M_TRIM);
126         break;
127     }
128 
129     FL_RCC_RCHF_SetFrequency(clock);
130 }
131 
SelRCHFToPLL(uint32_t rchf,uint32_t clock)132 void SelRCHFToPLL(uint32_t rchf, uint32_t clock)
133 {
134     uint32_t div = FL_RCC_PLL_PSC_DIV8;
135 
136     if (clock > 64)
137     {
138         return;
139     }
140 
141     RCHFInit(rchf);
142 
143     switch (rchf)
144     {
145     case FL_RCC_RCHF_FREQUENCY_16MHZ:
146         div = FL_RCC_PLL_PSC_DIV16;
147         break;
148 
149     case FL_RCC_RCHF_FREQUENCY_24MHZ:
150         div = FL_RCC_PLL_PSC_DIV24;
151         break;
152 
153     default:
154         break;
155     }
156 
157     if (clock <= 24)
158     {
159         FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE);
160     }
161 
162     else
163     {
164         if ((clock > 24) && (clock <= 48))
165         {
166             FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE);
167         }
168 
169         else
170         {
171             FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE);
172         }
173     }
174 
175     RCC_PLL_ConfigDomain_SYS(FL_RCC_PLL_CLK_SOURCE_RCHF, div, clock, FL_RCC_PLL_OUTPUT_X1);
176     FL_RCC_PLL_Enable();
177 
178     while (FL_RCC_IsActiveFlag_PLLReady() != FL_SET);
179 
180     FL_RCC_SetAHBPrescaler(FL_RCC_AHBCLK_PSC_DIV1);
181     FL_RCC_SetAPB1Prescaler(FL_RCC_APB1CLK_PSC_DIV1);
182     FL_RCC_SetAPB2Prescaler(FL_RCC_APB2CLK_PSC_DIV1);
183     FL_RCC_SetSystemClockSource(FL_RCC_SYSTEM_CLK_SOURCE_PLL);
184 }
185