1 /*
2  * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "hal_gpio.h"
9 
GPIO_Init(GPIO_Type * GPIOx,GPIO_Init_Type * init)10 void GPIO_Init(GPIO_Type  * GPIOx, GPIO_Init_Type * init)
11 {
12     uint8_t idx;
13     uint8_t i;
14     uint32_t pin;
15     __IO uint32_t * addr;
16 
17     /* 1x. */
18     uint32_t dat = init->PinMode & 0xFu;
19     if (init->PinMode & 0x10u)
20     {
21         dat |= init->Speed;
22     }
23 
24     /* 0x. */
25     addr = &(GPIOx->CRL);
26     for (i = 0u; i < 8u; i++)
27     {
28         idx = i * 4u;
29         if ( (init->Pins) & (1u << i) )
30         {
31             *addr = ( *addr  & ~(0xFu << idx) ) | (dat << idx);
32         }
33     }
34 
35     addr = &(GPIOx->CRH);
36     pin = init->Pins >> 8u;
37     for (i = 0u; i < 8u; i++)
38     {
39         idx = i * 4u;
40         if ( pin & (1u << i) )
41         {
42             *addr  = ( *addr  & ~(0xFu << idx) ) | (dat << idx);
43         }
44     }
45 
46     /* 2x,4x. */
47     if (init->PinMode == GPIO_PinMode_In_PullDown)
48     {
49         GPIOx->BRR |= init->Pins;
50     }
51     else if (init->PinMode == GPIO_PinMode_In_PullUp)
52     {
53         GPIOx->BSRR |= init->Pins;
54     }
55 }
56 
GPIO_ReadInDataBit(GPIO_Type * GPIOx,uint16_t pin)57 bool GPIO_ReadInDataBit(GPIO_Type  * GPIOx, uint16_t pin)
58 {
59     return (GPIOx->IDR & pin);
60 }
61 
GPIO_ReadInData(GPIO_Type * GPIOx)62 uint16_t GPIO_ReadInData(GPIO_Type * GPIOx)
63 {
64     return (uint16_t)(GPIOx->IDR);
65 }
66 
GPIO_ReadOutDataBit(GPIO_Type * GPIOx,uint16_t pins)67 bool GPIO_ReadOutDataBit(GPIO_Type * GPIOx, uint16_t pins)
68 {
69     return (GPIOx->ODR & pins);
70 }
71 
GPIO_ReadOutData(GPIO_Type * GPIOx)72 uint16_t GPIO_ReadOutData(GPIO_Type * GPIOx)
73 {
74     return (uint16_t)GPIOx->ODR;
75 }
76 
GPIO_SetBits(GPIO_Type * GPIOx,uint16_t pins)77 void GPIO_SetBits(GPIO_Type * GPIOx, uint16_t pins)
78 {
79     GPIOx->BSRR = pins;
80 }
81 
GPIO_ClearBits(GPIO_Type * GPIOx,uint16_t pins)82 void GPIO_ClearBits(GPIO_Type * GPIOx, uint16_t pins)
83 {
84     GPIOx->BRR = pins;
85 }
86 
GPIO_WriteBit(GPIO_Type * GPIOx,uint16_t pins,uint16_t val)87 void GPIO_WriteBit(GPIO_Type * GPIOx, uint16_t pins, uint16_t val)
88 {
89     (val != 0u) ? (GPIOx->BSRR = pins) : (GPIOx->BRR = pins);
90 }
91 
GPIO_WriteBits(GPIO_Type * GPIOx,uint16_t val)92 void GPIO_WriteBits(GPIO_Type * GPIOx, uint16_t val)
93 {
94     GPIOx->ODR = val;
95 }
96 
GPIO_PinLock(GPIO_Type * GPIOx,uint16_t pins,bool enable_lock)97 void GPIO_PinLock(GPIO_Type * GPIOx, uint16_t pins, bool enable_lock)
98 {
99     (enable_lock) ? (GPIOx->LCKR |= pins) : (GPIOx->LCKR &= ~pins);
100 }
101 
GPIO_PinLockConf(GPIO_Type * GPIOx,uint16_t pins)102 void GPIO_PinLockConf(GPIO_Type * GPIOx, uint16_t pins)
103 {
104     GPIOx->LCKR = GPIO_LCKR_LCKK_MASK | GPIO_LCKR_LCK(pins);
105     GPIOx->LCKR = pins;
106     GPIOx->LCKR = GPIO_LCKR_LCKK_MASK | GPIO_LCKR_LCK(pins);
107     GPIOx->LCKR;
108     GPIOx->LCKR;
109 }
110 
GPIO_PinAFConf(GPIO_Type * GPIOx,uint16_t pins,uint8_t af)111 void GPIO_PinAFConf(GPIO_Type * GPIOx, uint16_t pins, uint8_t af)
112 {
113     uint32_t shift = 0u;
114     uint32_t idx = 0u;
115     uint32_t val = GPIOx->AFRL;
116     while (idx < 8u)
117     {
118         if ( ( (1u << idx) & pins) != 0u )
119         {
120             shift = idx * 4u;
121             val &= ~(0xFu << shift);
122             val |= (uint32_t)af << shift;
123         }
124         idx++;
125     }
126     GPIOx->AFRL = val;
127 
128     val = GPIOx->AFRH;
129     while (idx < 16u)
130     {
131         if ( ( (1u << idx) & pins) != 0u )
132         {
133             shift = (idx - 8u) * 4u;
134             val &= ~(0xFu << shift);
135             val |= (uint32_t)af << shift;
136         }
137         idx++;
138     }
139     GPIOx->AFRH = val;
140 }
141 
GPIO_PortAFConfig(GPIO_Type * GPIOx,uint32_t af_high,uint32_t af_low)142 void GPIO_PortAFConfig(GPIO_Type * GPIOx, uint32_t af_high, uint32_t af_low)
143 {
144     GPIOx->AFRL = af_low;
145     GPIOx->AFRH = af_high;
146 }
147 
148 /* EOF. */
149 
150