123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * Copyright (c) 2006-2025 RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- #include <rtthread.h>
- #include <ioremap.h>
- #include "board.h"
- #include "drv_pinctrl.h"
- #include <rtdbg.h>
- #define DBG_TAG "PINCTRL"
- #ifdef RT_DEBUG
- #define DBG_LVL DBG_LOG
- #else
- #define DBG_LVL DBG_WARNING
- #endif
- #define DBG_COLOR
- #define MAX_NUM_PIN 64
- #define IO_CFG_SEL_MASK 0x7
- #define IO_CFG_SEL_OFFSET 11
- #define IO_CFG_IE_MASK 0x1
- #define IO_CFG_IE_OFFSET 8
- #define IO_CFG_OE_MASK 0x1
- #define IO_CFG_OE_OFFSET 7
- #define IO_CFG_PU_MASK 0x1
- #define IO_CFG_PU_OFFSET 6
- #define IO_CFG_PD_MASK 0x1
- #define IO_CFG_PD_OFFSET 5
- #define IO_CFG_DRV_MASK 0xF
- #define IO_CFG_DRV_OFFSET 1
- #define IO_CFG_ST_MASK 0x1
- #define IO_CFG_ST_OFFSET 0
- volatile static rt_ubase_t pinctrl_base;
- static int check_pin(rt_uint32_t pin)
- {
- if (pin < 0 || pin > MAX_NUM_PIN)
- {
- LOG_E("pin %d is not valid\n", pin);
- return -RT_EINVAL;
- }
- return 0;
- }
- rt_inline rt_uint32_t _read32(rt_uint32_t pin)
- {
- return HWREG32(pinctrl_base + (pin * 4));
- }
- rt_inline void _write32(rt_uint32_t pin, rt_uint32_t value)
- {
- HWREG32(pinctrl_base + (pin * 4)) = value;
- }
- void k230_pinctrl_set_function(rt_uint32_t pin, rt_uint32_t func)
- {
- if (check_pin(pin) != 0)
- return;
- if (func > IOMUX_FUNC5)
- return;
- rt_uint32_t val = _read32(pin);
- val &= ~(IO_CFG_SEL_MASK << IO_CFG_SEL_OFFSET); /* Clear bits 11-13 */
- /* Set bits 11-13 to the function value */
- val |= (func << IO_CFG_SEL_OFFSET);
- _write32(pin, val);
- }
- void k230_pinctrl_set_ie(rt_uint32_t pin, rt_uint32_t ie)
- {
- if (check_pin(pin) != 0)
- return;
- rt_uint32_t val = _read32(pin);
- if (ie)
- val |= IO_CFG_IE_MASK << IO_CFG_IE_OFFSET;
- else
- val &= ~(IO_CFG_IE_MASK << IO_CFG_IE_OFFSET);
- _write32(pin, val);
- }
- void k230_pinctrl_set_oe(rt_uint32_t pin, rt_uint32_t oe)
- {
- if (check_pin(pin) != 0)
- return;
- rt_uint32_t val = _read32(pin);
- if (oe)
- val |= IO_CFG_OE_MASK << IO_CFG_OE_OFFSET;
- else
- val &= ~(IO_CFG_OE_MASK << IO_CFG_OE_OFFSET);
- _write32(pin, val);
- }
- void k230_pinctrl_set_pu(rt_uint32_t pin, rt_uint32_t pu)
- {
- if (check_pin(pin) != 0)
- return;
- rt_uint32_t val = _read32(pin);
- if (pu)
- val |= IO_CFG_PU_MASK << IO_CFG_PU_OFFSET;
- else
- val &= ~(IO_CFG_PU_MASK << IO_CFG_PU_OFFSET);
- _write32(pin, val);
- }
- void k230_pinctrl_set_pd(rt_uint32_t pin, rt_uint32_t pd)
- {
- if (check_pin(pin) != 0)
- return;
- rt_uint32_t val = _read32(pin);
- if (pd)
- val |= IO_CFG_PD_MASK << IO_CFG_PD_OFFSET;
- else
- val &= ~(IO_CFG_PD_MASK << IO_CFG_PD_OFFSET);
- _write32(pin, val);
- }
- void k230_pinctrl_set_drv(rt_uint32_t pin, rt_uint32_t drv)
- {
- if (check_pin(pin) != 0)
- return;
- /* FIXME: Unsupported yet */
- }
- void k230_pinctrl_set_st(rt_uint32_t pin, rt_uint32_t st)
- {
- if (check_pin(pin) != 0)
- return;
- rt_uint32_t val = _read32(pin);
- if (st)
- val |= IO_CFG_ST_MASK << IO_CFG_ST_OFFSET;
- else
- val &= ~(IO_CFG_ST_MASK << IO_CFG_ST_OFFSET);
- _write32(pin, val);
- }
- rt_uint32_t k230_pinctrl_get_regval(rt_uint32_t pin)
- {
- if (check_pin(pin) != 0)
- return 0;
- return _read32(pin);
- }
- int k230_pinctrl_init(void)
- {
- rt_err_t ret;
- pinctrl_base = (rt_ubase_t)rt_ioremap((void *)IOMUX_BASE_ADDR, IOMUX_IO_SIZE);
- return RT_EOK;
- }
- INIT_BOARD_EXPORT(k230_pinctrl_init);
|