]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/adafruit_blinka/microcontroller/nxp_lpc4330/pin.py
Merge pull request #1003 from makermelissa/libgpiod-fix
[Adafruit_Blinka-hackapet.git] / src / adafruit_blinka / microcontroller / nxp_lpc4330 / pin.py
1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
2 #
3 # SPDX-License-Identifier: MIT
4 """NXP LPC4330 pin names"""
5 try:
6     from greatfet import GreatFET
7     from greatfet.interfaces.adc import ADC
8
9     gf = GreatFET()
10 except ModuleNotFoundError:
11     raise RuntimeError(
12         "Unable to create GreatFET object. Make sure library is "
13         "installed and the device is connected."
14     ) from ModuleNotFoundError
15
16
17 class Pin:
18     """A basic Pin class for the NXP LPC4330 that
19     acts as a wrapper for the GreatFET api.
20     """
21
22     # pin modes
23     OUT = gf.gpio.DIRECTION_OUT
24     IN = gf.gpio.DIRECTION_IN
25     ADC = 2
26     DAC = 3
27
28     # pin values
29     LOW = 0
30     HIGH = 1
31
32     def __init__(self, pin_id=None):
33         self.id = pin_id
34         self._mode = None
35         self._pin = None
36
37     def init(self, mode=IN, pull=None):
38         """Initialize the Pin"""
39         if self.id is None:
40             raise RuntimeError("Can not init a None type pin.")
41         if pull is not None:
42             raise NotImplementedError("Internal pullups and pulldowns not supported")
43         if mode in (Pin.IN, Pin.OUT):
44             if self.id not in gf.GPIO_MAPPINGS:
45                 raise ValueError("Pin does not have GPIO capabilities")
46             self._pin = gf.gpio.get_pin(self.id)
47             self._pin.set_direction(mode)
48         elif mode == Pin.ADC:
49             # ADC only available on these pins
50             if self.id not in gf.ADC_MAPPINGS:
51                 raise ValueError("Pin does not have ADC capabilities")
52             self._pin = ADC(gf, self.id)
53         elif mode == Pin.DAC:
54             # DAC only available on these pins
55             if self.id != "J2_P5":
56                 raise ValueError("Pin does not have DAC capabilities")
57             self._pin = gf.apis.dac
58             self._pin.initialize()
59         else:
60             raise ValueError("Incorrect pin mode: {}".format(mode))
61         self._mode = mode
62
63     def value(self, val=None):
64         """Set or return the Pin Value"""
65         # Digital In / Out
66         if self._mode in (Pin.IN, Pin.OUT):
67             # digital read
68             if val is None:
69                 return self._pin.get_state()
70             # digital write
71             if val in (Pin.LOW, Pin.HIGH):
72                 self._pin.set_state(val)
73                 return None
74             # nope
75             raise ValueError("Invalid value for pin.")
76         # Analog In
77         if self._mode == Pin.ADC:
78             if val is None:
79                 # Read ADC here
80                 return self._pin.read_samples()[0]
81             # read only
82             raise AttributeError("'AnalogIn' object has no attribute 'value'")
83         # Analog Out
84         if self._mode == Pin.DAC:
85             if val is None:
86                 # write only
87                 raise AttributeError("unreadable attribute")
88             # Set DAC Here
89             self._pin.set_value(int(val))
90             return None
91         raise RuntimeError(
92             "No action for mode {} with value {}".format(self._mode, val)
93         )
94
95
96 # create pin instances for each pin
97 # J1 Header Pins
98 J1_P3 = Pin("J1_P3")
99 J1_P4 = Pin("J1_P4")
100 J1_P5 = Pin("J1_P5")
101 J1_P6 = Pin("J1_P6")
102 J1_P7 = Pin("J1_P7")
103 J1_P8 = Pin("J1_P8")
104 J1_P9 = Pin("J1_P9")
105 J1_P10 = Pin("J1_P10")
106 J1_P12 = Pin("J1_P12")
107 J1_P13 = Pin("J1_P13")
108 J1_P14 = Pin("J1_P14")
109 J1_P15 = Pin("J1_P15")
110 J1_P16 = Pin("J1_P16")
111 J1_P17 = Pin("J1_P17")
112 J1_P18 = Pin("J1_P18")
113 J1_P19 = Pin("J1_P19")
114 J1_P20 = Pin("J1_P20")
115 J1_P21 = Pin("J1_P21")
116 J1_P22 = Pin("J1_P22")
117 J1_P23 = Pin("J1_P23")
118 J1_P24 = Pin("J1_P24")
119 J1_P25 = Pin("J1_P25")
120 J1_P26 = Pin("J1_P26")
121 J1_P27 = Pin("J1_P27")
122 J1_P28 = Pin("J1_P28")
123 J1_P29 = Pin("J1_P29")
124 J1_P30 = Pin("J1_P30")
125 J1_P31 = Pin("J1_P31")
126 J1_P32 = Pin("J1_P32")
127 J1_P33 = Pin("J1_P33")
128 J1_P34 = Pin("J1_P34")
129 J1_P35 = Pin("J1_P35")
130 J1_P37 = Pin("J1_P37")
131 J1_P39 = Pin("J1_P39")  # MOSI
132 J1_P40 = Pin("J1_P40")  # MISO
133
134
135 # J2 Header Pins
136 J2_P3 = Pin("J2_P3")
137 J2_P4 = Pin("J2_P4")
138 J2_P5 = Pin("J2_P5")  # ADC, ADC, DAC
139 J2_P6 = Pin("J2_P6")
140 J2_P7 = Pin("J2_P7")
141 J2_P8 = Pin("J2_P8")
142 J2_P9 = Pin("J2_P9")  # ADC, GPIO
143 J2_P10 = Pin("J2_P10")
144 J2_P13 = Pin("J2_P13")
145 J2_P14 = Pin("J2_P14")
146 J2_P15 = Pin("J2_P15")
147 J2_P16 = Pin("J2_P16")  # GPIO, ADC
148 J2_P18 = Pin("J2_P18")
149 J2_P19 = Pin("J2_P19")
150 J2_P20 = Pin("J2_P20")
151 J2_P22 = Pin("J2_P22")
152 J2_P23 = Pin("J2_P23")
153 J2_P24 = Pin("J2_P24")
154 J2_P25 = Pin("J2_P25")
155 J2_P27 = Pin("J2_P27")
156 J2_P28 = Pin("J2_P28")
157 J2_P29 = Pin("J2_P29")
158 J2_P30 = Pin("J2_P30")
159 J2_P31 = Pin("J2_P31")
160 J2_P33 = Pin("J2_P33")
161 J2_P34 = Pin("J2_P34")
162 J2_P35 = Pin("J2_P35")
163 J2_P36 = Pin("J2_P36")
164 J2_P37 = Pin("J2_P37")
165 J2_P38 = Pin("J2_P38")
166
167 # Bonus Row Pins
168 J7_P2 = Pin("J7_P2")
169 J7_P3 = Pin("J7_P3")
170 J7_P4 = Pin("J7_P4")  # ADC, ADC
171 J7_P5 = Pin("J7_P5")  # ADC, ADC
172 J7_P6 = Pin("J7_P6")
173 J7_P7 = Pin("J7_P7")
174 J7_P8 = Pin("J7_P8")
175 J7_P13 = Pin("J7_P13")
176 J7_P14 = Pin("J7_P14")
177 J7_P15 = Pin("J7_P15")
178 J7_P16 = Pin("J7_P16")
179 J7_P17 = Pin("J7_P17")
180 J7_P18 = Pin("J7_P18")
181
182 SCL = Pin()
183 SDA = Pin()
184
185 SCK = Pin()
186 MOSI = J1_P39
187 MISO = J1_P40
188
189 TX = J1_P33
190 RX = J1_P34
191
192 # ordered as uartId, txId, rxId
193 uartPorts = ((0, TX, RX),)
194
195 # pwm outputs: pwm channel and pin
196 pwmOuts = (
197     (0, J1_P4),
198     (1, J1_P6),
199     (2, J1_P28),
200     (3, J1_P30),
201     (4, J2_P36),
202     (5, J2_P34),
203     (6, J2_P33),
204     (7, J1_P34),
205     (8, J2_P9),
206     (9, J1_P6),
207     (10, J1_P25),
208     (11, J1_P32),
209     (12, J1_P31),
210     (13, J2_P3),
211     (14, J1_P3),
212     (15, J1_P5),
213 )