rt-thread-official/bsp/v2m-mps2/drivers/drv_pin.c

90 lines
1.8 KiB
C

/*
* File : drv_pin.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006-2013, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2018-03-25 Tanek the first version.
*/
#include <rtthread.h>
#include <rthw.h>
#include <drivers/pin.h>
#include <SMM_MPS2.h>
#ifdef RT_USING_PIN
// pin 0 ~ 7 : switch 0 ~ 7
// pin 8 ~ 15 : user led 0 ~ 7
static void v2m_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
{
return ;
}
static int v2m_pin_read(rt_device_t dev, rt_base_t pin)
{
RT_ASSERT(dev != RT_NULL);
if (0 <= pin && pin <= 7)
{
return !!(MPS2_SCC->CFG_REG3 & (0x01 << pin)); // switchs
}
else if (8 <= pin && pin <= 15)
{
return !!(MPS2_SCC->CFG_REG1 & (0x01 << (pin - 8))); // leds
}
else
{
RT_ASSERT(RT_NULL);
return 0;
}
}
static void v2m_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
{
RT_ASSERT(dev != RT_NULL);
if (8 <= pin && pin <= 15)
{
rt_uint32_t reg = MPS2_SCC->CFG_REG1;
if (value)
reg |= 1 << (pin - 8);
else
reg &= ~(1 << (pin - 8));
MPS2_SCC->CFG_REG1 = reg;
}
else
{
RT_ASSERT(RT_NULL);
}
}
int rt_hw_pin_init(void)
{
int ret = RT_EOK;
static const struct rt_pin_ops v2m_pin_ops =
{
v2m_pin_mode,
v2m_pin_write,
v2m_pin_read,
RT_NULL,
RT_NULL,
RT_NULL
};
ret = rt_device_pin_register("pin", &v2m_pin_ops, RT_NULL);
return ret;
}
INIT_BOARD_EXPORT(rt_hw_pin_init);
#endif /*RT_USING_PIN */