gpio.c 3.4 KB
Newer Older
W
weety 已提交
1
/*
2
 * Copyright (c) 2006-2021, RT-Thread Development Team
W
weety 已提交
3
 *
4
 * SPDX-License-Identifier: Apache-2.0
W
weety 已提交
5 6
 *
 * Change Logs:
7 8
 * Date           Author        Notes
 * 2011-01-13     weety     first version
W
weety 已提交
9 10
 */

W
weety 已提交
11 12 13
#include <rtthread.h>
#include "gpio.h"

14 15 16 17
#define GPIO0_BASE          (DAVINCI_GPIO_BASE + 0x10)
#define GPIO1_BASE          (DAVINCI_GPIO_BASE + 0x38)
#define GPIO2_BASE          (DAVINCI_GPIO_BASE + 0x60)
#define GPIO3_BASE          (DAVINCI_GPIO_BASE + 0x88)
W
weety 已提交
18 19 20 21


static unsigned int dm365_gpio_base = (unsigned int)GPIO0_BASE;

22 23 24 25 26
#define GPIO_OE         (dm365_gpio_base + 0x00)
#define GPIO_DATAIN     (dm365_gpio_base + 0x10)
#define GPIO_DATAOUT        (dm365_gpio_base + 0x04)
#define GPIO_CLROUT     (dm365_gpio_base + 0x0C)
#define GPIO_SETOUT     (dm365_gpio_base + 0x08)
W
weety 已提交
27

28 29 30 31 32
#define gpio_dirin(n)       *(volatile unsigned int *)((GPIO_OE)) |= 1<<(n)
#define gpio_dirout(n)  *(volatile unsigned int *)((GPIO_OE)) &= ~(1u<<(n))
#define gpio_set(n)     *(volatile unsigned int *)((GPIO_SETOUT)) = 1<<(n)
#define gpio_clr(n)     *(volatile unsigned int *)((GPIO_CLROUT)) = 1<<(n)
#define gpio_get(n)     ( ( *(volatile unsigned int *)((GPIO_DATAIN)) & (1<<(n)) ) ? 1 : 0 )
W
weety 已提交
33 34

 #define GPIO_GRP_MASK (5)
35

W
weety 已提交
36 37
static int gpio_to_base(unsigned int gpio)
{
38 39 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
    unsigned int grp_idx;
    int ret;

    grp_idx = gpio >> GPIO_GRP_MASK;

    switch (grp_idx) {
        case 0:
            dm365_gpio_base = (unsigned int)GPIO0_BASE;
            ret = 0;
            break;
        case 1:
            dm365_gpio_base = (unsigned int)GPIO1_BASE;
            ret = 0;
            break;
        case 2:
            dm365_gpio_base = (unsigned int)GPIO2_BASE;
            ret = 0;
            break;
        case 3:
            dm365_gpio_base = (unsigned int)GPIO3_BASE;
            ret = 0;
            break;
        default:
            ret =-RT_EIO;
            break;
    }
    return ret;
W
weety 已提交
65 66 67 68 69
}


int gpio_direction_input(unsigned int gpio)
{
70 71
    unsigned int offset;
    int ret=0;
W
weety 已提交
72

73 74 75 76 77 78
    rt_ubase_t temp = rt_hw_interrupt_disable();
    ret = gpio_to_base(gpio);
    if (ret < 0) {
        goto gpio_free;
    }
    offset =  gpio & ((1 << GPIO_GRP_MASK) -1);
W
weety 已提交
79

80
    gpio_dirin(offset);
W
weety 已提交
81 82

gpio_free:
83
    rt_hw_interrupt_enable(temp);
W
weety 已提交
84

85
    return ret;
W
weety 已提交
86 87 88 89
}

int gpio_direction_output(unsigned int gpio, int value)
{
90 91
    unsigned int offset;
    int ret=0;
W
weety 已提交
92

93 94 95 96 97
    rt_ubase_t temp = rt_hw_interrupt_disable();
    ret = gpio_to_base(gpio);
    if (ret < 0) {
        goto gpio_free;
    }
W
weety 已提交
98

99
    offset =  gpio & ((1 << GPIO_GRP_MASK) -1);
W
weety 已提交
100

101 102 103 104 105 106
    if (value) {
        gpio_set(offset);
    }
    else {
        gpio_clr(offset);
    }
W
weety 已提交
107

108
    gpio_dirout(offset);
W
weety 已提交
109 110

gpio_free:
111
    rt_hw_interrupt_enable(temp);
W
weety 已提交
112

113
    return ret;
W
weety 已提交
114 115 116 117
}

int  gpio_set_value(unsigned int gpio, int value)
{
118 119
    unsigned int offset;
    int ret=0;
W
weety 已提交
120

121 122 123 124 125
    rt_ubase_t temp = rt_hw_interrupt_disable();
    ret = gpio_to_base(gpio);
    if (ret < 0) {
        goto gpio_free;
    }
W
weety 已提交
126

127
    offset =  gpio & ((1 << GPIO_GRP_MASK) -1);
W
weety 已提交
128

129 130 131 132 133 134
    if (value) {
        gpio_set(offset);
    }
    else {
        gpio_clr(offset);
    }
W
weety 已提交
135 136

gpio_free:
137
    rt_hw_interrupt_enable(temp);
W
weety 已提交
138

139
    return ret;
W
weety 已提交
140 141 142 143
}

int gpio_get_value(unsigned int gpio)
{
144 145
    unsigned int offset;
    int ret=0;
W
weety 已提交
146

147 148 149 150 151
    rt_ubase_t temp = rt_hw_interrupt_disable();
    ret = gpio_to_base(gpio);
    if (ret < 0) {
        goto gpio_free;
    }
W
weety 已提交
152

153 154
    offset =  gpio & ((1 << GPIO_GRP_MASK) -1);
    ret = gpio_get(offset);
W
weety 已提交
155 156

gpio_free:
157
    rt_hw_interrupt_enable(temp);
W
weety 已提交
158

159
    return ret;
W
weety 已提交
160 161 162
}