wiringpi 2.0.0 → 2.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/ext/wiringpi/WiringPi/devLib/maxdetect.c +100 -27
  3. data/ext/wiringpi/WiringPi/devLib/maxdetect.h +0 -0
  4. data/ext/wiringpi/WiringPi/devLib/scrollPhat.c +430 -0
  5. data/ext/wiringpi/WiringPi/devLib/scrollPhat.h +39 -0
  6. data/ext/wiringpi/WiringPi/devLib/scrollPhatFont.h +544 -0
  7. data/ext/wiringpi/WiringPi/examples/PiFace/ladder.c +0 -0
  8. data/ext/wiringpi/WiringPi/examples/max31855.c +60 -0
  9. data/ext/wiringpi/WiringPi/examples/rht03.c +32 -15
  10. data/ext/wiringpi/WiringPi/examples/scrollPhat/scphat.c +230 -0
  11. data/ext/wiringpi/WiringPi/examples/scrollPhat/test.c +115 -0
  12. data/ext/wiringpi/WiringPi/gpio/gpio.c +88 -37
  13. data/ext/wiringpi/WiringPi/gpio/readall.c +41 -9
  14. data/ext/wiringpi/WiringPi/gpio/version.h +1 -1
  15. data/ext/wiringpi/WiringPi/wiringPi/ads1115.c +293 -0
  16. data/ext/wiringpi/WiringPi/wiringPi/ads1115.h +55 -0
  17. data/ext/wiringpi/WiringPi/wiringPi/drcSerial.c +4 -9
  18. data/ext/wiringpi/WiringPi/wiringPi/max31855.c +41 -23
  19. data/ext/wiringpi/WiringPi/wiringPi/max5322.c +2 -2
  20. data/ext/wiringpi/WiringPi/wiringPi/mcp23008.c +2 -2
  21. data/ext/wiringpi/WiringPi/wiringPi/mcp23016.c +2 -2
  22. data/ext/wiringpi/WiringPi/wiringPi/mcp23017.c +2 -2
  23. data/ext/wiringpi/WiringPi/wiringPi/mcp23s08.c +3 -4
  24. data/ext/wiringpi/WiringPi/wiringPi/mcp23s17.c +3 -4
  25. data/ext/wiringpi/WiringPi/wiringPi/mcp3002.c +2 -2
  26. data/ext/wiringpi/WiringPi/wiringPi/mcp3004.c +2 -2
  27. data/ext/wiringpi/WiringPi/wiringPi/mcp3422.c +33 -18
  28. data/ext/wiringpi/WiringPi/wiringPi/mcp3422.h +6 -6
  29. data/ext/wiringpi/WiringPi/wiringPi/mcp4802.c +2 -2
  30. data/ext/wiringpi/WiringPi/wiringPi/pcf8574.c +2 -2
  31. data/ext/wiringpi/WiringPi/wiringPi/pcf8591.c +2 -2
  32. data/ext/wiringpi/WiringPi/wiringPi/sn3218.c +2 -2
  33. data/ext/wiringpi/WiringPi/wiringPi/sr595.c +1 -1
  34. data/ext/wiringpi/WiringPi/wiringPi/wiringPi.c +418 -132
  35. data/ext/wiringpi/WiringPi/wiringPi/wiringPi.h +47 -37
  36. data/ext/wiringpi/WiringPi/wiringPi/wpiExtensions.c +38 -9
  37. data/ext/wiringpi/extconf.rb +26 -2
  38. data/ext/wiringpi/wiringpi_wrap.c +3456 -981
  39. metadata +9 -1
@@ -47,6 +47,7 @@ extern int wiringPiDebug ;
47
47
  // External functions I can't be bothered creating a separate .h file for:
48
48
 
49
49
  extern void doReadall (void) ;
50
+ extern void doAllReadall (void) ;
50
51
  extern void doPins (void) ;
51
52
 
52
53
  #ifndef TRUE
@@ -115,10 +116,12 @@ static void changeOwner (char *cmd, char *file)
115
116
 
116
117
  if (chown (file, uid, gid) != 0)
117
118
  {
118
- if (errno == ENOENT) // Warn that it's not there
119
- fprintf (stderr, "%s: Warning (not an error): File not present: %s\n", cmd, file) ;
120
- else
121
- fprintf (stderr, "%s: Warning (not an error): Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
119
+
120
+ // Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that
121
+ // the warning message is an error.
122
+
123
+ if (errno != ENOENT)
124
+ fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
122
125
  }
123
126
  }
124
127
 
@@ -138,7 +141,7 @@ static int moduleLoaded (char *modName)
138
141
 
139
142
  if (fd == NULL)
140
143
  {
141
- fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ;
144
+ fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)) ;
142
145
  exit (1) ;
143
146
  }
144
147
 
@@ -163,6 +166,22 @@ static int moduleLoaded (char *modName)
163
166
  *********************************************************************************
164
167
  */
165
168
 
169
+ static void checkDevTree (char *argv [])
170
+ {
171
+ struct stat statBuf ;
172
+
173
+ if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ...
174
+ {
175
+ fprintf (stderr,
176
+ "%s: Unable to load/unload modules as this Pi has the device tree enabled.\n"
177
+ " You need to run the raspi-config program (as root) and select the\n"
178
+ " modules (SPI or I2C) that you wish to load/unload there and reboot.\n"
179
+ " There is more information here:\n"
180
+ " https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=97314\n", argv [0]) ;
181
+ exit (1) ;
182
+ }
183
+ }
184
+
166
185
  static void _doLoadUsage (char *argv [])
167
186
  {
168
187
  fprintf (stderr, "Usage: %s load <spi/i2c> [I2C baudrate in Kb/sec]\n", argv [0]) ;
@@ -176,6 +195,8 @@ static void doLoad (int argc, char *argv [])
176
195
  char *file1, *file2 ;
177
196
  char args1 [32], args2 [32] ;
178
197
 
198
+ checkDevTree (argv) ;
199
+
179
200
  if (argc < 3)
180
201
  _doLoadUsage (argv) ;
181
202
 
@@ -251,6 +272,8 @@ static void doUnLoad (int argc, char *argv [])
251
272
  char *module1, *module2 ;
252
273
  char cmd [80] ;
253
274
 
275
+ checkDevTree (argv) ;
276
+
254
277
  if (argc != 3)
255
278
  _doUnLoadUsage (argv) ;
256
279
 
@@ -754,13 +777,13 @@ static void doUsbP (int argc, char *argv [])
754
777
 
755
778
  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
756
779
 
757
- if (model != PI_MODEL_BP)
780
+ if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2)))
758
781
  {
759
- fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ;
782
+ fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ;
760
783
  exit (1) ;
761
784
  }
762
785
 
763
- // Need to force BCM_GPIO mode:
786
+ // Make sure we start in BCM_GPIO mode
764
787
 
765
788
  wiringPiSetupGpio () ;
766
789
 
@@ -1128,6 +1151,45 @@ static void doPwmClock (int argc, char *argv [])
1128
1151
  }
1129
1152
 
1130
1153
 
1154
+ /*
1155
+ * doVersion:
1156
+ * Handle the ever more complicated version command and print out
1157
+ * some usefull information.
1158
+ *********************************************************************************
1159
+ */
1160
+
1161
+ static void doVersion (char *argv [])
1162
+ {
1163
+ int model, rev, mem, maker, warranty ;
1164
+ struct stat statBuf ;
1165
+
1166
+ printf ("gpio version: %s\n", VERSION) ;
1167
+ printf ("Copyright (c) 2012-2015 Gordon Henderson\n") ;
1168
+ printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
1169
+ printf ("For details type: %s -warranty\n", argv [0]) ;
1170
+ printf ("\n") ;
1171
+ piBoardId (&model, &rev, &mem, &maker, &warranty) ;
1172
+
1173
+ printf ("Raspberry Pi Details:\n") ;
1174
+ printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n",
1175
+ piModelNames [model], piRevisionNames [rev], piMemorySize [mem], piMakerNames [maker], warranty ? "[Out of Warranty]" : "") ;
1176
+
1177
+ // Check for device tree
1178
+
1179
+ if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ...
1180
+ printf (" * Device tree is enabled.\n") ;
1181
+
1182
+ if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO
1183
+ {
1184
+ printf (" * This Raspberry Pi supports user-level GPIO access.\n") ;
1185
+ printf (" -> See the man-page for more details\n") ;
1186
+ printf (" -> ie. export WIRINGPI_GPIOMEM=1\n") ;
1187
+ }
1188
+ else
1189
+ printf (" * Root or sudo required for GPIO access.\n") ;
1190
+ }
1191
+
1192
+
1131
1193
  /*
1132
1194
  * main:
1133
1195
  * Start here
@@ -1137,7 +1199,6 @@ static void doPwmClock (int argc, char *argv [])
1137
1199
  int main (int argc, char *argv [])
1138
1200
  {
1139
1201
  int i ;
1140
- int model, rev, mem, maker, overVolted ;
1141
1202
 
1142
1203
  if (getenv ("WIRINGPI_DEBUG") != NULL)
1143
1204
  {
@@ -1159,42 +1220,20 @@ int main (int argc, char *argv [])
1159
1220
  return 0 ;
1160
1221
  }
1161
1222
 
1162
- // Sort of a special:
1163
-
1164
- if (strcmp (argv [1], "-R") == 0)
1165
- {
1166
- printf ("%d\n", piBoardRev ()) ;
1167
- return 0 ;
1168
- }
1169
-
1170
1223
  // Version & Warranty
1224
+ // Wish I could remember why I have both -R and -V ...
1171
1225
 
1172
- if (strcmp (argv [1], "-V") == 0)
1226
+ if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0))
1173
1227
  {
1174
1228
  printf ("%d\n", piBoardRev ()) ;
1175
1229
  return 0 ;
1176
1230
  }
1177
1231
 
1232
+ // Version and information
1233
+
1178
1234
  if (strcmp (argv [1], "-v") == 0)
1179
1235
  {
1180
- printf ("gpio version: %s\n", VERSION) ;
1181
- printf ("Copyright (c) 2012-2015 Gordon Henderson\n") ;
1182
- printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
1183
- printf ("For details type: %s -warranty\n", argv [0]) ;
1184
- printf ("\n") ;
1185
- piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
1186
- if (model == PI_MODEL_UNKNOWN)
1187
- {
1188
- printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ;
1189
- printf (" projects@drogon.net\n") ;
1190
- printf ("with a copy of your /proc/cpuinfo if possible\n") ;
1191
- }
1192
- else
1193
- {
1194
- printf ("Raspberry Pi Details:\n") ;
1195
- printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n",
1196
- piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ;
1197
- }
1236
+ doVersion (argv) ;
1198
1237
  return 0 ;
1199
1238
  }
1200
1239
 
@@ -1238,11 +1277,24 @@ int main (int argc, char *argv [])
1238
1277
  if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; }
1239
1278
  if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; }
1240
1279
 
1280
+ // Check for usb power command
1281
+
1282
+ if (strcasecmp (argv [1], "usbp" ) == 0) { doUsbP (argc, argv) ; return 0 ; }
1283
+
1241
1284
  // Gertboard commands
1242
1285
 
1243
1286
  if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; }
1244
1287
  if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; }
1245
1288
 
1289
+ // Check for allreadall command, force Gpio mode
1290
+
1291
+ if (strcasecmp (argv [1], "allreadall") == 0)
1292
+ {
1293
+ wiringPiSetupGpio () ;
1294
+ doAllReadall () ;
1295
+ return 0 ;
1296
+ }
1297
+
1246
1298
  // Check for -g argument
1247
1299
 
1248
1300
  /**/ if (strcasecmp (argv [1], "-g") == 0)
@@ -1332,7 +1384,6 @@ int main (int argc, char *argv [])
1332
1384
  else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ;
1333
1385
  else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ;
1334
1386
  else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ;
1335
- else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ;
1336
1387
  else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ;
1337
1388
  else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ;
1338
1389
  else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ;
@@ -215,7 +215,14 @@ static void readallPhys (int physPin)
215
215
  }
216
216
 
217
217
 
218
- void cmReadall (void)
218
+ /*
219
+ * allReadall:
220
+ * Read all the pins regardless of the model. Primarily of use for
221
+ * the compute module, but handy for other fiddling...
222
+ *********************************************************************************
223
+ */
224
+
225
+ static void allReadall (void)
219
226
  {
220
227
  int pin ;
221
228
 
@@ -223,19 +230,20 @@ void cmReadall (void)
223
230
  printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ;
224
231
  printf ("+-----+------+-------+ +-----+------+-------+\n") ;
225
232
 
226
- for (pin = 0 ; pin < 28 ; ++pin)
233
+ for (pin = 0 ; pin < 27 ; ++pin)
227
234
  {
228
235
  printf ("| %3d ", pin) ;
229
236
  printf ("| %-4s ", alts [getAlt (pin)]) ;
230
237
  printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ;
231
238
  printf ("| ") ;
232
- printf ("| %3d ", pin + 28) ;
233
- printf ("| %-4s ", alts [getAlt (pin + 28)]) ;
234
- printf ("| %s ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ;
239
+ printf ("| %3d ", pin + 27) ;
240
+ printf ("| %-4s ", alts [getAlt (pin + 27)]) ;
241
+ printf ("| %s ", digitalRead (pin + 27) == HIGH ? "High" : "Low ") ;
235
242
  printf ("|\n") ;
236
243
  }
237
244
 
238
245
  printf ("+-----+------+-------+ +-----+------+-------+\n") ;
246
+
239
247
  }
240
248
 
241
249
 
@@ -289,12 +297,18 @@ static void plus2header (int model)
289
297
  printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ;
290
298
  else if (model == PI_MODEL_BP)
291
299
  printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
292
- else
300
+ else if (model == PI_MODEL_ZERO)
301
+ printf (" +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+\n") ;
302
+ else if (model == PI_MODEL_2)
293
303
  printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ;
304
+ else if (model == PI_MODEL_3)
305
+ printf (" +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+\n") ;
306
+ else
307
+ printf (" +-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+\n") ;
294
308
  }
295
309
 
296
310
 
297
- void piPlusReadall (int model)
311
+ static void piPlusReadall (int model)
298
312
  {
299
313
  int pin ;
300
314
 
@@ -311,6 +325,13 @@ void piPlusReadall (int model)
311
325
  }
312
326
 
313
327
 
328
+ /*
329
+ * doReadall:
330
+ * Generic read all pins called from main program. Works out the Pi type
331
+ * and calls the appropriate function.
332
+ *********************************************************************************
333
+ */
334
+
314
335
  void doReadall (void)
315
336
  {
316
337
  int model, rev, mem, maker, overVolted ;
@@ -325,10 +346,21 @@ void doReadall (void)
325
346
 
326
347
  /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B))
327
348
  abReadall (model, rev) ;
328
- else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2))
349
+ else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2) || (model == PI_MODEL_3) || (model == PI_MODEL_ZERO))
329
350
  piPlusReadall (model) ;
330
351
  else if (model == PI_MODEL_CM)
331
- cmReadall () ;
352
+ allReadall () ;
332
353
  else
333
354
  printf ("Oops - unable to determine board type... model: %d\n", model) ;
334
355
  }
356
+
357
+ /*
358
+ * doAllReadall:
359
+ * Force reading of all pins regardless of Pi model
360
+ *********************************************************************************
361
+ */
362
+
363
+ void doAllReadall (void)
364
+ {
365
+ allReadall () ;
366
+ }
@@ -1 +1 @@
1
- #define VERSION "2.26"
1
+ #define VERSION "2.32"
@@ -0,0 +1,293 @@
1
+ /*
2
+ * ads1115.c:
3
+ * Extend wiringPi with the ADS1115 I2C 16-bit ADC
4
+ * Copyright (c) 2016 Gordon Henderson
5
+ ***********************************************************************
6
+ * This file is part of wiringPi:
7
+ * https://projects.drogon.net/raspberry-pi/wiringpi/
8
+ *
9
+ * wiringPi is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU Lesser General Public License as
11
+ * published by the Free Software Foundation, either version 3 of the
12
+ * License, or (at your option) any later version.
13
+ *
14
+ * wiringPi is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ * GNU Lesser General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU Lesser General Public
20
+ * License along with wiringPi.
21
+ * If not, see <http://www.gnu.org/licenses/>.
22
+ ***********************************************************************
23
+ */
24
+
25
+ /*
26
+ *********************************************************************************
27
+ * We're going to work in a hybrid mode to fit in with the wiringPi way of
28
+ * doing things, so there will be 4 analog pin which read the 4 single-ended
29
+ * channels as usual, also some fake digitalOutputs - these are the control
30
+ * registers that allow the user to put it into single/diff mode, set the
31
+ * gain and data rates.
32
+ *********************************************************************************
33
+ */
34
+
35
+ #include <byteswap.h>
36
+ #include <stdio.h>
37
+ #include <stdint.h>
38
+
39
+ #include <wiringPi.h>
40
+ #include <wiringPiI2C.h>
41
+
42
+ #include "ads1115.h"
43
+
44
+ // Bits in the config register (it's a 16-bit register)
45
+
46
+ #define CONFIG_OS_MASK (0x8000) // Operational Status Register
47
+ #define CONFIG_OS_SINGLE (0x8000) // Write - Starts a single-conversion
48
+ // Read 1 = Conversion complete
49
+
50
+ // The multiplexor
51
+
52
+ #define CONFIG_MUX_MASK (0x7000)
53
+
54
+ // Differential modes
55
+
56
+ #define CONFIG_MUX_DIFF_0_1 (0x0000) // Pos = AIN0, Neg = AIN1 (default)
57
+ #define CONFIG_MUX_DIFF_0_3 (0x1000) // Pos = AIN0, Neg = AIN3
58
+ #define CONFIG_MUX_DIFF_1_3 (0x2000) // Pos = AIN1, Neg = AIN3
59
+ #define CONFIG_MUX_DIFF_2_3 (0x3000) // Pos = AIN2, Neg = AIN3 (2nd differential channel)
60
+
61
+ // Single-ended modes
62
+
63
+ #define CONFIG_MUX_SINGLE_0 (0x4000) // AIN0
64
+ #define CONFIG_MUX_SINGLE_1 (0x5000) // AIN1
65
+ #define CONFIG_MUX_SINGLE_2 (0x6000) // AIN2
66
+ #define CONFIG_MUX_SINGLE_3 (0x7000) // AIN3
67
+
68
+ // Programmable Gain Amplifier
69
+
70
+ #define CONFIG_PGA_MASK (0x0E00)
71
+ #define CONFIG_PGA_6_144V (0x0000) // +/-6.144V range = Gain 2/3
72
+ #define CONFIG_PGA_4_096V (0x0200) // +/-4.096V range = Gain 1
73
+ #define CONFIG_PGA_2_048V (0x0400) // +/-2.048V range = Gain 2 (default)
74
+ #define CONFIG_PGA_1_024V (0x0600) // +/-1.024V range = Gain 4
75
+ #define CONFIG_PGA_0_512V (0x0800) // +/-0.512V range = Gain 8
76
+ #define CONFIG_PGA_0_256V (0x0A00) // +/-0.256V range = Gain 16
77
+
78
+ #define CONFIG_MODE (0x0100) // 0 is continuous, 1 is single-shot (default)
79
+
80
+ // Data Rate
81
+
82
+ #define CONFIG_DR_MASK (0x00E0)
83
+ #define CONFIG_DR_8SPS (0x0000) // 8 samples per second
84
+ #define CONFIG_DR_16SPS (0x0020) // 16 samples per second
85
+ #define CONFIG_DR_32SPS (0x0040) // 32 samples per second
86
+ #define CONFIG_DR_64SPS (0x0060) // 64 samples per second
87
+ #define CONFIG_DR_128SPS (0x0080) // 128 samples per second (default)
88
+ #define CONFIG_DR_475SPS (0x00A0) // 475 samples per second
89
+ #define CONFIG_DR_860SPS (0x00C0) // 860 samples per second
90
+
91
+ // Comparator mode
92
+
93
+ #define CONFIG_CMODE_MASK (0x0010)
94
+ #define CONFIG_CMODE_TRAD (0x0000) // Traditional comparator with hysteresis (default)
95
+ #define CONFIG_CMODE_WINDOW (0x0010) // Window comparator
96
+
97
+ // Comparator polarity - the polarity of the output alert/rdy pin
98
+
99
+ #define CONFIG_CPOL_MASK (0x0008)
100
+ #define CONFIG_CPOL_ACTVLOW (0x0000) // Active low (default)
101
+ #define CONFIG_CPOL_ACTVHI (0x0008) // Active high
102
+
103
+ // Latching comparator - does the alert/rdy pin latch
104
+
105
+ #define CONFIG_CLAT_MASK (0x0004)
106
+ #define CONFIG_CLAT_NONLAT (0x0000) // Non-latching comparator (default)
107
+ #define CONFIG_CLAT_LATCH (0x0004) // Latching comparator
108
+
109
+ // Comparitor queue
110
+
111
+ #define CONFIG_CQUE_MASK (0x0003)
112
+ #define CONFIG_CQUE_1CONV (0x0000) // Assert after one conversions
113
+ #define CONFIG_CQUE_2CONV (0x0001) // Assert after two conversions
114
+ #define CONFIG_CQUE_4CONV (0x0002) // Assert after four conversions
115
+ #define CONFIG_CQUE_NONE (0x0003) // Disable the comparator (default)
116
+
117
+ #define CONFIG_DEFAULT (0x8583) // From the datasheet
118
+
119
+
120
+ static const uint16_t dataRates [8] =
121
+ {
122
+ CONFIG_DR_8SPS, CONFIG_DR_16SPS, CONFIG_DR_32SPS, CONFIG_DR_64SPS, CONFIG_DR_128SPS, CONFIG_DR_475SPS, CONFIG_DR_860SPS
123
+ } ;
124
+
125
+ static const uint16_t gains [6] =
126
+ {
127
+ CONFIG_PGA_6_144V, CONFIG_PGA_4_096V, CONFIG_PGA_2_048V, CONFIG_PGA_1_024V, CONFIG_PGA_0_512V, CONFIG_PGA_0_256V
128
+ } ;
129
+
130
+
131
+ /*
132
+ * analogRead:
133
+ * Pin is the channel to sample on the device.
134
+ * Channels 0-3 are single ended inputs,
135
+ * channels 4-7 are the various differential combinations.
136
+ *********************************************************************************
137
+ */
138
+
139
+ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
140
+ {
141
+ int chan = pin - node->pinBase ;
142
+ int16_t result ;
143
+ uint16_t config = CONFIG_DEFAULT ;
144
+
145
+ chan &= 7 ;
146
+
147
+ // Setup the configuration register
148
+
149
+ // Set PGA/voltage range
150
+
151
+ config &= ~CONFIG_PGA_MASK ;
152
+ config |= node->data0 ;
153
+
154
+ // Set sample speed
155
+
156
+ config &= ~CONFIG_DR_MASK ;
157
+ config |= node->data1 ;
158
+
159
+ // Set single-ended channel or differential mode
160
+
161
+ config &= ~CONFIG_MUX_MASK ;
162
+
163
+ switch (chan)
164
+ {
165
+ case 0: config |= CONFIG_MUX_SINGLE_0 ; break ;
166
+ case 1: config |= CONFIG_MUX_SINGLE_1 ; break ;
167
+ case 2: config |= CONFIG_MUX_SINGLE_2 ; break ;
168
+ case 3: config |= CONFIG_MUX_SINGLE_3 ; break ;
169
+
170
+ case 4: config |= CONFIG_MUX_DIFF_0_1 ; break ;
171
+ case 5: config |= CONFIG_MUX_DIFF_2_3 ; break ;
172
+ case 6: config |= CONFIG_MUX_DIFF_0_3 ; break ;
173
+ case 7: config |= CONFIG_MUX_DIFF_1_3 ; break ;
174
+ }
175
+
176
+ // Start a single conversion
177
+
178
+ config |= CONFIG_OS_SINGLE ;
179
+ config = __bswap_16 (config) ;
180
+ wiringPiI2CWriteReg16 (node->fd, 1, config) ;
181
+
182
+ // Wait for the conversion to complete
183
+
184
+ for (;;)
185
+ {
186
+ result = wiringPiI2CReadReg16 (node->fd, 1) ;
187
+ result = __bswap_16 (result) ;
188
+ if ((result & CONFIG_OS_MASK) != 0)
189
+ break ;
190
+ delayMicroseconds (100) ;
191
+ }
192
+
193
+ result = wiringPiI2CReadReg16 (node->fd, 0) ;
194
+ result = __bswap_16 (result) ;
195
+
196
+ // Sometimes with a 0v input on a single-ended channel the internal 0v reference
197
+ // can be higher than the input, so you get a negative result...
198
+
199
+ if ( (chan < 4) && (result < 0) )
200
+ return 0 ;
201
+ else
202
+ return (int)result ;
203
+ }
204
+
205
+
206
+ /*
207
+ * digitalWrite:
208
+ * It may seem odd to have a digital write here, but it's the best way
209
+ * to pass paramters into the chip in the wiringPi way of things.
210
+ * We have 2 digital registers:
211
+ * 0 is the gain control
212
+ * 1 is the data rate control
213
+ *********************************************************************************
214
+ */
215
+
216
+ static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int data)
217
+ {
218
+ int chan = pin - node->pinBase ;
219
+ chan &= 3 ;
220
+
221
+ if (chan == 0) // Gain Control
222
+ {
223
+ if ( (data < 0) || (data > 6) ) // Use default if out of range
224
+ data = 2 ;
225
+ node->data0 = gains [data] ;
226
+ }
227
+ else // Data rate control
228
+ {
229
+ if ( (data < 0) || (data > 7) ) // Use default if out of range
230
+ data = 4 ;
231
+ node->data0 = dataRates [data] ;
232
+ }
233
+
234
+ }
235
+
236
+
237
+ /*
238
+ * analogWrite:
239
+ * We're using this to write to the 2 comparitor threshold registers.
240
+ * We could use a digitalWrite here but as it's an analog comparison
241
+ * then it feels better to do it this way.
242
+ *********************************************************************************
243
+ */
244
+
245
+ static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int data)
246
+ {
247
+ int chan = pin - node->pinBase ;
248
+ int reg ;
249
+ int16_t ndata ;
250
+
251
+ chan &= 3 ;
252
+
253
+ reg = chan + 2 ;
254
+
255
+ /**/ if (data < -32767)
256
+ ndata = -32767 ;
257
+ else if (data > 32767)
258
+ ndata = 32767 ;
259
+ else
260
+ ndata = (int16_t)data ;
261
+
262
+ ndata = __bswap_16 (ndata) ;
263
+ wiringPiI2CWriteReg16 (node->fd, reg, data) ;
264
+ }
265
+
266
+
267
+
268
+ /*
269
+ * ads1115Setup:
270
+ * Create a new wiringPi device node for an ads1115 on the Pi's
271
+ * I2C interface.
272
+ *********************************************************************************
273
+ */
274
+
275
+ int ads1115Setup (const int pinBase, int i2cAddr)
276
+ {
277
+ struct wiringPiNodeStruct *node ;
278
+ int fd ;
279
+
280
+ if ((fd = wiringPiI2CSetup (i2cAddr)) < 0)
281
+ return FALSE ;
282
+
283
+ node = wiringPiNewNode (pinBase, 8) ;
284
+
285
+ node->fd = fd ;
286
+ node->data0 = CONFIG_PGA_4_096V ; // Gain in data0
287
+ node->data1 = CONFIG_DR_128SPS ; // Samples/sec in data1
288
+ node->analogRead = myAnalogRead ;
289
+ node->analogWrite = myAnalogWrite ;
290
+ node->digitalWrite = myDigitalWrite ;
291
+
292
+ return TRUE ;
293
+ }