drv_gpio.c 2.7 KB
Newer Older
勤为本 已提交
1
/*
2
 * Copyright (c) 2006-2018, RT-Thread Development Team
勤为本 已提交
3
 *
4
 * SPDX-License-Identifier: Apache-2.0
勤为本 已提交
5 6 7
 *
 * Change Logs:
 * Date           Author       Notes
8 9
 * 2017-11-24     勤为本          first version
 * 2018-05-11     zhuangwei    add gpio interrupt ops
勤为本 已提交
10 11 12 13
 */

#include <rtthread.h>
#include <drivers/pin.h>
14 15 16
#include "ls1c_gpio.h"
#include "ls1c.h"
#include <rthw.h>
勤为本 已提交
17

18
#ifdef RT_USING_PIN
勤为本 已提交
19 20 21 22

void ls1c_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode)
{
    unsigned int gpio = pin;
23

勤为本 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
    if (PIN_MODE_OUTPUT == mode)
    {
        gpio_init(gpio, gpio_mode_output);
    }
    else
    {
        gpio_init(gpio, gpio_mode_input);
    }

    return ;
}


void ls1c_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value)
{
    unsigned int gpio = pin;
40

勤为本 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    if (PIN_LOW == value)
    {
        gpio_set(gpio, gpio_level_low);
    }
    else
    {
        gpio_set(gpio, gpio_level_high);
    }

    return ;
}


int ls1c_pin_read(struct rt_device *device, rt_base_t pin)
{
    unsigned int gpio = pin;
    int value = PIN_LOW;

    if (0 == gpio_get(gpio))
    {
        value = PIN_LOW;
    }
    else
    {
        value = PIN_HIGH;
    }

    return value;
}

71 72 73 74 75
rt_err_t ls1c_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
                             rt_uint32_t mode, void (*hdr)(void *args), void *args)
{
    unsigned int gpio = pin;
    char irq_name[10];
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
    rt_uint32_t type;
    switch (mode)
    {
      case PIN_IRQ_MODE_RISING:
      type=IRQ_TYPE_EDGE_RISING;
      break;
      case PIN_IRQ_MODE_FALLING:
      type=IRQ_TYPE_EDGE_FALLING;
      break;
      case PIN_IRQ_MODE_HIGH_LEVEL:
      type=IRQ_TYPE_LEVEL_HIGH;
      break;
      case PIN_IRQ_MODE_LOW_LEVEL:
      type=IRQ_TYPE_LEVEL_LOW;
      break;
    }
    gpio_set_irq_type(gpio, type);
	
94 95
    rt_sprintf(irq_name, "PIN_%d", gpio);
    rt_hw_interrupt_install(LS1C_GPIO_TO_IRQ(gpio), (rt_isr_handler_t)hdr, args, irq_name);
勤为本 已提交
96

97 98 99
    return RT_EOK;
}

100
rt_err_t ls1c_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
{
    return RT_EOK;
}

rt_err_t ls1c_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled)
{
    unsigned int gpio = pin;

    if (enabled)
        rt_hw_interrupt_umask(LS1C_GPIO_TO_IRQ(gpio));
    else
        rt_hw_interrupt_mask(LS1C_GPIO_TO_IRQ(gpio));
    return RT_EOK;
}


const static struct rt_pin_ops _ls1c_pin_ops =
勤为本 已提交
118 119 120 121
{
    ls1c_pin_mode,
    ls1c_pin_write,
    ls1c_pin_read,
122 123

    ls1c_pin_attach_irq,
124
    ls1c_pin_detach_irq,
125 126
    ls1c_pin_irq_enable,
    RT_NULL,
勤为本 已提交
127 128 129 130 131
};


int hw_pin_init(void)
{
132 133 134 135 136
    int ret = RT_EOK;

    ret = rt_device_pin_register("pin", &_ls1c_pin_ops, RT_NULL);

    return ret;
勤为本 已提交
137 138 139
}
INIT_BOARD_EXPORT(hw_pin_init);

140 141
#endif /*RT_USING_PIN */

勤为本 已提交
142