OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [sw/] [lib/] [source/] [neorv32_gpio.c] - Blame information for rev 64

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zero_gravi
// #################################################################################################
2
// # << NEORV32: neorv32_gpio.c - General Purpose Input/Output Port HW Driver (Source) >>          #
3
// # ********************************************************************************************* #
4
// # BSD 3-Clause License                                                                          #
5
// #                                                                                               #
6 44 zero_gravi
// # Copyright (c) 2021, Stephan Nolting. All rights reserved.                                     #
7 2 zero_gravi
// #                                                                                               #
8
// # Redistribution and use in source and binary forms, with or without modification, are          #
9
// # permitted provided that the following conditions are met:                                     #
10
// #                                                                                               #
11
// # 1. Redistributions of source code must retain the above copyright notice, this list of        #
12
// #    conditions and the following disclaimer.                                                   #
13
// #                                                                                               #
14
// # 2. Redistributions in binary form must reproduce the above copyright notice, this list of     #
15
// #    conditions and the following disclaimer in the documentation and/or other materials        #
16
// #    provided with the distribution.                                                            #
17
// #                                                                                               #
18
// # 3. Neither the name of the copyright holder nor the names of its contributors may be used to  #
19
// #    endorse or promote products derived from this software without specific prior written      #
20
// #    permission.                                                                                #
21
// #                                                                                               #
22
// # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS   #
23
// # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF               #
24
// # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE    #
25
// # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,     #
26
// # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE #
27
// # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED    #
28
// # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     #
29
// # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED  #
30
// # OF THE POSSIBILITY OF SUCH DAMAGE.                                                            #
31
// # ********************************************************************************************* #
32
// # The NEORV32 Processor - https://github.com/stnolting/neorv32              (c) Stephan Nolting #
33
// #################################################################################################
34
 
35
 
36
/**********************************************************************//**
37
 * @file neorv32_gpio.c
38
 * @author Stephan Nolting
39
 * @brief General purpose input/output port unit (GPIO) HW driver source file.
40
 *
41 44 zero_gravi
 * @note These functions should only be used if the GPIO unit was synthesized (IO_GPIO_EN = true).
42 2 zero_gravi
 **************************************************************************/
43
 
44
#include "neorv32.h"
45
#include "neorv32_gpio.h"
46
 
47
 
48
/**********************************************************************//**
49
 * Check if GPIO unit was synthesized.
50
 *
51
 * @return 0 if GPIO was not synthesized, 1 if GPIO is available.
52
 **************************************************************************/
53
int neorv32_gpio_available(void) {
54
 
55 64 zero_gravi
  if (NEORV32_SYSINFO.SOC & (1 << SYSINFO_SOC_IO_GPIO)) {
56 2 zero_gravi
    return 1;
57
  }
58
  else {
59
    return 0;
60
  }
61
}
62
 
63
 
64
/**********************************************************************//**
65
 * Set single pin of GPIO's output port.
66
 *
67 61 zero_gravi
 * @param[in] pin Output pin number to be set (0..63).
68 2 zero_gravi
 **************************************************************************/
69 61 zero_gravi
void neorv32_gpio_pin_set(int pin) {
70 2 zero_gravi
 
71 61 zero_gravi
  uint32_t mask = (uint32_t)(1 << (pin & 0x1f));
72
 
73
  if (pin < 32) {
74 64 zero_gravi
    NEORV32_GPIO.OUTPUT_LO |= mask;
75 61 zero_gravi
  }
76
  else {
77 64 zero_gravi
    NEORV32_GPIO.OUTPUT_HI |= mask;
78 61 zero_gravi
  }
79 2 zero_gravi
}
80
 
81
 
82
/**********************************************************************//**
83
 * Clear single pin of GPIO's output port.
84
 *
85 61 zero_gravi
 * @param[in] pin Output pin number to be cleared (0..63).
86 2 zero_gravi
 **************************************************************************/
87 61 zero_gravi
void neorv32_gpio_pin_clr(int pin) {
88 2 zero_gravi
 
89 61 zero_gravi
  uint32_t mask = (uint32_t)(1 << (pin & 0x1f));
90
 
91
  if (pin < 32) {
92 64 zero_gravi
    NEORV32_GPIO.OUTPUT_LO &= ~mask;
93 61 zero_gravi
  }
94
  else {
95 64 zero_gravi
    NEORV32_GPIO.OUTPUT_HI &= ~mask;
96 61 zero_gravi
  }
97 2 zero_gravi
}
98
 
99
 
100
/**********************************************************************//**
101
 * Toggle single pin of GPIO's output port.
102
 *
103 61 zero_gravi
 * @param[in] pin Output pin number to be toggled (0..63).
104 2 zero_gravi
 **************************************************************************/
105 61 zero_gravi
void neorv32_gpio_pin_toggle(int pin) {
106 2 zero_gravi
 
107 61 zero_gravi
  uint32_t mask = (uint32_t)(1 << (pin & 0x1f));
108
 
109
  if (pin < 32) {
110 64 zero_gravi
    NEORV32_GPIO.OUTPUT_LO ^= mask;
111 61 zero_gravi
  }
112
  else {
113 64 zero_gravi
    NEORV32_GPIO.OUTPUT_HI ^= mask;
114 61 zero_gravi
  }
115 2 zero_gravi
}
116
 
117
 
118
/**********************************************************************//**
119
 * Get single pin of GPIO's input port.
120
 *
121 61 zero_gravi
 * @param[in] pin Input pin to be read (0..63).
122
 * @return =0 if pin is low, !=0 if pin is high.
123 2 zero_gravi
 **************************************************************************/
124 61 zero_gravi
uint32_t neorv32_gpio_pin_get(int pin) {
125 2 zero_gravi
 
126 61 zero_gravi
  uint32_t mask = (uint32_t)(1 << (pin & 0x1f));
127
 
128
  if (pin < 32) {
129 64 zero_gravi
    return NEORV32_GPIO.INPUT_LO & mask;
130 61 zero_gravi
  }
131
  else {
132 64 zero_gravi
    return NEORV32_GPIO.INPUT_HI & mask;
133 61 zero_gravi
  }
134 2 zero_gravi
}
135
 
136
 
137
/**********************************************************************//**
138
 * Set complete GPIO output port.
139
 *
140 61 zero_gravi
 * @param[in] port_data New output port value (64-bit).
141 2 zero_gravi
 **************************************************************************/
142 61 zero_gravi
void neorv32_gpio_port_set(uint64_t port_data) {
143 2 zero_gravi
 
144 64 zero_gravi
  union {
145
    uint64_t uint64;
146
    uint32_t uint32[sizeof(uint64_t)/2];
147
  } data;
148
 
149
  data.uint64 = port_data;
150
  NEORV32_GPIO.OUTPUT_LO = data.uint32[0];
151
  NEORV32_GPIO.OUTPUT_HI = data.uint32[1];
152 2 zero_gravi
}
153
 
154
 
155
/**********************************************************************//**
156
 * Get complete GPIO input port.
157
 *
158 61 zero_gravi
 * @return Current input port state (64-bit).
159 2 zero_gravi
 **************************************************************************/
160 61 zero_gravi
uint64_t neorv32_gpio_port_get(void) {
161 2 zero_gravi
 
162 64 zero_gravi
  union {
163
    uint64_t uint64;
164
    uint32_t uint32[sizeof(uint64_t)/2];
165
  } data;
166
 
167
  data.uint32[0] = NEORV32_GPIO.OUTPUT_LO;
168
  data.uint32[1] = NEORV32_GPIO.OUTPUT_HI;
169
 
170
  return data.uint64;
171 2 zero_gravi
}
172 23 zero_gravi
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.