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 );
0 commit comments