Skip to content

Commit a84dc04

Browse files
unicornxRbb666
authored andcommitted
bsp: k230: support pinctrl driver
Signed-off-by: Chen Wang <[email protected]>
1 parent 39dca86 commit a84dc04

File tree

3 files changed

+198
-0
lines changed

3 files changed

+198
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# RT-Thread building script for component
2+
3+
from building import *
4+
5+
cwd = GetCurrentDir()
6+
src = Glob('*.c')
7+
CPPPATH = [cwd]
8+
9+
group = DefineGroup('PINCTRL', src, depend = [], CPPPATH = CPPPATH)
10+
11+
Return('group')
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*
2+
* Copyright (c) 2006-2025 RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
#include <rtthread.h>
7+
#include <ioremap.h>
8+
#include "board.h"
9+
#include "drv_pinctrl.h"
10+
#include <rtdbg.h>
11+
12+
#define DBG_TAG "PINCTRL"
13+
#ifdef RT_DEBUG
14+
#define DBG_LVL DBG_LOG
15+
#else
16+
#define DBG_LVL DBG_WARNING
17+
#endif
18+
#define DBG_COLOR
19+
20+
#define MAX_NUM_PIN 64
21+
22+
#define IO_CFG_SEL_MASK 0x7
23+
#define IO_CFG_SEL_OFFSET 11
24+
#define IO_CFG_IE_MASK 0x1
25+
#define IO_CFG_IE_OFFSET 8
26+
#define IO_CFG_OE_MASK 0x1
27+
#define IO_CFG_OE_OFFSET 7
28+
#define IO_CFG_PU_MASK 0x1
29+
#define IO_CFG_PU_OFFSET 6
30+
#define IO_CFG_PD_MASK 0x1
31+
#define IO_CFG_PD_OFFSET 5
32+
#define IO_CFG_DRV_MASK 0xF
33+
#define IO_CFG_DRV_OFFSET 1
34+
#define IO_CFG_ST_MASK 0x1
35+
#define IO_CFG_ST_OFFSET 0
36+
37+
volatile static rt_ubase_t pinctrl_base;
38+
39+
static int check_pin(rt_uint32_t pin)
40+
{
41+
if (pin < 0 || pin > MAX_NUM_PIN)
42+
{
43+
LOG_E("pin %d is not valid\n", pin);
44+
return -RT_EINVAL;
45+
}
46+
return 0;
47+
}
48+
49+
rt_inline rt_uint32_t _read32(rt_uint32_t pin)
50+
{
51+
return HWREG32(pinctrl_base + (pin * 4));
52+
}
53+
54+
rt_inline void _write32(rt_uint32_t pin, rt_uint32_t value)
55+
{
56+
HWREG32(pinctrl_base + (pin * 4)) = value;
57+
}
58+
59+
void k230_pinctrl_set_function(rt_uint32_t pin, rt_uint32_t func)
60+
{
61+
if (check_pin(pin) != 0)
62+
return;
63+
if (func > IOMUX_FUNC5)
64+
return;
65+
66+
rt_uint32_t val = _read32(pin);
67+
val &= ~(IO_CFG_SEL_MASK << IO_CFG_SEL_OFFSET); /* Clear bits 11-13 */
68+
/* Set bits 11-13 to the function value */
69+
val |= (func << IO_CFG_SEL_OFFSET);
70+
_write32(pin, val);
71+
}
72+
73+
void k230_pinctrl_set_ie(rt_uint32_t pin, rt_uint32_t ie)
74+
{
75+
if (check_pin(pin) != 0)
76+
return;
77+
78+
rt_uint32_t val = _read32(pin);
79+
if (ie)
80+
val |= IO_CFG_IE_MASK << IO_CFG_IE_OFFSET;
81+
else
82+
val &= ~(IO_CFG_IE_MASK << IO_CFG_IE_OFFSET);
83+
_write32(pin, val);
84+
}
85+
86+
void k230_pinctrl_set_oe(rt_uint32_t pin, rt_uint32_t oe)
87+
{
88+
if (check_pin(pin) != 0)
89+
return;
90+
91+
rt_uint32_t val = _read32(pin);
92+
if (oe)
93+
val |= IO_CFG_OE_MASK << IO_CFG_OE_OFFSET;
94+
else
95+
val &= ~(IO_CFG_OE_MASK << IO_CFG_OE_OFFSET);
96+
_write32(pin, val);
97+
}
98+
99+
void k230_pinctrl_set_pu(rt_uint32_t pin, rt_uint32_t pu)
100+
{
101+
if (check_pin(pin) != 0)
102+
return;
103+
104+
rt_uint32_t val = _read32(pin);
105+
if (pu)
106+
val |= IO_CFG_PU_MASK << IO_CFG_PU_OFFSET;
107+
else
108+
val &= ~(IO_CFG_PU_MASK << IO_CFG_PU_OFFSET);
109+
_write32(pin, val);
110+
}
111+
112+
void k230_pinctrl_set_pd(rt_uint32_t pin, rt_uint32_t pd)
113+
{
114+
if (check_pin(pin) != 0)
115+
return;
116+
117+
rt_uint32_t val = _read32(pin);
118+
if (pd)
119+
val |= IO_CFG_PD_MASK << IO_CFG_PD_OFFSET;
120+
else
121+
val &= ~(IO_CFG_PD_MASK << IO_CFG_PD_OFFSET);
122+
_write32(pin, val);
123+
}
124+
125+
void k230_pinctrl_set_drv(rt_uint32_t pin, rt_uint32_t drv)
126+
{
127+
if (check_pin(pin) != 0)
128+
return;
129+
/* FIXME: Unsupported yet */
130+
}
131+
132+
void k230_pinctrl_set_st(rt_uint32_t pin, rt_uint32_t st)
133+
{
134+
if (check_pin(pin) != 0)
135+
return;
136+
137+
rt_uint32_t val = _read32(pin);
138+
if (st)
139+
val |= IO_CFG_ST_MASK << IO_CFG_ST_OFFSET;
140+
else
141+
val &= ~(IO_CFG_ST_MASK << IO_CFG_ST_OFFSET);
142+
_write32(pin, val);
143+
}
144+
145+
rt_uint32_t k230_pinctrl_get_regval(rt_uint32_t pin)
146+
{
147+
if (check_pin(pin) != 0)
148+
return 0;
149+
150+
return _read32(pin);
151+
}
152+
153+
int k230_pinctrl_init(void)
154+
{
155+
rt_err_t ret;
156+
157+
pinctrl_base = (rt_ubase_t)rt_ioremap((void *)IOMUX_BASE_ADDR, IOMUX_IO_SIZE);
158+
159+
return RT_EOK;
160+
}
161+
INIT_BOARD_EXPORT(k230_pinctrl_init);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright (c) 2006-2025 RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef _DRV_PINCTRL_H_
8+
#define _DRV_PINCTRL_H_
9+
10+
#include <rtthread.h>
11+
12+
#define IOMUX_FUNC1 (rt_uint32_t)0
13+
#define IOMUX_FUNC2 (rt_uint32_t)1
14+
#define IOMUX_FUNC3 (rt_uint32_t)2
15+
#define IOMUX_FUNC4 (rt_uint32_t)3
16+
#define IOMUX_FUNC5 (rt_uint32_t)4
17+
void k230_pinctrl_set_function(rt_uint32_t pin, rt_uint32_t func);
18+
void k230_pinctrl_set_ie(rt_uint32_t pin, rt_uint32_t ie);
19+
void k230_pinctrl_set_oe(rt_uint32_t pin, rt_uint32_t oe);
20+
void k230_pinctrl_set_pu(rt_uint32_t pin, rt_uint32_t pu);
21+
void k230_pinctrl_set_pd(rt_uint32_t pin, rt_uint32_t pd);
22+
void k230_pinctrl_set_drv(rt_uint32_t pin, rt_uint32_t drv);
23+
void k230_pinctrl_set_st(rt_uint32_t pin, rt_uint32_t st);
24+
rt_uint32_t k230_pinctrl_get_regval(rt_uint32_t pin);
25+
26+
#endif /* _DRV_PINCTRL_H_ */

0 commit comments

Comments
 (0)