wiring_lmk 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/ext/wiringpi/WiringPi/devLib/ds1302.c +254 -0
  3. data/ext/wiringpi/WiringPi/devLib/ds1302.h +44 -0
  4. data/ext/wiringpi/WiringPi/devLib/font.h +2577 -0
  5. data/ext/wiringpi/WiringPi/devLib/gertboard.c +164 -0
  6. data/ext/wiringpi/WiringPi/devLib/gertboard.h +45 -0
  7. data/ext/wiringpi/WiringPi/devLib/lcd.c +507 -0
  8. data/ext/wiringpi/WiringPi/devLib/lcd.h +52 -0
  9. data/ext/wiringpi/WiringPi/devLib/lcd128x64.c +684 -0
  10. data/ext/wiringpi/WiringPi/devLib/lcd128x64.h +39 -0
  11. data/ext/wiringpi/WiringPi/devLib/maxdetect.c +167 -0
  12. data/ext/wiringpi/WiringPi/devLib/maxdetect.h +40 -0
  13. data/ext/wiringpi/WiringPi/devLib/piFace.c +112 -0
  14. data/ext/wiringpi/WiringPi/devLib/piFace.h +32 -0
  15. data/ext/wiringpi/WiringPi/devLib/piFaceOld.c +178 -0
  16. data/ext/wiringpi/WiringPi/devLib/piGlow.c +118 -0
  17. data/ext/wiringpi/WiringPi/devLib/piGlow.h +45 -0
  18. data/ext/wiringpi/WiringPi/devLib/piNes.c +117 -0
  19. data/ext/wiringpi/WiringPi/devLib/piNes.h +45 -0
  20. data/ext/wiringpi/WiringPi/gpio/extensions.c +700 -0
  21. data/ext/wiringpi/WiringPi/gpio/extensions.h +26 -0
  22. data/ext/wiringpi/WiringPi/gpio/gpio.c +1280 -0
  23. data/ext/wiringpi/WiringPi/gpio/pins.c +33 -0
  24. data/ext/wiringpi/WiringPi/gpio/readall.c +337 -0
  25. data/ext/wiringpi/WiringPi/wiringPi/drcSerial.c +201 -0
  26. data/ext/wiringpi/WiringPi/wiringPi/drcSerial.h +33 -0
  27. data/ext/wiringpi/WiringPi/wiringPi/max31855.c +99 -0
  28. data/ext/wiringpi/WiringPi/wiringPi/max31855.h +33 -0
  29. data/ext/wiringpi/WiringPi/wiringPi/max5322.c +84 -0
  30. data/ext/wiringpi/WiringPi/wiringPi/max5322.h +33 -0
  31. data/ext/wiringpi/WiringPi/wiringPi/mcp23008.c +149 -0
  32. data/ext/wiringpi/WiringPi/wiringPi/mcp23008.h +33 -0
  33. data/ext/wiringpi/WiringPi/wiringPi/mcp23016.c +164 -0
  34. data/ext/wiringpi/WiringPi/wiringPi/mcp23016.h +33 -0
  35. data/ext/wiringpi/WiringPi/wiringPi/mcp23016reg.h +48 -0
  36. data/ext/wiringpi/WiringPi/wiringPi/mcp23017.c +195 -0
  37. data/ext/wiringpi/WiringPi/wiringPi/mcp23017.h +33 -0
  38. data/ext/wiringpi/WiringPi/wiringPi/mcp23s08.c +189 -0
  39. data/ext/wiringpi/WiringPi/wiringPi/mcp23s08.h +33 -0
  40. data/ext/wiringpi/WiringPi/wiringPi/mcp23s17.c +234 -0
  41. data/ext/wiringpi/WiringPi/wiringPi/mcp23s17.h +33 -0
  42. data/ext/wiringpi/WiringPi/wiringPi/mcp23x08.h +73 -0
  43. data/ext/wiringpi/WiringPi/wiringPi/mcp23x0817.h +87 -0
  44. data/ext/wiringpi/WiringPi/wiringPi/mcp3002.c +76 -0
  45. data/ext/wiringpi/WiringPi/wiringPi/mcp3002.h +33 -0
  46. data/ext/wiringpi/WiringPi/wiringPi/mcp3004.c +76 -0
  47. data/ext/wiringpi/WiringPi/wiringPi/mcp3004.h +33 -0
  48. data/ext/wiringpi/WiringPi/wiringPi/mcp3422.c +113 -0
  49. data/ext/wiringpi/WiringPi/wiringPi/mcp3422.h +43 -0
  50. data/ext/wiringpi/WiringPi/wiringPi/mcp4802.c +76 -0
  51. data/ext/wiringpi/WiringPi/wiringPi/mcp4802.h +33 -0
  52. data/ext/wiringpi/WiringPi/wiringPi/pcf8574.c +126 -0
  53. data/ext/wiringpi/WiringPi/wiringPi/pcf8574.h +33 -0
  54. data/ext/wiringpi/WiringPi/wiringPi/pcf8591.c +92 -0
  55. data/ext/wiringpi/WiringPi/wiringPi/pcf8591.h +33 -0
  56. data/ext/wiringpi/WiringPi/wiringPi/piHiPri.c +51 -0
  57. data/ext/wiringpi/WiringPi/wiringPi/piThread.c +63 -0
  58. data/ext/wiringpi/WiringPi/wiringPi/sn3218.c +75 -0
  59. data/ext/wiringpi/WiringPi/wiringPi/sn3218.h +33 -0
  60. data/ext/wiringpi/WiringPi/wiringPi/softPwm.c +168 -0
  61. data/ext/wiringpi/WiringPi/wiringPi/softPwm.h +35 -0
  62. data/ext/wiringpi/WiringPi/wiringPi/softServo.c +247 -0
  63. data/ext/wiringpi/WiringPi/wiringPi/softServo.h +35 -0
  64. data/ext/wiringpi/WiringPi/wiringPi/softTone.c +150 -0
  65. data/ext/wiringpi/WiringPi/wiringPi/softTone.h +39 -0
  66. data/ext/wiringpi/WiringPi/wiringPi/sr595.c +113 -0
  67. data/ext/wiringpi/WiringPi/wiringPi/sr595.h +34 -0
  68. data/ext/wiringpi/WiringPi/wiringPi/wiringPi.c +3688 -0
  69. data/ext/wiringpi/WiringPi/wiringPi/wiringPi.h +229 -0
  70. data/ext/wiringpi/WiringPi/wiringPi/wiringPiI2C.c +236 -0
  71. data/ext/wiringpi/WiringPi/wiringPi/wiringPiI2C.h +42 -0
  72. data/ext/wiringpi/WiringPi/wiringPi/wiringPiSPI.c +121 -0
  73. data/ext/wiringpi/WiringPi/wiringPi/wiringPiSPI.h +35 -0
  74. data/ext/wiringpi/WiringPi/wiringPi/wiringSerial.c +253 -0
  75. data/ext/wiringpi/WiringPi/wiringPi/wiringSerial.h +38 -0
  76. data/ext/wiringpi/WiringPi/wiringPi/wiringShift.c +83 -0
  77. data/ext/wiringpi/WiringPi/wiringPi/wiringShift.h +41 -0
  78. data/ext/wiringpi/extconf.rb +8 -0
  79. data/ext/wiringpi/wiringpi_wrap.c +4396 -0
  80. data/lib/wiring_lmk.rb +42 -0
  81. data/lib/wiring_lmk/event.rb +21 -0
  82. data/lib/wiring_lmk/gpio.rb +139 -0
  83. data/lib/wiring_lmk/i2c.rb +26 -0
  84. data/lib/wiring_lmk/mcp23x17.rb +31 -0
  85. data/lib/wiring_lmk/serial.rb +49 -0
  86. data/lib/wiring_lmk/spi.rb +15 -0
  87. metadata +136 -0
@@ -0,0 +1,118 @@
1
+ /*
2
+ * piGlow.c:
3
+ * Easy access to the Pimoroni PiGlow board.
4
+ *
5
+ * Copyright (c) 2013 Gordon Henderson.
6
+ ***********************************************************************
7
+ * This file is part of wiringPi:
8
+ * https://projects.drogon.net/raspberry-pi/wiringpi/
9
+ *
10
+ * wiringPi is free software: you can redistribute it and/or modify
11
+ * it under the terms of the GNU Lesser General Public License as published by
12
+ * the Free Software Foundation, either version 3 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * wiringPi is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ * GNU Lesser General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU Lesser General Public License
21
+ * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
22
+ ***********************************************************************
23
+ */
24
+
25
+ #include "wiringPi.h"
26
+ #include <sn3218.h>
27
+
28
+ #include "piGlow.h"
29
+
30
+ #define PIGLOW_BASE 577
31
+
32
+ static int leg0 [6] = { 6, 7, 8, 5, 4, 9 } ;
33
+ static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ;
34
+ static int leg2 [6] = { 0, 1, 2, 3, 14, 12 } ;
35
+
36
+
37
+ /*
38
+ * piGlow1:
39
+ * Light up an individual LED
40
+ *********************************************************************************
41
+ */
42
+
43
+ void piGlow1 (const int leg, const int ring, const int intensity)
44
+ {
45
+ int *legLeds ;
46
+
47
+ if ((leg < 0) || (leg > 2)) return ;
48
+ if ((ring < 0) || (ring > 5)) return ;
49
+
50
+ /**/ if (leg == 0)
51
+ legLeds = leg0 ;
52
+ else if (leg == 1)
53
+ legLeds = leg1 ;
54
+ else
55
+ legLeds = leg2 ;
56
+
57
+ analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ;
58
+ }
59
+
60
+ /*
61
+ * piGlowLeg:
62
+ * Light up all 6 LEDs on a leg
63
+ *********************************************************************************
64
+ */
65
+
66
+ void piGlowLeg (const int leg, const int intensity)
67
+ {
68
+ int i ;
69
+ int *legLeds ;
70
+
71
+ if ((leg < 0) || (leg > 2))
72
+ return ;
73
+
74
+ /**/ if (leg == 0)
75
+ legLeds = leg0 ;
76
+ else if (leg == 1)
77
+ legLeds = leg1 ;
78
+ else
79
+ legLeds = leg2 ;
80
+
81
+ for (i = 0 ; i < 6 ; ++i)
82
+ analogWrite (PIGLOW_BASE + legLeds [i], intensity) ;
83
+ }
84
+
85
+
86
+ /*
87
+ * piGlowRing:
88
+ * Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost
89
+ *********************************************************************************
90
+ */
91
+
92
+ void piGlowRing (const int ring, const int intensity)
93
+ {
94
+ if ((ring < 0) || (ring > 5))
95
+ return ;
96
+
97
+ analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ;
98
+ analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ;
99
+ analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ;
100
+ }
101
+
102
+ /*
103
+ * piGlowSetup:
104
+ * Initialise the board & remember the pins we're using
105
+ *********************************************************************************
106
+ */
107
+
108
+ void piGlowSetup (int clear)
109
+ {
110
+ sn3218Setup (PIGLOW_BASE) ;
111
+
112
+ if (clear)
113
+ {
114
+ piGlowLeg (0, 0) ;
115
+ piGlowLeg (1, 0) ;
116
+ piGlowLeg (2, 0) ;
117
+ }
118
+ }
@@ -0,0 +1,45 @@
1
+ /*
2
+ * piglow.h:
3
+ * Easy access to the Pimoroni PiGlow board.
4
+ *
5
+ * Copyright (c) 2013 Gordon Henderson.
6
+ ***********************************************************************
7
+ * This file is part of wiringPi:
8
+ * https://projects.drogon.net/raspberry-pi/wiringpi/
9
+ *
10
+ * wiringPi is free software: you can redistribute it and/or modify
11
+ * it under the terms of the GNU Lesser General Public License as published by
12
+ * the Free Software Foundation, either version 3 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * wiringPi is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ * GNU Lesser General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU Lesser General Public License
21
+ * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
22
+ ***********************************************************************
23
+ */
24
+
25
+
26
+ #define PIGLOW_RED 0
27
+ #define PIGLOW_ORANGE 1
28
+ #define PIGLOW_YELLOW 2
29
+ #define PIGLOW_GREEN 3
30
+ #define PIGLOW_BLUE 4
31
+ #define PIGLOW_WHITE 5
32
+
33
+
34
+ #ifdef __cplusplus
35
+ extern "C" {
36
+ #endif
37
+
38
+ extern void piGlow1 (const int leg, const int ring, const int intensity) ;
39
+ extern void piGlowLeg (const int leg, const int intensity) ;
40
+ extern void piGlowRing (const int ring, const int intensity) ;
41
+ extern void piGlowSetup (int clear) ;
42
+
43
+ #ifdef __cplusplus
44
+ }
45
+ #endif
@@ -0,0 +1,117 @@
1
+ /*
2
+ * piNes.c:
3
+ * Driver for the NES Joystick controller on the Raspberry Pi
4
+ * Copyright (c) 2012 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
+ #include "wiringPi.h"
26
+
27
+ #include "piNes.h"
28
+
29
+ #define MAX_NES_JOYSTICKS 8
30
+
31
+ #define NES_RIGHT 0x01
32
+ #define NES_LEFT 0x02
33
+ #define NES_DOWN 0x04
34
+ #define NES_UP 0x08
35
+ #define NES_START 0x10
36
+ #define NES_SELECT 0x20
37
+ #define NES_B 0x40
38
+ #define NES_A 0x80
39
+
40
+
41
+ #define PULSE_TIME 25
42
+
43
+ // Data to store the pins for each controller
44
+
45
+ struct nesPinsStruct
46
+ {
47
+ unsigned int cPin, dPin, lPin ;
48
+ } ;
49
+
50
+ static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ;
51
+
52
+ static int joysticks = 0 ;
53
+
54
+
55
+ /*
56
+ * setupNesJoystick:
57
+ * Create a new NES joystick interface, program the pins, etc.
58
+ *********************************************************************************
59
+ */
60
+
61
+ int setupNesJoystick (int dPin, int cPin, int lPin)
62
+ {
63
+ if (joysticks == MAX_NES_JOYSTICKS)
64
+ return -1 ;
65
+
66
+ nesPins [joysticks].dPin = dPin ;
67
+ nesPins [joysticks].cPin = cPin ;
68
+ nesPins [joysticks].lPin = lPin ;
69
+
70
+ digitalWrite (lPin, LOW) ;
71
+ digitalWrite (cPin, LOW) ;
72
+
73
+ pinMode (lPin, OUTPUT) ;
74
+ pinMode (cPin, OUTPUT) ;
75
+ pinMode (dPin, INPUT) ;
76
+
77
+ return joysticks++ ;
78
+ }
79
+
80
+
81
+ /*
82
+ * readNesJoystick:
83
+ * Do a single scan of the NES Joystick.
84
+ *********************************************************************************
85
+ */
86
+
87
+ unsigned int readNesJoystick (int joystick)
88
+ {
89
+ unsigned int value = 0 ;
90
+ int i ;
91
+
92
+ struct nesPinsStruct *pins = &nesPins [joystick] ;
93
+
94
+ // Toggle Latch - which presents the first bit
95
+
96
+ digitalWrite (pins->lPin, HIGH) ;
97
+ delayMicroseconds (PULSE_TIME) ;
98
+ digitalWrite (pins->lPin, LOW) ;
99
+ delayMicroseconds (PULSE_TIME) ;
100
+
101
+ // Read first bit
102
+
103
+ value = digitalRead (pins->dPin) ;
104
+
105
+ // Now get the next 7 bits with the clock
106
+
107
+ for (i = 0 ; i < 7 ; ++i)
108
+ {
109
+ digitalWrite (pins->cPin, HIGH) ;
110
+ delayMicroseconds (PULSE_TIME) ;
111
+ digitalWrite (pins->cPin, LOW) ;
112
+ delayMicroseconds (PULSE_TIME) ;
113
+ value = (value << 1) | digitalRead (pins->dPin) ;
114
+ }
115
+
116
+ return value ^ 0xFF ;
117
+ }
@@ -0,0 +1,45 @@
1
+ /*
2
+ * piNes.h:
3
+ * Driver for the NES Joystick controller on the Raspberry Pi
4
+ * Copyright (c) 2012 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
+ #define MAX_NES_JOYSTICKS 8
26
+
27
+ #define NES_RIGHT 0x01
28
+ #define NES_LEFT 0x02
29
+ #define NES_DOWN 0x04
30
+ #define NES_UP 0x08
31
+ #define NES_START 0x10
32
+ #define NES_SELECT 0x20
33
+ #define NES_B 0x40
34
+ #define NES_A 0x80
35
+
36
+ #ifdef __cplusplus
37
+ extern "C" {
38
+ #endif
39
+
40
+ extern int setupNesJoystick (int dPin, int cPin, int lPin) ;
41
+ extern unsigned int readNesJoystick (int joystick) ;
42
+
43
+ #ifdef __cplusplus
44
+ }
45
+ #endif
@@ -0,0 +1,700 @@
1
+ /*
2
+ * extensions.c:
3
+ * Part of the GPIO program to test, peek, poke and otherwise
4
+ * noodle with the GPIO hardware on the Raspberry Pi.
5
+ * Copyright (c) 2012-2013 Gordon Henderson
6
+ ***********************************************************************
7
+ * This file is part of wiringPi:
8
+ * https://projects.drogon.net/raspberry-pi/wiringpi/
9
+ *
10
+ * wiringPi is free software: you can redistribute it and/or modify
11
+ * it under the terms of the GNU Lesser General Public License as published by
12
+ * the Free Software Foundation, either version 3 of the License, or
13
+ * (at your option) any later version.
14
+ *
15
+ * wiringPi is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ * GNU Lesser General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU Lesser General Public License
21
+ * along with wiringPi. If not, see <http://www.gnu.org/licenses/>.
22
+ ***********************************************************************
23
+ */
24
+
25
+
26
+ #include <stdio.h>
27
+ #include <stdlib.h>
28
+ #include <stdint.h>
29
+ #include <ctype.h>
30
+ #include <string.h>
31
+ #include <unistd.h>
32
+ #include <errno.h>
33
+ #include <sys/types.h>
34
+ #include <fcntl.h>
35
+
36
+ #include "wiringPi.h"
37
+
38
+ #include <mcp23008.h>
39
+ #include <mcp23016.h>
40
+ #include <mcp23017.h>
41
+ #include <mcp23s08.h>
42
+ #include <mcp23s17.h>
43
+ #include <sr595.h>
44
+ #include <pcf8591.h>
45
+ #include <pcf8574.h>
46
+ #include <max31855.h>
47
+ #include <max5322.h>
48
+ #include <mcp3002.h>
49
+ #include <mcp3004.h>
50
+ #include <mcp4802.h>
51
+ #include <mcp3422.h>
52
+ #include <sn3218.h>
53
+ #include <drcSerial.h>
54
+
55
+ #include "extensions.h"
56
+
57
+ extern int wiringPiDebug ;
58
+
59
+ #ifndef TRUE
60
+ # define TRUE (1==1)
61
+ # define FALSE (1==2)
62
+ #endif
63
+
64
+ // Local structure to hold details
65
+
66
+ struct extensionFunctionStruct
67
+ {
68
+ const char *name ;
69
+ int (*function)(char *progName, int pinBase, char *params) ;
70
+ } ;
71
+
72
+
73
+ /*
74
+ * extractInt:
75
+ * Check & return an integer at the given location (prefixed by a :)
76
+ *********************************************************************************
77
+ */
78
+
79
+ static char *extractInt (char *progName, char *p, int *num)
80
+ {
81
+ if (*p != ':')
82
+ {
83
+ fprintf (stderr, "%s: colon expected\n", progName) ;
84
+ return NULL ;
85
+ }
86
+
87
+ ++p ;
88
+
89
+ if (!isdigit (*p))
90
+ {
91
+ fprintf (stderr, "%s: digit expected\n", progName) ;
92
+ return NULL ;
93
+ }
94
+
95
+ *num = strtol (p, NULL, 0) ;
96
+ while (isdigit (*p))
97
+ ++p ;
98
+
99
+ return p ;
100
+ }
101
+
102
+
103
+ /*
104
+ * extractStr:
105
+ * Check & return a string at the given location (prefixed by a :)
106
+ *********************************************************************************
107
+ */
108
+
109
+ static char *extractStr (char *progName, char *p, char **str)
110
+ {
111
+ char *q, *r ;
112
+
113
+ if (*p != ':')
114
+ {
115
+ fprintf (stderr, "%s: colon expected\n", progName) ;
116
+ return NULL ;
117
+ }
118
+
119
+ ++p ;
120
+
121
+ if (!isprint (*p))
122
+ {
123
+ fprintf (stderr, "%s: character expected\n", progName) ;
124
+ return NULL ;
125
+ }
126
+
127
+ q = p ;
128
+ while ((*q != 0) && (*q != ':'))
129
+ ++q ;
130
+
131
+ *str = r = calloc (q - p + 2, 1) ; // Zeros it
132
+
133
+ while (p != q)
134
+ *r++ = *p++ ;
135
+
136
+ return p ;
137
+ }
138
+
139
+
140
+
141
+ /*
142
+ * doExtensionMcp23008:
143
+ * MCP23008 - 8-bit I2C GPIO expansion chip
144
+ * mcp23002:base:i2cAddr
145
+ *********************************************************************************
146
+ */
147
+
148
+ static int doExtensionMcp23008 (char *progName, int pinBase, char *params)
149
+ {
150
+ int i2c ;
151
+
152
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
153
+ return FALSE ;
154
+
155
+ if ((i2c < 0x03) || (i2c > 0x77))
156
+ {
157
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
158
+ return FALSE ;
159
+ }
160
+
161
+ mcp23008Setup (pinBase, i2c) ;
162
+
163
+ return TRUE ;
164
+ }
165
+
166
+
167
+ /*
168
+ * doExtensionMcp23016:
169
+ * MCP230016- 16-bit I2C GPIO expansion chip
170
+ * mcp23016:base:i2cAddr
171
+ *********************************************************************************
172
+ */
173
+
174
+ static int doExtensionMcp23016 (char *progName, int pinBase, char *params)
175
+ {
176
+ int i2c ;
177
+
178
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
179
+ return FALSE ;
180
+
181
+ if ((i2c < 0x03) || (i2c > 0x77))
182
+ {
183
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
184
+ return FALSE ;
185
+ }
186
+
187
+ mcp23016Setup (pinBase, i2c) ;
188
+
189
+ return TRUE ;
190
+ }
191
+
192
+
193
+ /*
194
+ * doExtensionMcp23017:
195
+ * MCP230017- 16-bit I2C GPIO expansion chip
196
+ * mcp23017:base:i2cAddr
197
+ *********************************************************************************
198
+ */
199
+
200
+ static int doExtensionMcp23017 (char *progName, int pinBase, char *params)
201
+ {
202
+ int i2c ;
203
+
204
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
205
+ return FALSE ;
206
+
207
+ if ((i2c < 0x03) || (i2c > 0x77))
208
+ {
209
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
210
+ return FALSE ;
211
+ }
212
+
213
+ mcp23017Setup (pinBase, i2c) ;
214
+
215
+ return TRUE ;
216
+ }
217
+
218
+
219
+ /*
220
+ * doExtensionMcp23s08:
221
+ * MCP23s08 - 8-bit SPI GPIO expansion chip
222
+ * mcp23s08:base:spi:port
223
+ *********************************************************************************
224
+ */
225
+
226
+ static int doExtensionMcp23s08 (char *progName, int pinBase, char *params)
227
+ {
228
+ int spi, port ;
229
+
230
+ if ((params = extractInt (progName, params, &spi)) == NULL)
231
+ return FALSE ;
232
+
233
+ if ((spi < 0) || (spi > 1))
234
+ {
235
+ fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
236
+ return FALSE ;
237
+ }
238
+
239
+ if ((params = extractInt (progName, params, &port)) == NULL)
240
+ return FALSE ;
241
+
242
+ if ((port < 0) || (port > 7))
243
+ {
244
+ fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
245
+ return FALSE ;
246
+ }
247
+
248
+ mcp23s08Setup (pinBase, spi, port) ;
249
+
250
+ return TRUE ;
251
+ }
252
+
253
+
254
+ /*
255
+ * doExtensionMcp23s17:
256
+ * MCP23s17 - 16-bit SPI GPIO expansion chip
257
+ * mcp23s17:base:spi:port
258
+ *********************************************************************************
259
+ */
260
+
261
+ static int doExtensionMcp23s17 (char *progName, int pinBase, char *params)
262
+ {
263
+ int spi, port ;
264
+
265
+ if ((params = extractInt (progName, params, &spi)) == NULL)
266
+ return FALSE ;
267
+
268
+ if ((spi < 0) || (spi > 1))
269
+ {
270
+ fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
271
+ return FALSE ;
272
+ }
273
+
274
+ if ((params = extractInt (progName, params, &port)) == NULL)
275
+ return FALSE ;
276
+
277
+ if ((port < 0) || (port > 7))
278
+ {
279
+ fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
280
+ return FALSE ;
281
+ }
282
+
283
+ mcp23s17Setup (pinBase, spi, port) ;
284
+
285
+ return TRUE ;
286
+ }
287
+
288
+
289
+ /*
290
+ * doExtensionSr595:
291
+ * Shift Register 74x595
292
+ * sr595:base:pins:data:clock:latch
293
+ *********************************************************************************
294
+ */
295
+
296
+ static int doExtensionSr595 (char *progName, int pinBase, char *params)
297
+ {
298
+ int pins, data, clock, latch ;
299
+
300
+ // Extract pins
301
+
302
+ if ((params = extractInt (progName, params, &pins)) == NULL)
303
+ return FALSE ;
304
+
305
+ if ((pins < 8) || (pins > 32))
306
+ {
307
+ fprintf (stderr, "%s: pin count (%d) out of range - 8-32 expected.\n", progName, pins) ;
308
+ return FALSE ;
309
+ }
310
+
311
+ if ((params = extractInt (progName, params, &data)) == NULL)
312
+ return FALSE ;
313
+
314
+ if ((params = extractInt (progName, params, &clock)) == NULL)
315
+ return FALSE ;
316
+
317
+ if ((params = extractInt (progName, params, &latch)) == NULL)
318
+ return FALSE ;
319
+
320
+ sr595Setup (pinBase, pins, data, clock, latch) ;
321
+
322
+ return TRUE ;
323
+ }
324
+
325
+
326
+ /*
327
+ * doExtensionPcf8574:
328
+ * Digital IO (Crude!)
329
+ * pcf8574:base:i2cAddr
330
+ *********************************************************************************
331
+ */
332
+
333
+ static int doExtensionPcf8574 (char *progName, int pinBase, char *params)
334
+ {
335
+ int i2c ;
336
+
337
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
338
+ return FALSE ;
339
+
340
+ if ((i2c < 0x03) || (i2c > 0x77))
341
+ {
342
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
343
+ return FALSE ;
344
+ }
345
+
346
+ pcf8574Setup (pinBase, i2c) ;
347
+
348
+ return TRUE ;
349
+ }
350
+
351
+
352
+ /*
353
+ * doExtensionPcf8591:
354
+ * Analog IO
355
+ * pcf8591:base:i2cAddr
356
+ *********************************************************************************
357
+ */
358
+
359
+ static int doExtensionPcf8591 (char *progName, int pinBase, char *params)
360
+ {
361
+ int i2c ;
362
+
363
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
364
+ return FALSE ;
365
+
366
+ if ((i2c < 0x03) || (i2c > 0x77))
367
+ {
368
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
369
+ return FALSE ;
370
+ }
371
+
372
+ pcf8591Setup (pinBase, i2c) ;
373
+
374
+ return TRUE ;
375
+ }
376
+
377
+
378
+ /*
379
+ * doExtensionMax31855:
380
+ * Analog IO
381
+ * max31855:base:spiChan
382
+ *********************************************************************************
383
+ */
384
+
385
+ static int doExtensionMax31855 (char *progName, int pinBase, char *params)
386
+ {
387
+ int spi ;
388
+
389
+ if ((params = extractInt (progName, params, &spi)) == NULL)
390
+ return FALSE ;
391
+
392
+ if ((spi < 0) || (spi > 1))
393
+ {
394
+ fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
395
+ return FALSE ;
396
+ }
397
+
398
+ max31855Setup (pinBase, spi) ;
399
+
400
+ return TRUE ;
401
+ }
402
+
403
+
404
+ /*
405
+ * doExtensionMcp3002:
406
+ * Analog IO
407
+ * mcp3002:base:spiChan
408
+ *********************************************************************************
409
+ */
410
+
411
+ static int doExtensionMcp3002 (char *progName, int pinBase, char *params)
412
+ {
413
+ int spi ;
414
+
415
+ if ((params = extractInt (progName, params, &spi)) == NULL)
416
+ return FALSE ;
417
+
418
+ if ((spi < 0) || (spi > 1))
419
+ {
420
+ fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
421
+ return FALSE ;
422
+ }
423
+
424
+ mcp3002Setup (pinBase, spi) ;
425
+
426
+ return TRUE ;
427
+ }
428
+
429
+
430
+ /*
431
+ * doExtensionMcp3004:
432
+ * Analog IO
433
+ * mcp3004:base:spiChan
434
+ *********************************************************************************
435
+ */
436
+
437
+ static int doExtensionMcp3004 (char *progName, int pinBase, char *params)
438
+ {
439
+ int spi ;
440
+
441
+ if ((params = extractInt (progName, params, &spi)) == NULL)
442
+ return FALSE ;
443
+
444
+ if ((spi < 0) || (spi > 1))
445
+ {
446
+ fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
447
+ return FALSE ;
448
+ }
449
+
450
+ mcp3004Setup (pinBase, spi) ;
451
+
452
+ return TRUE ;
453
+ }
454
+
455
+
456
+ /*
457
+ * doExtensionMax5322:
458
+ * Analog O
459
+ * max5322:base:spiChan
460
+ *********************************************************************************
461
+ */
462
+
463
+ static int doExtensionMax5322 (char *progName, int pinBase, char *params)
464
+ {
465
+ int spi ;
466
+
467
+ if ((params = extractInt (progName, params, &spi)) == NULL)
468
+ return FALSE ;
469
+
470
+ if ((spi < 0) || (spi > 1))
471
+ {
472
+ fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
473
+ return FALSE ;
474
+ }
475
+
476
+ max5322Setup (pinBase, spi) ;
477
+
478
+ return TRUE ;
479
+ }
480
+
481
+
482
+ /*
483
+ * doExtensionMcp4802:
484
+ * Analog IO
485
+ * mcp4802:base:spiChan
486
+ *********************************************************************************
487
+ */
488
+
489
+ static int doExtensionMcp4802 (char *progName, int pinBase, char *params)
490
+ {
491
+ int spi ;
492
+
493
+ if ((params = extractInt (progName, params, &spi)) == NULL)
494
+ return FALSE ;
495
+
496
+ if ((spi < 0) || (spi > 1))
497
+ {
498
+ fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
499
+ return FALSE ;
500
+ }
501
+
502
+ mcp4802Setup (pinBase, spi) ;
503
+
504
+ return TRUE ;
505
+ }
506
+
507
+
508
+ /*
509
+ * doExtensionSn3218:
510
+ * Analog Output (LED Driver)
511
+ * sn3218:base
512
+ *********************************************************************************
513
+ */
514
+
515
+ static int doExtensionSn3218 (char *progName, int pinBase, char *params)
516
+ {
517
+ sn3218Setup (pinBase) ;
518
+ return TRUE ;
519
+ }
520
+
521
+
522
+ /*
523
+ * doExtensionMcp3422:
524
+ * Analog IO
525
+ * mcp3422:base:i2cAddr
526
+ *********************************************************************************
527
+ */
528
+
529
+ static int doExtensionMcp3422 (char *progName, int pinBase, char *params)
530
+ {
531
+ int i2c, sampleRate, gain ;
532
+
533
+ if ((params = extractInt (progName, params, &i2c)) == NULL)
534
+ return FALSE ;
535
+
536
+ if ((i2c < 0x03) || (i2c > 0x77))
537
+ {
538
+ fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
539
+ return FALSE ;
540
+ }
541
+
542
+ if ((params = extractInt (progName, params, &sampleRate)) == NULL)
543
+ return FALSE ;
544
+
545
+ if ((sampleRate < 0) || (sampleRate > 3))
546
+ {
547
+ fprintf (stderr, "%s: sample rate (%d) out of range\n", progName, sampleRate) ;
548
+ return FALSE ;
549
+ }
550
+
551
+ if ((params = extractInt (progName, params, &gain)) == NULL)
552
+ return FALSE ;
553
+
554
+ if ((gain < 0) || (gain > 3))
555
+ {
556
+ fprintf (stderr, "%s: gain (%d) out of range\n", progName, gain) ;
557
+ return FALSE ;
558
+ }
559
+
560
+ mcp3422Setup (pinBase, i2c, sampleRate, gain) ;
561
+
562
+ return TRUE ;
563
+ }
564
+
565
+ /*
566
+ * doExtensionDrcS:
567
+ * Interface to a DRC Serial system
568
+ * drcs:base:pins:serialPort:baud
569
+ *********************************************************************************
570
+ */
571
+
572
+ static int doExtensionDrcS (char *progName, int pinBase, char *params)
573
+ {
574
+ char *port ;
575
+ int pins, baud ;
576
+
577
+ if ((params = extractInt (progName, params, &pins)) == NULL)
578
+ return FALSE ;
579
+
580
+ if ((pins < 1) || (pins > 100))
581
+ {
582
+ fprintf (stderr, "%s: pins (%d) out of range (2-100)\n", progName, pins) ;
583
+ return FALSE ;
584
+ }
585
+
586
+ if ((params = extractStr (progName, params, &port)) == NULL)
587
+ return FALSE ;
588
+
589
+ if (strlen (port) == 0)
590
+ {
591
+ fprintf (stderr, "%s: serial port device name required\n", progName) ;
592
+ return FALSE ;
593
+ }
594
+
595
+ if ((params = extractInt (progName, params, &baud)) == NULL)
596
+ return FALSE ;
597
+
598
+ if ((baud < 1) || (baud > 4000000))
599
+ {
600
+ fprintf (stderr, "%s: baud rate (%d) out of range\n", progName, baud) ;
601
+ return FALSE ;
602
+ }
603
+
604
+ drcSetupSerial (pinBase, pins, port, baud) ;
605
+
606
+ return TRUE ;
607
+ }
608
+
609
+
610
+
611
+ /*
612
+ * Function list
613
+ *********************************************************************************
614
+ */
615
+
616
+ struct extensionFunctionStruct extensionFunctions [] =
617
+ {
618
+ { "mcp23008", &doExtensionMcp23008 },
619
+ { "mcp23016", &doExtensionMcp23016 },
620
+ { "mcp23017", &doExtensionMcp23017 },
621
+ { "mcp23s08", &doExtensionMcp23s08 },
622
+ { "mcp23s17", &doExtensionMcp23s17 },
623
+ { "sr595", &doExtensionSr595 },
624
+ { "pcf8574", &doExtensionPcf8574 },
625
+ { "pcf8591", &doExtensionPcf8591 },
626
+ { "mcp3002", &doExtensionMcp3002 },
627
+ { "mcp3004", &doExtensionMcp3004 },
628
+ { "mcp4802", &doExtensionMcp4802 },
629
+ { "mcp3422", &doExtensionMcp3422 },
630
+ { "max31855", &doExtensionMax31855 },
631
+ { "max5322", &doExtensionMax5322 },
632
+ { "sn3218", &doExtensionSn3218 },
633
+ { "drcs", &doExtensionDrcS },
634
+ { NULL, NULL },
635
+ } ;
636
+
637
+
638
+ /*
639
+ * doExtension:
640
+ * Load in a wiringPi extension
641
+ *********************************************************************************
642
+ */
643
+
644
+ int doExtension (char *progName, char *extensionData)
645
+ {
646
+ char *p ;
647
+ char *extension = extensionData ;
648
+ struct extensionFunctionStruct *extensionFn ;
649
+ int pinBase = 0 ;
650
+
651
+ // Get the extension extension name by finding the first colon
652
+
653
+ p = extension ;
654
+ while (*p != ':')
655
+ {
656
+ if (!*p) // ran out of characters
657
+ {
658
+ fprintf (stderr, "%s: extension name not terminated by a colon\n", progName) ;
659
+ return FALSE ;
660
+ }
661
+ ++p ;
662
+ }
663
+
664
+ *p++ = 0 ;
665
+
666
+ if (!isdigit (*p))
667
+ {
668
+ fprintf (stderr, "%s: pinBase number expected after extension name\n", progName) ;
669
+ return FALSE ;
670
+ }
671
+
672
+ while (isdigit (*p))
673
+ {
674
+ if (pinBase > 1000000000)
675
+ {
676
+ fprintf (stderr, "%s: pinBase too large\n", progName) ;
677
+ return FALSE ;
678
+ }
679
+
680
+ pinBase = pinBase * 10 + (*p - '0') ;
681
+ ++p ;
682
+ }
683
+
684
+ if (pinBase < 64)
685
+ {
686
+ fprintf (stderr, "%s: pinBase (%d) too small. Minimum is 64.\n", progName, pinBase) ;
687
+ return FALSE ;
688
+ }
689
+
690
+ // Search for extensions:
691
+
692
+ for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn)
693
+ {
694
+ if (strcmp (extensionFn->name, extension) == 0)
695
+ return extensionFn->function (progName, pinBase, p) ;
696
+ }
697
+
698
+ fprintf (stderr, "%s: extension %s not found\n", progName, extension) ;
699
+ return FALSE ;
700
+ }