Skip to content

Commit f01d784

Browse files
committed
drivers: pinctrl: Update bflb pinctrl driver
Update driver file for SDK-independance Signed-off-by: Camille BAUD <mail@massdriver.space>
1 parent 0f3b8c3 commit f01d784

File tree

2 files changed

+113
-21
lines changed

2 files changed

+113
-21
lines changed

drivers/pinctrl/pinctrl_bflb.c

Lines changed: 112 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,131 @@
66

77
#include <zephyr/kernel.h>
88
#include <zephyr/drivers/pinctrl.h>
9-
#include <bflb_pinctrl.h>
10-
#include <bflb_glb.h>
11-
#include <bflb_gpio.h>
129

13-
/* clang-format off */
10+
#include <bflb_soc.h>
11+
#include <glb_reg.h>
12+
#include <zephyr/dt-bindings/pinctrl/bflb-common-pinctrl.h>
13+
14+
#if defined(CONFIG_SOC_SERIES_BL60X)
15+
#include <zephyr/dt-bindings/pinctrl/bl60x-pinctrl.h>
16+
17+
void pinctrl_configure_uart(uint8_t pin, uint8_t func)
18+
{
19+
/* uart func for BL602 and BL702 Only*/
20+
uint32_t regval;
21+
uint8_t sig;
22+
uint8_t sig_pos;
23+
24+
regval = sys_read32(GLB_BASE + GLB_UART_SIG_SEL_0_OFFSET);
25+
26+
sig = pin % 8;
27+
sig_pos = sig << 2;
28+
29+
regval &= (~(0x0f << sig_pos));
30+
regval |= (func << sig_pos);
31+
32+
for (uint8_t i = 0; i < 8; i++) {
33+
/* reset other sigs which are the same with uart_func */
34+
sig_pos = i << 2;
35+
if (((regval & (0x0f << sig_pos)) == (func << sig_pos)) && (i != sig) && (func !=
36+
0x0f)) {
37+
regval &= (~(0x0f << sig_pos));
38+
regval |= (0x0f << sig_pos);
39+
}
40+
}
41+
42+
sys_write32(regval, GLB_BASE + GLB_UART_SIG_SEL_0_OFFSET);
43+
}
44+
45+
void pinctrl_init_pin(pinctrl_soc_pin_t pin)
46+
{
47+
uint8_t drive;
48+
uint8_t function;
49+
uint16_t mode;
50+
uint32_t regval;
51+
uint8_t real_pin;
52+
uint8_t is_odd = 0;
53+
uint32_t cfg = 0;
54+
uint32_t cfg_address;
55+
56+
real_pin = BFLB_PINMUX_GET_PIN(pin);
57+
function = BFLB_PINMUX_GET_FUN(pin);
58+
mode = BFLB_PINMUX_GET_MODE(pin);
59+
drive = BFLB_PINMUX_GET_DRIVER_STRENGTH(pin);
60+
61+
/* Disable output anyway */
62+
regval = sys_read32(GLB_BASE + GLB_GPIO_CFGCTL34_OFFSET + ((real_pin >> 5) << 2));
63+
regval &= ~(1 << (pin & 0x1f));
64+
sys_write32(regval, GLB_BASE + GLB_GPIO_CFGCTL34_OFFSET + ((real_pin >> 5) << 2));
65+
66+
is_odd = real_pin & 1;
67+
68+
cfg_address = GLB_BASE + GLB_GPIO_CFGCTL0_OFFSET + (real_pin / 2 * 4);
69+
cfg = sys_read32(cfg_address);
70+
cfg &= ~(0xffff << (16 * is_odd));
71+
72+
regval = sys_read32(GLB_BASE + GLB_GPIO_CFGCTL34_OFFSET + ((real_pin >> 5) << 2));
73+
74+
if (mode == BFLB_PINMUX_MODE_analog) {
75+
regval &= ~(1 << (real_pin & 0x1f));
76+
function = 10;
77+
} else if (mode == BFLB_PINMUX_MODE_periph) {
78+
cfg |= (1 << (is_odd * 16 + 0));
79+
regval &= ~(1 << (real_pin & 0x1f));
80+
} else {
81+
function = 11;
82+
83+
if (mode == BFLB_PINMUX_MODE_input) {
84+
cfg |= (1 << (is_odd * 16 + 0));
85+
}
86+
87+
if (mode == BFLB_PINMUX_MODE_output) {
88+
regval |= (1 << (real_pin & 0x1f));
89+
}
90+
}
91+
92+
sys_write32(regval, GLB_BASE + GLB_GPIO_CFGCTL34_OFFSET + ((real_pin >> 5) << 2));
93+
94+
uint8_t pull_up = BFLB_PINMUX_GET_PULL_UP(pin);
95+
uint8_t pull_down = BFLB_PINMUX_GET_PULL_DOWN(pin);
96+
97+
if (pull_up) {
98+
cfg |= (1 << (is_odd * 16 + 4));
99+
} else if (pull_down) {
100+
cfg |= (1 << (is_odd * 16 + 5));
101+
} else {
102+
}
103+
104+
if (BFLB_PINMUX_GET_SMT(pin)) {
105+
cfg |= (1 << (is_odd * 16 + 1));
106+
}
107+
108+
cfg |= (drive << (is_odd * 16 + 2));
109+
cfg |= (function << (is_odd * 16 + 8));
110+
sys_write32(cfg, cfg_address);
111+
}
112+
113+
#else
114+
#error "Unsupported Platform"
115+
#endif
14116

15117
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
16118
uintptr_t reg)
17119
{
18-
GLB_GPIO_Cfg_Type pincfg;
19120
uint8_t i;
20121

21122
ARG_UNUSED(reg);
22123

23124
for (i = 0U; i < pin_cnt; i++) {
24-
pincfg.gpioFun = BFLB_PINMUX_GET_FUN(pins[i]);
25-
pincfg.gpioMode = BFLB_PINMUX_GET_MODE(pins[i]);
26-
pincfg.gpioPin = BFLB_PINMUX_GET_PIN(pins[i]);
27-
pincfg.pullType = BFLB_PINMUX_GET_PULL_MODES(pins[i]);
28-
pincfg.smtCtrl = BFLB_PINMUX_GET_SMT(pins[i]);
29-
pincfg.drive = BFLB_PINMUX_GET_DRIVER_STRENGTH(pins[i]);
30-
31-
if (pincfg.gpioFun == BFLB_PINMUX_FUN_INST_uart0) {
32-
GLB_UART_Fun_Sel(pincfg.gpioPin % 8,
33-
(BFLB_PINMUX_GET_INST(pins[i]))
34-
* 0x4U /* rts, cts, rx, tx */
35-
+ BFLB_PINMUX_GET_SIGNAL(pins[i])
36-
);
125+
126+
if (BFLB_PINMUX_GET_FUN(pins[i]) & 0xFF == BFLB_PINMUX_FUN_INST_uart0) {
127+
pinctrl_configure_uart(BFLB_PINMUX_GET_PIN(pins[i]),
128+
BFLB_PINMUX_GET_SIGNAL(pins[i]) + 4 * BFLB_PINMUX_GET_INST(pins[i]));
37129
}
38130

39-
GLB_GPIO_Init(&pincfg);
131+
/* gpio init*/
132+
pinctrl_init_pin(pins[i]);
40133
}
41134

42135
return 0;
43136
}
44-
45-
/* clang-format on */

include/zephyr/drivers/pinctrl/pinctrl_soc_bflb_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <zephyr/devicetree.h>
1616
#include <zephyr/types.h>
17+
#include <zephyr/dt-bindings/pinctrl/bflb-common-pinctrl.h>
1718

1819
/* clang-format off */
1920

0 commit comments

Comments
 (0)