From ea8f23253b76302060e06e7f0cd986692cedaf6d Mon Sep 17 00:00:00 2001 From: Franz Bethke <bethke@math.hu-berlin.de> Date: Fri, 20 Apr 2018 18:32:14 +0200 Subject: [PATCH] Add Lib for USS-Usage --- modules/catkin_ws/src/wiringPi/COPYING.LESSER | 165 + modules/catkin_ws/src/wiringPi/INSTALL | 36 + modules/catkin_ws/src/wiringPi/Makefile | 22 + modules/catkin_ws/src/wiringPi/People | 33 + modules/catkin_ws/src/wiringPi/README.TXT | 26 + modules/catkin_ws/src/wiringPi/build | 103 + .../catkin_ws/src/wiringPi/devLib/Makefile | 134 + .../catkin_ws/src/wiringPi/devLib/ds1302.c | 240 ++ .../catkin_ws/src/wiringPi/devLib/ds1302.h | 44 + .../catkin_ws/src/wiringPi/devLib/ds1302.o | Bin 0 -> 5088 bytes modules/catkin_ws/src/wiringPi/devLib/font.h | 2577 ++++++++++++++ .../catkin_ws/src/wiringPi/devLib/gertboard.c | 164 + .../catkin_ws/src/wiringPi/devLib/gertboard.h | 45 + .../catkin_ws/src/wiringPi/devLib/gertboard.o | Bin 0 -> 2696 bytes modules/catkin_ws/src/wiringPi/devLib/lcd.c | 495 +++ modules/catkin_ws/src/wiringPi/devLib/lcd.h | 52 + modules/catkin_ws/src/wiringPi/devLib/lcd.o | Bin 0 -> 7240 bytes .../catkin_ws/src/wiringPi/devLib/lcd128x64.c | 673 ++++ .../catkin_ws/src/wiringPi/devLib/lcd128x64.h | 39 + .../catkin_ws/src/wiringPi/devLib/lcd128x64.o | Bin 0 -> 11472 bytes .../src/wiringPi/devLib/libwiringPiDev.so.2.0 | Bin 0 -> 31136 bytes .../catkin_ws/src/wiringPi/devLib/maxdetect.c | 165 + .../catkin_ws/src/wiringPi/devLib/maxdetect.h | 40 + .../catkin_ws/src/wiringPi/devLib/maxdetect.o | Bin 0 -> 3312 bytes .../catkin_ws/src/wiringPi/devLib/piFace.c | 112 + .../catkin_ws/src/wiringPi/devLib/piFace.h | 32 + .../catkin_ws/src/wiringPi/devLib/piFace.o | Bin 0 -> 2376 bytes .../catkin_ws/src/wiringPi/devLib/piGlow.c | 118 + .../catkin_ws/src/wiringPi/devLib/piGlow.h | 45 + .../catkin_ws/src/wiringPi/devLib/piGlow.o | Bin 0 -> 2768 bytes modules/catkin_ws/src/wiringPi/devLib/piNes.c | 113 + modules/catkin_ws/src/wiringPi/devLib/piNes.h | 45 + modules/catkin_ws/src/wiringPi/devLib/piNes.o | Bin 0 -> 2592 bytes .../src/wiringPi/examples/COPYING.LESSER | 165 + .../wiringPi/examples/Gertboard/7segments.c | 221 ++ .../src/wiringPi/examples/Gertboard/Makefile | 74 + .../src/wiringPi/examples/Gertboard/buttons.c | 83 + .../wiringPi/examples/Gertboard/gertboard.c | 96 + .../src/wiringPi/examples/Gertboard/record.c | 60 + .../wiringPi/examples/Gertboard/temperature.c | 78 + .../wiringPi/examples/Gertboard/voltmeter.c | 73 + .../src/wiringPi/examples/Gertboard/vumeter.c | 152 + .../catkin_ws/src/wiringPi/examples/Makefile | 168 + .../src/wiringPi/examples/PiFace/Makefile | 85 + .../src/wiringPi/examples/PiFace/blink.c | 59 + .../src/wiringPi/examples/PiFace/buttons.c | 103 + .../src/wiringPi/examples/PiFace/ladder.c | 337 ++ .../src/wiringPi/examples/PiFace/metro.c | 111 + .../src/wiringPi/examples/PiFace/motor.c | 120 + .../src/wiringPi/examples/PiFace/reaction.c | 194 + .../src/wiringPi/examples/PiGlow/Makefile | 79 + .../src/wiringPi/examples/PiGlow/piGlow0.c | 51 + .../src/wiringPi/examples/PiGlow/piGlow1.c | 258 ++ .../src/wiringPi/examples/PiGlow/piglow.c | 176 + .../src/wiringPi/examples/README.TXT | 18 + .../catkin_ws/src/wiringPi/examples/blink.c | 48 + .../catkin_ws/src/wiringPi/examples/blink.rtb | 30 + .../catkin_ws/src/wiringPi/examples/blink.sh | 37 + .../catkin_ws/src/wiringPi/examples/blink12.c | 111 + .../src/wiringPi/examples/blink12drcs.c | 125 + .../src/wiringPi/examples/blink6drcs.c | 115 + .../catkin_ws/src/wiringPi/examples/blink8.c | 57 + .../catkin_ws/src/wiringPi/examples/clock.c | 201 ++ .../src/wiringPi/examples/delayTest.c | 107 + .../catkin_ws/src/wiringPi/examples/ds1302.c | 238 ++ .../catkin_ws/src/wiringPi/examples/header.h | 23 + .../catkin_ws/src/wiringPi/examples/isr-osc.c | 118 + modules/catkin_ws/src/wiringPi/examples/isr.c | 110 + .../src/wiringPi/examples/lcd-adafruit.c | 347 ++ modules/catkin_ws/src/wiringPi/examples/lcd.c | 286 ++ .../src/wiringPi/examples/lowPower.c | 68 + modules/catkin_ws/src/wiringPi/examples/nes.c | 67 + .../catkin_ws/src/wiringPi/examples/okLed.c | 82 + modules/catkin_ws/src/wiringPi/examples/pwm.c | 58 + .../src/wiringPi/examples/q2w/Makefile | 81 + .../src/wiringPi/examples/q2w/binary.c | 79 + .../src/wiringPi/examples/q2w/blink-io.c | 61 + .../src/wiringPi/examples/q2w/blink.c | 50 + .../src/wiringPi/examples/q2w/blink.sh | 37 + .../src/wiringPi/examples/q2w/bright.c | 59 + .../src/wiringPi/examples/q2w/button.c | 63 + .../src/wiringPi/examples/q2w/volts.c | 62 + .../catkin_ws/src/wiringPi/examples/rht03.c | 69 + .../src/wiringPi/examples/serialRead.c | 48 + .../src/wiringPi/examples/serialTest.c | 75 + .../catkin_ws/src/wiringPi/examples/servo.c | 57 + .../catkin_ws/src/wiringPi/examples/softPwm.c | 89 + .../src/wiringPi/examples/softTone.c | 54 + .../catkin_ws/src/wiringPi/examples/speed.c | 95 + .../src/wiringPi/examples/spiSpeed.c | 118 + modules/catkin_ws/src/wiringPi/examples/wfi.c | 161 + .../src/wiringPi/gpio/COPYING.LESSER | 165 + modules/catkin_ws/src/wiringPi/gpio/Makefile | 87 + .../catkin_ws/src/wiringPi/gpio/extensions.c | 700 ++++ .../catkin_ws/src/wiringPi/gpio/extensions.h | 26 + .../catkin_ws/src/wiringPi/gpio/extensions.o | Bin 0 -> 12920 bytes modules/catkin_ws/src/wiringPi/gpio/gpio | Bin 0 -> 51680 bytes modules/catkin_ws/src/wiringPi/gpio/gpio.1 | 371 ++ modules/catkin_ws/src/wiringPi/gpio/gpio.c | 1477 ++++++++ modules/catkin_ws/src/wiringPi/gpio/gpio.o | Bin 0 -> 40688 bytes modules/catkin_ws/src/wiringPi/gpio/pins.c | 33 + modules/catkin_ws/src/wiringPi/gpio/pins.o | Bin 0 -> 1936 bytes modules/catkin_ws/src/wiringPi/gpio/pintest | 193 + modules/catkin_ws/src/wiringPi/gpio/readall.c | 629 ++++ modules/catkin_ws/src/wiringPi/gpio/readall.o | Bin 0 -> 23736 bytes modules/catkin_ws/src/wiringPi/gpio/test.sh | 44 + modules/catkin_ws/src/wiringPi/pins/Makefile | 18 + modules/catkin_ws/src/wiringPi/pins/pins.pdf | Bin 0 -> 9833 bytes modules/catkin_ws/src/wiringPi/pins/pins.tex | 116 + .../catkin_ws/src/wiringPi/postinstall-pak | 7 + .../src/wiringPi/wiringPi/COPYING.LESSER | 165 + .../catkin_ws/src/wiringPi/wiringPi/Makefile | 193 + .../src/wiringPi/wiringPi/drcSerial.c | 201 ++ .../src/wiringPi/wiringPi/drcSerial.h | 33 + .../src/wiringPi/wiringPi/drcSerial.o | Bin 0 -> 4480 bytes .../src/wiringPi/wiringPi/libwiringPi.so.2.0 | Bin 0 -> 72448 bytes .../src/wiringPi/wiringPi/max31855.c | 81 + .../src/wiringPi/wiringPi/max31855.h | 33 + .../src/wiringPi/wiringPi/max31855.o | Bin 0 -> 2016 bytes .../catkin_ws/src/wiringPi/wiringPi/max5322.c | 84 + .../catkin_ws/src/wiringPi/wiringPi/max5322.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/max5322.o | Bin 0 -> 2088 bytes .../src/wiringPi/wiringPi/mcp23008.c | 149 + .../src/wiringPi/wiringPi/mcp23008.h | 33 + .../src/wiringPi/wiringPi/mcp23008.o | Bin 0 -> 2744 bytes .../src/wiringPi/wiringPi/mcp23016.c | 164 + .../src/wiringPi/wiringPi/mcp23016.h | 33 + .../src/wiringPi/wiringPi/mcp23016.o | Bin 0 -> 2656 bytes .../src/wiringPi/wiringPi/mcp23016reg.h | 48 + .../src/wiringPi/wiringPi/mcp23017.c | 195 + .../src/wiringPi/wiringPi/mcp23017.h | 33 + .../src/wiringPi/wiringPi/mcp23017.o | Bin 0 -> 2928 bytes .../src/wiringPi/wiringPi/mcp23s08.c | 189 + .../src/wiringPi/wiringPi/mcp23s08.h | 33 + .../src/wiringPi/wiringPi/mcp23s08.o | Bin 0 -> 3360 bytes .../src/wiringPi/wiringPi/mcp23s17.c | 236 ++ .../src/wiringPi/wiringPi/mcp23s17.h | 33 + .../src/wiringPi/wiringPi/mcp23s17.o | Bin 0 -> 3656 bytes .../src/wiringPi/wiringPi/mcp23x08.h | 73 + .../src/wiringPi/wiringPi/mcp23x0817.h | 87 + .../catkin_ws/src/wiringPi/wiringPi/mcp3002.c | 76 + .../catkin_ws/src/wiringPi/wiringPi/mcp3002.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/mcp3002.o | Bin 0 -> 1992 bytes .../catkin_ws/src/wiringPi/wiringPi/mcp3004.c | 76 + .../catkin_ws/src/wiringPi/wiringPi/mcp3004.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/mcp3004.o | Bin 0 -> 1992 bytes .../catkin_ws/src/wiringPi/wiringPi/mcp3422.c | 110 + .../catkin_ws/src/wiringPi/wiringPi/mcp3422.h | 43 + .../catkin_ws/src/wiringPi/wiringPi/mcp3422.o | Bin 0 -> 2472 bytes .../catkin_ws/src/wiringPi/wiringPi/mcp4802.c | 76 + .../catkin_ws/src/wiringPi/wiringPi/mcp4802.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/mcp4802.o | Bin 0 -> 1992 bytes .../catkin_ws/src/wiringPi/wiringPi/pcf8574.c | 126 + .../catkin_ws/src/wiringPi/wiringPi/pcf8574.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/pcf8574.o | Bin 0 -> 2344 bytes .../catkin_ws/src/wiringPi/wiringPi/pcf8591.c | 90 + .../catkin_ws/src/wiringPi/wiringPi/pcf8591.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/pcf8591.o | Bin 0 -> 2240 bytes .../catkin_ws/src/wiringPi/wiringPi/piHiPri.c | 51 + .../catkin_ws/src/wiringPi/wiringPi/piHiPri.o | Bin 0 -> 1792 bytes .../src/wiringPi/wiringPi/piThread.c | 63 + .../src/wiringPi/wiringPi/piThread.o | Bin 0 -> 2080 bytes .../catkin_ws/src/wiringPi/wiringPi/sn3218.c | 75 + .../catkin_ws/src/wiringPi/wiringPi/sn3218.h | 33 + .../catkin_ws/src/wiringPi/wiringPi/sn3218.o | Bin 0 -> 2080 bytes .../catkin_ws/src/wiringPi/wiringPi/softPwm.c | 167 + .../catkin_ws/src/wiringPi/wiringPi/softPwm.h | 35 + .../catkin_ws/src/wiringPi/wiringPi/softPwm.o | Bin 0 -> 3704 bytes .../src/wiringPi/wiringPi/softServo.c | 211 ++ .../src/wiringPi/wiringPi/softServo.h | 35 + .../src/wiringPi/wiringPi/softTone.c | 150 + .../src/wiringPi/wiringPi/softTone.h | 39 + .../src/wiringPi/wiringPi/softTone.o | Bin 0 -> 3496 bytes .../catkin_ws/src/wiringPi/wiringPi/sr595.c | 109 + .../catkin_ws/src/wiringPi/wiringPi/sr595.h | 34 + .../catkin_ws/src/wiringPi/wiringPi/sr595.o | Bin 0 -> 2456 bytes .../src/wiringPi/wiringPi/wiringPi.c | 3152 +++++++++++++++++ .../src/wiringPi/wiringPi/wiringPi.h | 229 ++ .../src/wiringPi/wiringPi/wiringPi.o | Bin 0 -> 53744 bytes .../src/wiringPi/wiringPi/wiringPiI2C.c | 240 ++ .../src/wiringPi/wiringPi/wiringPiI2C.h | 42 + .../src/wiringPi/wiringPi/wiringPiI2C.o | Bin 0 -> 4520 bytes .../src/wiringPi/wiringPi/wiringPiSPI.c | 144 + .../src/wiringPi/wiringPi/wiringPiSPI.h | 35 + .../src/wiringPi/wiringPi/wiringPiSPI.o | Bin 0 -> 4616 bytes .../src/wiringPi/wiringPi/wiringSerial.c | 213 ++ .../src/wiringPi/wiringPi/wiringSerial.h | 38 + .../src/wiringPi/wiringPi/wiringSerial.o | Bin 0 -> 4504 bytes .../src/wiringPi/wiringPi/wiringShift.c | 83 + .../src/wiringPi/wiringPi/wiringShift.h | 41 + .../src/wiringPi/wiringPi/wiringShift.o | Bin 0 -> 2336 bytes 191 files changed, 23741 insertions(+) create mode 100644 modules/catkin_ws/src/wiringPi/COPYING.LESSER create mode 100644 modules/catkin_ws/src/wiringPi/INSTALL create mode 100644 modules/catkin_ws/src/wiringPi/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/People create mode 100644 modules/catkin_ws/src/wiringPi/README.TXT create mode 100755 modules/catkin_ws/src/wiringPi/build create mode 100644 modules/catkin_ws/src/wiringPi/devLib/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/devLib/ds1302.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/ds1302.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/ds1302.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/font.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/gertboard.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/gertboard.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/gertboard.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o create mode 100755 modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0 create mode 100755 modules/catkin_ws/src/wiringPi/devLib/maxdetect.c create mode 100755 modules/catkin_ws/src/wiringPi/devLib/maxdetect.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/maxdetect.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piFace.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piFace.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piFace.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piGlow.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piGlow.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piGlow.o create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piNes.c create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piNes.h create mode 100644 modules/catkin_ws/src/wiringPi/devLib/piNes.o create mode 100644 modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c create mode 100755 modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/README.TXT create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink.rtb create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink.sh create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink12.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink12drcs.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink6drcs.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/blink8.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/clock.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/delayTest.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/ds1302.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/header.h create mode 100644 modules/catkin_ws/src/wiringPi/examples/isr-osc.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/isr.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/lcd.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/lowPower.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/nes.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/okLed.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/pwm.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/binary.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/blink.c create mode 100755 modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/bright.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/button.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/q2w/volts.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/rht03.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/serialRead.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/serialTest.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/servo.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/softPwm.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/softTone.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/speed.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/spiSpeed.c create mode 100644 modules/catkin_ws/src/wiringPi/examples/wfi.c create mode 100644 modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER create mode 100644 modules/catkin_ws/src/wiringPi/gpio/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/gpio/extensions.c create mode 100644 modules/catkin_ws/src/wiringPi/gpio/extensions.h create mode 100644 modules/catkin_ws/src/wiringPi/gpio/extensions.o create mode 100755 modules/catkin_ws/src/wiringPi/gpio/gpio create mode 100644 modules/catkin_ws/src/wiringPi/gpio/gpio.1 create mode 100755 modules/catkin_ws/src/wiringPi/gpio/gpio.c create mode 100644 modules/catkin_ws/src/wiringPi/gpio/gpio.o create mode 100644 modules/catkin_ws/src/wiringPi/gpio/pins.c create mode 100644 modules/catkin_ws/src/wiringPi/gpio/pins.o create mode 100755 modules/catkin_ws/src/wiringPi/gpio/pintest create mode 100755 modules/catkin_ws/src/wiringPi/gpio/readall.c create mode 100644 modules/catkin_ws/src/wiringPi/gpio/readall.o create mode 100755 modules/catkin_ws/src/wiringPi/gpio/test.sh create mode 100644 modules/catkin_ws/src/wiringPi/pins/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/pins/pins.pdf create mode 100644 modules/catkin_ws/src/wiringPi/pins/pins.tex create mode 100644 modules/catkin_ws/src/wiringPi/postinstall-pak create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/Makefile create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o create mode 100755 modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0 create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max31855.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max31855.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max31855.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max5322.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max5322.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/max5322.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/piThread.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/piThread.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softServo.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softServo.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softTone.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softTone.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/softTone.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sr595.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sr595.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/sr595.o create mode 100755 modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c create mode 100755 modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o create mode 100755 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o create mode 100755 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h create mode 100644 modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o diff --git a/modules/catkin_ws/src/wiringPi/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/COPYING.LESSER new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/modules/catkin_ws/src/wiringPi/INSTALL b/modules/catkin_ws/src/wiringPi/INSTALL new file mode 100644 index 00000000..8e0c43cf --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/INSTALL @@ -0,0 +1,36 @@ + +How to install wiringPi +======================= + +The easiest way is to use the supplied 'build' script: + + ./build + +that should do a complete install or upgrade of wiringPi for you. + +That will install a dynamic library. + +Some distributions do not have /usr/local/lib in the default LD_LIBRARY_PATH. To +fix this, you need to edit /etc/ld.so.conf and add in a single line: + + /usr/local/lib + +then run the ldconfig command. + + sudo ldconfig + +If you want to install a static library, you may need to do this manually: + + cd wiringPi + make static + sudo make install-static + + +To un-install wiringPi: + + ./build uninstall + +Gordon Henderson + +projects@drogon.net +https://projects.drogon.net/ diff --git a/modules/catkin_ws/src/wiringPi/Makefile b/modules/catkin_ws/src/wiringPi/Makefile new file mode 100644 index 00000000..a02d1a3b --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/Makefile @@ -0,0 +1,22 @@ +clean: + make -C wiringPi clean + make -C devLib clean + make -C gpio clean + make -C examples clean + make -C examples/Gertboard clean + make -C examples/PiFace clean + make -C examples/q2w clean + make -C examples/PiGlow clean + +install: + make -C wiringPi + make -C wiringPi install + make -C devLib + make -C devLib install + make -C gpio + make -C gpio install + mkdir -p /usr/share/wiringPi/examples/Gertboard + mkdir -p /usr/share/wiringPi/examples/PiFace + mkdir -p /usr/share/wiringPi/examples/PiGlow + mkdir -p /usr/share/wiringPi/examples/q2w + find examples -exec install -m 0644 -D -t /usr/share/wiringPi/examples {} \; diff --git a/modules/catkin_ws/src/wiringPi/People b/modules/catkin_ws/src/wiringPi/People new file mode 100644 index 00000000..b339494e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/People @@ -0,0 +1,33 @@ + +Just a quick note to some people who've provided help, suggestions, +bug-fixes, etc. along the way... + +Nick Lott: (And others) + Hints about making it work with C++ + +Philipp Stefan Neininger: + Minor bug in the Makefile to do with cross compiling + +Chris McSweeny + Hints and tips about the use of arithmetic in gettimeofday() + inside the dealyMicrosecondsHard() function. + And spotting a couple of schoolboy errors in the (experimental) + softServo code, prompting me to completely re-write it. + +Armin (Via projects website) + Some pointers about the i2c-dev.h files. + +Arno Wagner + Suggestions for the mmap calls in wiringPiSetup() + +CHARLES Thibaut: + A small issue in softTone + +Xian Stannard + Fixing some typos in the man page! + +Andre Crone + Suggested the __WIRING_PI.H__ round wiringPi.h + +Rik Teerling + Pointing out some silly mistooks in the I2C code... diff --git a/modules/catkin_ws/src/wiringPi/README.TXT b/modules/catkin_ws/src/wiringPi/README.TXT new file mode 100644 index 00000000..7789b2eb --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/README.TXT @@ -0,0 +1,26 @@ + +wiringPi README +=============== + +Please note that the official way to get wiringPi is via git from +git.drogon.net and not GitHub. + +ie. + + git clone git://git.drogon.net/wiringPi + +The version of wiringPi held on GitHub by "Gadgetoid" is used to build the +wiringPython, Ruby, Perl, etc. wrappers for these other languages. This +version may lag the official Drogon release. Pull requests may not be +accepted to Github.... + +Please see + + http://wiringpi.com/ + +for the official documentation, etc. and the best way to submit bug reports, etc. +is by sending an email to projects@drogon.net + +Thanks! + + -Gordon diff --git a/modules/catkin_ws/src/wiringPi/build b/modules/catkin_ws/src/wiringPi/build new file mode 100755 index 00000000..bac483a4 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/build @@ -0,0 +1,103 @@ +#!/bin/sh + +check_make_ok() { + if [ $? != 0 ]; then + echo "" + echo "Make Failed..." + echo "Please check the messages and fix any problems. If you're still stuck," + echo "then please email all the output and as many details as you can to" + echo " projects@drogon.net" + echo "" + exit 1 + fi +} + +if [ x$1 = "xclean" ]; then + cd wiringPi + echo -n "wiringPi: " ; make clean + cd ../devLib + echo -n "DevLib: " ; make clean + cd ../gpio + echo -n "gpio: " ; make clean + cd ../examples + echo -n "Examples: " ; make clean + cd Gertboard + echo -n "Gertboard: " ; make clean + cd ../PiFace + echo -n "PiFace: " ; make clean + cd ../q2w + echo -n "Quick2Wire: " ; make clean + cd ../PiGlow + echo -n "PiGlow: " ; make clean + exit +fi + +if [ x$1 = "xuninstall" ]; then + cd wiringPi + echo -n "wiringPi: " ; sudo make uninstall + cd ../devLib + echo -n "DevLib: " ; sudo make uninstall + cd ../gpio + echo -n "gpio: " ; sudo make uninstall + exit +fi + + + echo "wiringPi Build script" + echo "=====================" + echo + + echo + echo "WiringPi Library" + cd wiringPi + sudo make uninstall + if [ x$1 = "xstatic" ]; then + make static + check_make_ok + sudo make install-static + else + make + check_make_ok + sudo make install + fi + check_make_ok + + echo + echo "WiringPi Devices Library" + cd ../devLib + sudo make uninstall + if [ x$1 = "xstatic" ]; then + make static + check_make_ok + sudo make install-static + else + make + check_make_ok + sudo make install + fi + check_make_ok + + echo + echo "GPIO Utility" + cd ../gpio + make + check_make_ok + sudo make install + check_make_ok + +# echo +# echo "Examples" +# cd ../examples +# make +# cd .. + +echo +echo All Done. +echo "" +echo "NOTE: To compile programs with wiringPi, you need to add:" +echo " -lwiringPi" +echo " to your compile line(s) To use the Gertboard, MaxDetect, etc." +echo " code (the devLib), you need to also add:" +echo " -lwiringPiDev" +echo " to your compile line(s)." +echo "" diff --git a/modules/catkin_ws/src/wiringPi/devLib/Makefile b/modules/catkin_ws/src/wiringPi/devLib/Makefile new file mode 100644 index 00000000..4ba17746 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/Makefile @@ -0,0 +1,134 @@ +# Makefile: +# wiringPi device - Wiring Compatable library for the Raspberry Pi +# +# Copyright (c) 2012-2013 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# https://projects.drogon.net/raspberry-pi/wiringpi/ +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + +DYN_VERS_MAJ=2 +DYN_VERS_MIN=0 + +VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN) +DESTDIR=/usr +PREFIX=/local + +STATIC=libwiringPiDev.a +DYNAMIC=libwiringPiDev.so.$(VERSION) + +#DEBUG = -g -O0 +DEBUG = -O2 +CC = gcc +INCLUDE = -I. +CFLAGS = $(DEBUG) -Wformat=2 -Wall $(INCLUDE) -Winline -pipe -fPIC + +LIBS = + +############################################################################### + +SRC = ds1302.c maxdetect.c piNes.c \ + gertboard.c piFace.c \ + lcd128x64.c lcd.c \ + piGlow.c + +OBJ = $(SRC:.c=.o) + +all: $(DYNAMIC) + +static: $(STATIC) + +$(STATIC): $(OBJ) + @echo "[Link (Static)]" + @ar rcs $(STATIC) $(OBJ) + @ranlib $(STATIC) +# @size $(STATIC) + +$(DYNAMIC): $(OBJ) + @echo "[Link (Dynamic)]" + @$(CC) -shared -Wl,-soname,libwiringPiDev.so -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ) + +.c.o: + @echo [Compile] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +.PHONY: clean +clean: + @echo "[Clean]" + @rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.* + +.PHONY: tags +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + + +.PHONY: install-headers +install-headers: + @echo "[Install Headers]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/include + @install -m 0644 ds1302.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 maxdetect.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 piNes.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 gertboard.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 piFace.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 lcd128x64.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 lcd.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 piGlow.h $(DESTDIR)$(PREFIX)/include + +.PHONY: install +install: $(DYNAMIC) install-headers + @echo "[Install Dynamic Lib]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib + @install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) + @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so + @ldconfig + +.PHONY: install-static +install-static: $(STATIC) install-headers + @echo "[Install Static Lib]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib + @install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib + +.PHONY: uninstall +uninstall: + @echo "[UnInstall]" + @rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h + @rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h + @rm -f $(DESTDIR)$(PREFIX)/include/piNes.h + @rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h + @rm -f $(DESTDIR)$(PREFIX)/include/piFace.h + @rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h + @rm -f $(DESTDIR)$(PREFIX)/include/lcd.h + @rm -f $(DESTDIR)$(PREFIX)/include/piGlow.h + @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.* + @ldconfig + + +.PHONY: depend +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE + +ds1302.o: ds1302.h +maxdetect.o: maxdetect.h +piNes.o: piNes.h +gertboard.o: gertboard.h +piFace.o: piFace.h +lcd128x64.o: font.h lcd128x64.h +lcd.o: lcd.h +piGlow.o: piGlow.h diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.c b/modules/catkin_ws/src/wiringPi/devLib/ds1302.c new file mode 100644 index 00000000..cf64de77 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/ds1302.c @@ -0,0 +1,240 @@ +/* + * ds1302.c: + * Real Time clock + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdarg.h> + +#include <wiringPi.h> + +#include "ds1302.h" + +// Register defines + +#define RTC_SECS 0 +#define RTC_MINS 1 +#define RTC_HOURS 2 +#define RTC_DATE 3 +#define RTC_MONTH 4 +#define RTC_DAY 5 +#define RTC_YEAR 6 +#define RTC_WP 7 +#define RTC_TC 8 +#define RTC_BM 31 + + +// Locals + +static int dPin, cPin, sPin ; + +/* + * dsShiftIn: + * Shift a number in from the chip, LSB first. Note that the data is + * sampled on the trailing edge of the last clock, so it's valid immediately. + ********************************************************************************* + */ + +static unsigned int dsShiftIn (void) +{ + uint8_t value = 0 ; + int i ; + + pinMode (dPin, INPUT) ; delayMicroseconds (1) ; + + for (i = 0 ; i < 8 ; ++i) + { + value |= (digitalRead (dPin) << i) ; + digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; + digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; + } + + return value; +} + + +/* + * dsShiftOut: + * A normal LSB-first shift-out, just slowed down a bit - the Pi is + * a bit faster than the chip can handle. + ********************************************************************************* + */ + +static void dsShiftOut (unsigned int data) +{ + int i ; + + pinMode (dPin, OUTPUT) ; + + for (i = 0 ; i < 8 ; ++i) + { + digitalWrite (dPin, data & (1 << i)) ; delayMicroseconds (1) ; + digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; + digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; + } +} + + +/* + * ds1302regRead: ds1302regWrite: + * Read/Write a value to an RTC Register or RAM location on the chip + ********************************************************************************* + */ + +static unsigned int ds1302regRead (const int reg) +{ + unsigned int data ; + + digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; + dsShiftOut (reg) ; + data = dsShiftIn () ; + digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; + + return data ; +} + +static void ds1302regWrite (const int reg, const unsigned int data) +{ + digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; + dsShiftOut (reg) ; + dsShiftOut (data) ; + digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; +} + + +/* + * ds1302rtcWrite: ds1302rtcRead: + * Writes/Reads the data to/from the RTC register + ********************************************************************************* + */ + +unsigned int ds1302rtcRead (const int reg) +{ + return ds1302regRead (0x81 | ((reg & 0x1F) << 1)) ; +} + +void ds1302rtcWrite (int reg, unsigned int data) +{ + ds1302regWrite (0x80 | ((reg & 0x1F) << 1), data) ; +} + + +/* + * ds1302ramWrite: ds1302ramRead: + * Writes/Reads the data to/from the RTC register + ********************************************************************************* + */ + +unsigned int ds1302ramRead (const int addr) +{ + return ds1302regRead (0xC1 | ((addr & 0x1F) << 1)) ; +} + +void ds1302ramWrite (const int addr, const unsigned int data) +{ + ds1302regWrite ( 0xC0 | ((addr & 0x1F) << 1), data) ; +} + +/* + * ds1302clockRead: + * Read all 8 bytes of the clock in a single operation + ********************************************************************************* + */ + +void ds1302clockRead (int clockData [8]) +{ + int i ; + unsigned int regVal = 0x81 | ((RTC_BM & 0x1F) << 1) ; + + digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; + + dsShiftOut (regVal) ; + for (i = 0 ; i < 8 ; ++i) + clockData [i] = dsShiftIn () ; + + digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; +} + + +/* + * ds1302clockWrite: + * Write all 8 bytes of the clock in a single operation + ********************************************************************************* + */ + +void ds1302clockWrite (const int clockData [8]) +{ + int i ; + unsigned int regVal = 0x80 | ((RTC_BM & 0x1F) << 1) ; + + digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; + + dsShiftOut (regVal) ; + for (i = 0 ; i < 8 ; ++i) + dsShiftOut (clockData [i]) ; + + digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; +} + + +/* + * ds1302trickleCharge: + * Set the bits on the trickle charger. + * Probably best left alone... + ********************************************************************************* + */ + +void ds1302trickleCharge (const int diodes, const int resistors) +{ + if (diodes + resistors == 0) + ds1302rtcWrite (RTC_TC, 0x5C) ; // Disabled + else + ds1302rtcWrite (RTC_TC, 0xA0 | ((diodes & 3) << 2) | (resistors & 3)) ; +} + + + + +/* + * ds1302setup: + * Initialise the chip & remember the pins we're using + ********************************************************************************* + */ + +void ds1302setup (const int clockPin, const int dataPin, const int csPin) +{ + dPin = dataPin ; + cPin = clockPin ; + sPin = csPin ; + + digitalWrite (dPin, LOW) ; + digitalWrite (cPin, LOW) ; + digitalWrite (sPin, LOW) ; + + pinMode (dPin, OUTPUT) ; + pinMode (cPin, OUTPUT) ; + pinMode (sPin, OUTPUT) ; + + ds1302rtcWrite (RTC_WP, 0) ; // Remove write-protect +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.h b/modules/catkin_ws/src/wiringPi/devLib/ds1302.h new file mode 100644 index 00000000..e82b3ed0 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/ds1302.h @@ -0,0 +1,44 @@ +/* + * ds1302.h: + * Real Time clock + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern unsigned int ds1302rtcRead (const int reg) ; +extern void ds1302rtcWrite (const int reg, const unsigned int data) ; + +extern unsigned int ds1302ramRead (const int addr) ; +extern void ds1302ramWrite (const int addr, const unsigned int data) ; + +extern void ds1302clockRead (int clockData [8]) ; +extern void ds1302clockWrite (const int clockData [8]) ; + +extern void ds1302trickleCharge (const int diodes, const int resistors) ; + +extern void ds1302setup (const int clockPin, const int dataPin, const int csPin) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.o b/modules/catkin_ws/src/wiringPi/devLib/ds1302.o new file mode 100644 index 0000000000000000000000000000000000000000..ef4586fb29150252ddae1d0741bfe0de56053272 GIT binary patch literal 5088 zcmbVPZ)jUp6u(J2*Uc@hn@ZS(Mj2Xh%aZ-6R+%L2`e(CU%i2<<t0ha)HnvSm@*<m4 zSIHbcHl>1yh#%^}527C&${2`iXB`U49PEo@q7`AwsIwJEneI<K=e~2Ao7+4QPkFib z{?70G&bjy9_ulQnx~6)k!y(ul;z^MoF)GA(dA=W%-Jn=0mWxn($h>)E8zLQTr!X>b z@e6FS2=$Jc7c8gw`}s?mDaZEvFG<J50>yI6$fBOWyas1(l%_xI>JIIhDys-WQuCJi zrwnh*{8nnIX%XgZwj-CznLlTDL1R%!wlVWnsjQ`|`wA93*3lN24_pjfwG}I?7)7Fz z$m*IGWD)15VV29zXcZLX%+DRCaso>TmYq1$)eRF8ZRQP&Tx>;P21jq_a@kI08s?Oi z%lx5hs@GRmaR|#4nadT9TyXUJS7tsatJt0&k6!r_lzPY5e|qNC0{`TdW76Nz)@a_a zmiP4mukET#OhB&e?5$jm)+hTZgg0iUO3d1ujny;h*@7j|mpxzaf6aFa^Bv6RJMsi3 z%MJm8>E`}5-B>=KdEGH*tjSz<WiGi+Uv>sZ&yFv<Jy8nk)_yp(2fE7GoWnIRw*o3m zx$Oh<=GW#uIF>h}AaRjF{=QmH`*C1?VkxNNTFF|3XsE4y+*{ePH=Quj-mShZKL3WQ zv>XLq4pjO4TYS|ITex?VKTzeb@>gSBXm?wUaJ;ZvIQEr0)~;AuItCA6CE)jw??r5D z+~r4|JKdhcu8`ZCDRB<CJt22_jT@F^9k?5b+k!1P4m(3`PsY{k_8M+ay}LXFMC6SS z@1;WCPPf<joZC|;i5~F1L%e$8Wt`6Km<wMwpONoQY7zT}`fdgLk@_lcPUB%sCHT?- z>&2gZ?X6H#BNvan^~8%U<~1-6YiTFmM&yCveEJDHfB>wAa|CB&Z%8i@f8>fWTt(l+ zLb%|sn7Kfyn7PD~MeuS!oQl4@_kiI>c7P5S&5COX=P|bxq%#UFn%o!A`rtwxHtuZ( z0P~(Bhuj~~$43eAR$4!~ABf`;_#7-Y*Fu$rK9{(o5P;EBaN#}EEet?0JZ^(OZ-c*P zgTDp%Dwx+e&5QTwF~UC~ocHr_!Y4I8zF$%2oW?&(_%z{iZv*xd;jK>SfXTfK?JQiV zGf6n_T^Gb7K1aCRzZe)z1vdLP`6AG1>yP&uEonnUTjL24!5_<;jP-RU<3>!REKCx2 zDBj(%a8&d(G_}-(ntEF5>)Yzud)h-aO?5qDB%Wv<j>beZ-WNB*gO*M-HW=RD9FHW2 zQ?bZ!BAQ~i6r!X?q;N!`vfgBPNOgvXRA*#xI5MEP<ya*c$#`U7Fjm_iPWC}%QZW@X z(j#JFC*m^Up5}dx&j%Wg?}F<le4^3TAqb}P@i{<4{wlbbFFz@SuU7C{=%cZYH4>tk zI=W7$f~z{+gzGv{g|F6=P;gb}O-+aEe_P?JI^zni>hL?B>tUVG6~3y2`x=e;IB&FH zt!B~sUsZ55@85*$I{YF=UHoQpJxl2MVm^fn58?XyKcL`h-bx#tjS63#Z?%G}Ivtu0 z*V&`+Rh_tkt2zg4bPg$eRp$)_S9Px0==`PdRUH>DBp9xns`Cipyv{tYO$uMtiQ4ev zHvE)=t9jqG(Rp9tt9h?$eBOt*HC#>-eoE<+jc(-fyjBvf@1NBgpLN#Q@Vy$J^&hg~ zZ_xN$|Dy_DeUEL^_*_qe4Zm6Ab3L6l{BKDR>rn4Yjk5kKe%uDXsNna47U!L@!TXeY zRKAz$!7vJyNRx(-(%8^&KHt2j;e5V1so~@FoP4L@d_I`g@JZrd({Mf?lq%07);~>S zzlQVq;Ast?q)88IIG+!MFSUQj2=9f~NLp<__mc4S_8GB#hVVthMp*dvrcy!zzI0+R zJ`fw+FMN^Vp`lm;D2ZVs=4;s1u_0xIBLl)GqhtL&z3>g^QwvS<e>7f*!71n`!XRL1 z19bnb(c-h<T5#Z=3^IXQ|1ztSrK2^T>o5<WoAG}Ev<KlrTuUQ9(g7rc(Q;b@_+1Yd zYU=cl30Sefv^xA8GaP_UvH5d6^SIUX2Pxjq1Zp{6{v)jTIG)=b6t7TZ_ZNLaMBq5) zKMNhi)MpTVS&ARk0(kwAgZ2zu#qOV{OuB`a;_?1rEXVWx!*^h@QXiv#8u~4ng<q|l gqO~KrpZ3j3ni$?kl+^R%HY=9jOT;oQp*9r%0IdI%V*mgE literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/font.h b/modules/catkin_ws/src/wiringPi/devLib/font.h new file mode 100644 index 00000000..ce99e168 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/font.h @@ -0,0 +1,2577 @@ +/**********************************************/ +/* */ +/* Font file generated by cpi2fnt */ +/* ------------------------------ */ +/* Combined with the alpha-numeric */ +/* portion of Greg Harp's old PEARL */ +/* font (from earlier versions of */ +/* linux-m86k) by John Shifflett */ +/* */ +/**********************************************/ + +static const int fontHeight = 8 ; +static const int fontWidth = 8 ; + +static unsigned char font [] = +{ + /* 0 0x00 '^@' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 1 0x01 '^A' */ + 0x7e, /* 01111110 */ + 0x81, /* 10000001 */ + 0xa5, /* 10100101 */ + 0x81, /* 10000001 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0x81, /* 10000001 */ + 0x7e, /* 01111110 */ + + /* 2 0x02 '^B' */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xdb, /* 11011011 */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + + /* 3 0x03 '^C' */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* 4 0x04 '^D' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0x10, /* 00010000 */ + 0x00, /* 00000000 */ + + /* 5 0x05 '^E' */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0x38, /* 00111000 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* 6 0x06 '^F' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x7c, /* 01111100 */ + 0xfe, /* 11111110 */ + 0xfe, /* 11111110 */ + 0x7c, /* 01111100 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + + /* 7 0x07 '^G' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 8 0x08 '^H' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xe7, /* 11100111 */ + 0xc3, /* 11000011 */ + 0xc3, /* 11000011 */ + 0xe7, /* 11100111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 9 0x09 '^I' */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x42, /* 01000010 */ + 0x42, /* 01000010 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 10 0x0a '^J' */ + 0xff, /* 11111111 */ + 0xc3, /* 11000011 */ + 0x99, /* 10011001 */ + 0xbd, /* 10111101 */ + 0xbd, /* 10111101 */ + 0x99, /* 10011001 */ + 0xc3, /* 11000011 */ + 0xff, /* 11111111 */ + + /* 11 0x0b '^K' */ + 0x0f, /* 00001111 */ + 0x07, /* 00000111 */ + 0x0f, /* 00001111 */ + 0x7d, /* 01111101 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x78, /* 01111000 */ + + /* 12 0x0c '^L' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + + /* 13 0x0d '^M' */ + 0x3f, /* 00111111 */ + 0x33, /* 00110011 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x70, /* 01110000 */ + 0xf0, /* 11110000 */ + 0xe0, /* 11100000 */ + + /* 14 0x0e '^N' */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x7f, /* 01111111 */ + 0x63, /* 01100011 */ + 0x63, /* 01100011 */ + 0x67, /* 01100111 */ + 0xe6, /* 11100110 */ + 0xc0, /* 11000000 */ + + /* 15 0x0f '^O' */ + 0x18, /* 00011000 */ + 0xdb, /* 11011011 */ + 0x3c, /* 00111100 */ + 0xe7, /* 11100111 */ + 0xe7, /* 11100111 */ + 0x3c, /* 00111100 */ + 0xdb, /* 11011011 */ + 0x18, /* 00011000 */ + + /* 16 0x10 '^P' */ + 0x80, /* 10000000 */ + 0xe0, /* 11100000 */ + 0xf8, /* 11111000 */ + 0xfe, /* 11111110 */ + 0xf8, /* 11111000 */ + 0xe0, /* 11100000 */ + 0x80, /* 10000000 */ + 0x00, /* 00000000 */ + + /* 17 0x11 '^Q' */ + 0x02, /* 00000010 */ + 0x0e, /* 00001110 */ + 0x3e, /* 00111110 */ + 0xfe, /* 11111110 */ + 0x3e, /* 00111110 */ + 0x0e, /* 00001110 */ + 0x02, /* 00000010 */ + 0x00, /* 00000000 */ + + /* 18 0x12 '^R' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + + /* 19 0x13 '^S' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* 20 0x14 '^T' */ + 0x7f, /* 01111111 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7b, /* 01111011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x00, /* 00000000 */ + + /* 21 0x15 '^U' */ + 0x3e, /* 00111110 */ + 0x61, /* 01100001 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x86, /* 10000110 */ + 0x7c, /* 01111100 */ + + /* 22 0x16 '^V' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 23 0x17 '^W' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + + /* 24 0x18 '^X' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 25 0x19 '^Y' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 26 0x1a '^Z' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 27 0x1b '^[' */ + 0x00, /* 00000000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 28 0x1c '^\' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 29 0x1d '^]' */ + 0x00, /* 00000000 */ + 0x24, /* 00100100 */ + 0x66, /* 01100110 */ + 0xff, /* 11111111 */ + 0x66, /* 01100110 */ + 0x24, /* 00100100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 30 0x1e '^^' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 31 0x1f '^_' */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x7e, /* 01111110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 32 0x20 ' ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 33 0x21 '!' */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 34 0x22 '"' */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 35 0x23 '#' */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 36 0x24 '$' */ + 0x18, /* 00011000 */ + 0x3e, /* 00111110 */ + 0x60, /* 01100000 */ + 0x3c, /* 00111100 */ + 0x06, /* 00000110 */ + 0x7c, /* 01111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 37 0x25 '%' */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x66, /* 01100110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 38 0x26 '&' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x68, /* 01101000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 39 0x27 ''' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 40 0x28 '(' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + + /* 41 0x29 ')' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* 42 0x2a '*' */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0xff, /* 11111111 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 43 0x2b '+' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 44 0x2c ',' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* 45 0x2d '-' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 46 0x2e '.' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 47 0x2f '/' */ + 0x03, /* 00000011 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 48 0x30 '0' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xde, /* 11011110 */ + 0xfe, /* 11111110 */ + 0xf6, /* 11110110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 49 0x31 '1' */ + 0x18, /* 00011000 */ + 0x78, /* 01111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 50 0x32 '2' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 51 0x33 '3' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x06, /* 00000110 */ + 0x1c, /* 00011100 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 52 0x34 '4' */ + 0x1c, /* 00011100 */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + + /* 53 0x35 '5' */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 54 0x36 '6' */ + 0x38, /* 00111000 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 55 0x37 '7' */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x00, /* 00000000 */ + + /* 56 0x38 '8' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 57 0x39 '9' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 58 0x3a ':' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 59 0x3b ';' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + + /* 60 0x3c '<' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + + /* 61 0x3d '=' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 62 0x3e '>' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + + /* 63 0x3f '?' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 64 0x40 '@' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xde, /* 11011110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 65 0x41 'A' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 66 0x42 'B' */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 67 0x43 'C' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 68 0x44 'D' */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 69 0x45 'E' */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xf8, /* 11111000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 70 0x46 'F' */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xf8, /* 11111000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 71 0x47 'G' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xce, /* 11001110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 72 0x48 'H' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 73 0x49 'I' */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 74 0x4a 'J' */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 75 0x4b 'K' */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0xd8, /* 11011000 */ + 0xf0, /* 11110000 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 76 0x4c 'L' */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 77 0x4d 'M' */ + 0x82, /* 10000010 */ + 0xc6, /* 11000110 */ + 0xee, /* 11101110 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 78 0x4e 'N' */ + 0xc6, /* 11000110 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 79 0x4f 'O' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 80 0x50 'P' */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 81 0x51 'Q' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0x7c, /* 01111100 */ + 0x06, /* 00000110 */ + + /* 82 0x52 'R' */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 83 0x53 'S' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0x60, /* 01100000 */ + 0x38, /* 00111000 */ + 0x0c, /* 00001100 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 84 0x54 'T' */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 85 0x55 'U' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 86 0x56 'V' */ + 0xc3, /* 11000011 */ + 0xc3, /* 11000011 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 87 0x57 'W' */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0xee, /* 11101110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 88 0x58 'X' */ + 0xc3, /* 11000011 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0xc3, /* 11000011 */ + 0x00, /* 00000000 */ + + /* 89 0x59 'Y' */ + 0xc3, /* 11000011 */ + 0xc3, /* 11000011 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 90 0x5a 'Z' */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 91 0x5b '[' */ + 0x3c, /* 00111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 92 0x5c '\' */ + 0xc0, /* 11000000 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x06, /* 00000110 */ + 0x03, /* 00000011 */ + 0x00, /* 00000000 */ + + /* 93 0x5d ']' */ + 0x3c, /* 00111100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 94 0x5e '^' */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 95 0x5f '_' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + + /* 96 0x60 '`' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 97 0x61 'a' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0x06, /* 00000110 */ + 0x7e, /* 01111110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 98 0x62 'b' */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 99 0x63 'c' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 100 0x64 'd' */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x7e, /* 01111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 101 0x65 'e' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 102 0x66 'f' */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x60, /* 01100000 */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x60, /* 01100000 */ + 0x00, /* 00000000 */ + + /* 103 0x67 'g' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0x7c, /* 01111100 */ + + /* 104 0x68 'h' */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 105 0x69 'i' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 106 0x6a 'j' */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + + /* 107 0x6b 'k' */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xcc, /* 11001100 */ + 0xd8, /* 11011000 */ + 0xf0, /* 11110000 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + + /* 108 0x6c 'l' */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 109 0x6d 'm' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xec, /* 11101100 */ + 0xfe, /* 11111110 */ + 0xd6, /* 11010110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 110 0x6e 'n' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 111 0x6f 'o' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 112 0x70 'p' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfc, /* 11111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfc, /* 11111100 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + + /* 113 0x71 'q' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + + /* 114 0x72 'r' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0xe6, /* 11100110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 115 0x73 's' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 116 0x74 't' */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x7c, /* 01111100 */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x36, /* 00110110 */ + 0x1c, /* 00011100 */ + 0x00, /* 00000000 */ + + /* 117 0x75 'u' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 118 0x76 'v' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 119 0x77 'w' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xd6, /* 11010110 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 120 0x78 'x' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 121 0x79 'y' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xc3, /* 11000011 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + + /* 122 0x7a 'z' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x0c, /* 00001100 */ + 0x38, /* 00111000 */ + 0x60, /* 01100000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 123 0x7b '{' */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x00, /* 00000000 */ + + /* 124 0x7c '|' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 125 0x7d '}' */ + 0x70, /* 01110000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 126 0x7e '~' */ + 0x72, /* 01110010 */ + 0x9c, /* 10011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 127 0x7f '' */ + 0x00, /* 00000000 */ + 0x10, /* 00010000 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 128 0x80 '€' */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x0c, /* 00001100 */ + 0x78, /* 01111000 */ + + /* 129 0x81 '' */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 130 0x82 '‚' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 131 0x83 'ƒ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 132 0x84 '„' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 133 0x85 '…' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 134 0x86 '†' */ + 0x30, /* 00110000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 135 0x87 '‡' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x0c, /* 00001100 */ + 0x38, /* 00111000 */ + + /* 136 0x88 'ˆ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 137 0x89 '‰' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 138 0x8a 'Š' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 139 0x8b '‹' */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 140 0x8c 'Œ' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 141 0x8d '' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 142 0x8e 'Ž' */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 143 0x8f '' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 144 0x90 '' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xf8, /* 11111000 */ + 0xc0, /* 11000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 145 0x91 '‘' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 146 0x92 '’' */ + 0x3e, /* 00111110 */ + 0x6c, /* 01101100 */ + 0xcc, /* 11001100 */ + 0xfe, /* 11111110 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* 147 0x93 '“' */ + 0x7c, /* 01111100 */ + 0x82, /* 10000010 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 148 0x94 '”' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 149 0x95 '•' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 150 0x96 '–' */ + 0x78, /* 01111000 */ + 0x84, /* 10000100 */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 151 0x97 '—' */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 152 0x98 '˜' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7e, /* 01111110 */ + 0x06, /* 00000110 */ + 0xfc, /* 11111100 */ + + /* 153 0x99 '™' */ + 0xc6, /* 11000110 */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 154 0x9a 'š' */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 155 0x9b '›' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 156 0x9c 'œ' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x64, /* 01100100 */ + 0xf0, /* 11110000 */ + 0x60, /* 01100000 */ + 0x66, /* 01100110 */ + 0xfc, /* 11111100 */ + 0x00, /* 00000000 */ + + /* 157 0x9d '' */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 158 0x9e 'ž' */ + 0xf8, /* 11111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xfa, /* 11111010 */ + 0xc6, /* 11000110 */ + 0xcf, /* 11001111 */ + 0xc6, /* 11000110 */ + 0xc7, /* 11000111 */ + + /* 159 0x9f 'Ÿ' */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 160 0xa0 ' ' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x7c, /* 01111100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 161 0xa1 '¡' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x38, /* 00111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 162 0xa2 '¢' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + + /* 163 0xa3 '£' */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 164 0xa4 '¤' */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xdc, /* 11011100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x00, /* 00000000 */ + + /* 165 0xa5 '¥' */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0xe6, /* 11100110 */ + 0xf6, /* 11110110 */ + 0xde, /* 11011110 */ + 0xce, /* 11001110 */ + 0x00, /* 00000000 */ + + /* 166 0xa6 '¦' */ + 0x3c, /* 00111100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 167 0xa7 '§' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 168 0xa8 '¨' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x63, /* 01100011 */ + 0x3e, /* 00111110 */ + 0x00, /* 00000000 */ + + /* 169 0xa9 '©' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 170 0xaa 'ª' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0x06, /* 00000110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 171 0xab '«' */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7e, /* 01111110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x0f, /* 00001111 */ + + /* 172 0xac '¬' */ + 0x63, /* 01100011 */ + 0xe6, /* 11100110 */ + 0x6c, /* 01101100 */ + 0x7a, /* 01111010 */ + 0x36, /* 00110110 */ + 0x6a, /* 01101010 */ + 0xdf, /* 11011111 */ + 0x06, /* 00000110 */ + + /* 173 0xad '' */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 174 0xae '®' */ + 0x00, /* 00000000 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 175 0xaf '¯' */ + 0x00, /* 00000000 */ + 0xcc, /* 11001100 */ + 0x66, /* 01100110 */ + 0x33, /* 00110011 */ + 0x66, /* 01100110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 176 0xb0 '°' */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + 0x22, /* 00100010 */ + 0x88, /* 10001000 */ + + /* 177 0xb1 '±' */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + 0x55, /* 01010101 */ + 0xaa, /* 10101010 */ + + /* 178 0xb2 '²' */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + 0x77, /* 01110111 */ + 0xdd, /* 11011101 */ + + /* 179 0xb3 '³' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 180 0xb4 '´' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 181 0xb5 'µ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 182 0xb6 '¶' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 183 0xb7 '·' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 184 0xb8 '¸' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 185 0xb9 '¹' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 186 0xba 'º' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 187 0xbb '»' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x06, /* 00000110 */ + 0xf6, /* 11110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 188 0xbc '¼' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf6, /* 11110110 */ + 0x06, /* 00000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 189 0xbd '½' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 190 0xbe '¾' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 191 0xbf '¿' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xf8, /* 11111000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 192 0xc0 'À' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 193 0xc1 'Á' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 194 0xc2 'Â' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 195 0xc3 'Ã' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 196 0xc4 'Ä' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 197 0xc5 'Å' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 198 0xc6 'Æ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 199 0xc7 'Ç' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 200 0xc8 'È' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 201 0xc9 'É' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 202 0xca 'Ê' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 203 0xcb 'Ë' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 204 0xcc 'Ì' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x37, /* 00110111 */ + 0x30, /* 00110000 */ + 0x37, /* 00110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 205 0xcd 'Í' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 206 0xce 'Î' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xf7, /* 11110111 */ + 0x00, /* 00000000 */ + 0xf7, /* 11110111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 207 0xcf 'Ï' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 208 0xd0 'Ð' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 209 0xd1 'Ñ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 210 0xd2 'Ò' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 211 0xd3 'Ó' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x3f, /* 00111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 212 0xd4 'Ô' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 213 0xd5 'Õ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 214 0xd6 'Ö' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3f, /* 00111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 215 0xd7 '×' */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0xff, /* 11111111 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + + /* 216 0xd8 'Ø' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0xff, /* 11111111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 217 0xd9 'Ù' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xf8, /* 11111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 218 0xda 'Ú' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x1f, /* 00011111 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 219 0xdb 'Û' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 220 0xdc 'Ü' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + + /* 221 0xdd 'Ý' */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + 0xf0, /* 11110000 */ + + /* 222 0xde 'Þ' */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + 0x0f, /* 00001111 */ + + /* 223 0xdf 'ß' */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0xff, /* 11111111 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 224 0xe0 'à' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0xc8, /* 11001000 */ + 0xdc, /* 11011100 */ + 0x76, /* 01110110 */ + 0x00, /* 00000000 */ + + /* 225 0xe1 'á' */ + 0x78, /* 01111000 */ + 0xcc, /* 11001100 */ + 0xcc, /* 11001100 */ + 0xd8, /* 11011000 */ + 0xcc, /* 11001100 */ + 0xc6, /* 11000110 */ + 0xcc, /* 11001100 */ + 0x00, /* 00000000 */ + + /* 226 0xe2 'â' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0xc0, /* 11000000 */ + 0x00, /* 00000000 */ + + /* 227 0xe3 'ã' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x00, /* 00000000 */ + + /* 228 0xe4 'ä' */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + + /* 229 0xe5 'å' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + 0x00, /* 00000000 */ + + /* 230 0xe6 'æ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x7c, /* 01111100 */ + 0xc0, /* 11000000 */ + + /* 231 0xe7 'ç' */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + + /* 232 0xe8 'è' */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x3c, /* 00111100 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + + /* 233 0xe9 'é' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xfe, /* 11111110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + + /* 234 0xea 'ê' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0xee, /* 11101110 */ + 0x00, /* 00000000 */ + + /* 235 0xeb 'ë' */ + 0x0e, /* 00001110 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x3e, /* 00111110 */ + 0x66, /* 01100110 */ + 0x66, /* 01100110 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + + /* 236 0xec 'ì' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 237 0xed 'í' */ + 0x06, /* 00000110 */ + 0x0c, /* 00001100 */ + 0x7e, /* 01111110 */ + 0xdb, /* 11011011 */ + 0xdb, /* 11011011 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0xc0, /* 11000000 */ + + /* 238 0xee 'î' */ + 0x1e, /* 00011110 */ + 0x30, /* 00110000 */ + 0x60, /* 01100000 */ + 0x7e, /* 01111110 */ + 0x60, /* 01100000 */ + 0x30, /* 00110000 */ + 0x1e, /* 00011110 */ + 0x00, /* 00000000 */ + + /* 239 0xef 'ï' */ + 0x00, /* 00000000 */ + 0x7c, /* 01111100 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0xc6, /* 11000110 */ + 0x00, /* 00000000 */ + + /* 240 0xf0 'ð' */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0xfe, /* 11111110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 241 0xf1 'ñ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x7e, /* 01111110 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 242 0xf2 'ò' */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 243 0xf3 'ó' */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x18, /* 00011000 */ + 0x0c, /* 00001100 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + + /* 244 0xf4 'ô' */ + 0x0e, /* 00001110 */ + 0x1b, /* 00011011 */ + 0x1b, /* 00011011 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + + /* 245 0xf5 'õ' */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0xd8, /* 11011000 */ + 0xd8, /* 11011000 */ + 0x70, /* 01110000 */ + + /* 246 0xf6 'ö' */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x7e, /* 01111110 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 247 0xf7 '÷' */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x76, /* 01110110 */ + 0xdc, /* 11011100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 248 0xf8 'ø' */ + 0x38, /* 00111000 */ + 0x6c, /* 01101100 */ + 0x6c, /* 01101100 */ + 0x38, /* 00111000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 249 0xf9 'ù' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 250 0xfa 'ú' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x18, /* 00011000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 251 0xfb 'û' */ + 0x0f, /* 00001111 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0x0c, /* 00001100 */ + 0xec, /* 11101100 */ + 0x6c, /* 01101100 */ + 0x3c, /* 00111100 */ + 0x1c, /* 00011100 */ + + /* 252 0xfc 'ü' */ + 0x6c, /* 01101100 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x36, /* 00110110 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 253 0xfd 'ý' */ + 0x78, /* 01111000 */ + 0x0c, /* 00001100 */ + 0x18, /* 00011000 */ + 0x30, /* 00110000 */ + 0x7c, /* 01111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 254 0xfe 'þ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x3c, /* 00111100 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + + /* 255 0xff 'ÿ' */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + 0x00, /* 00000000 */ + +}; diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.c b/modules/catkin_ws/src/wiringPi/devLib/gertboard.c new file mode 100644 index 00000000..5aeaef7c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/gertboard.c @@ -0,0 +1,164 @@ +/* + * gertboard.c: + * Access routines for the SPI devices on the Gertboard + * Copyright (c) 2012 Gordon Henderson + * + * The Gertboard has: + * + * An MCP3002 dual-channel A to D convertor connected + * to the SPI bus, selected by chip-select A, and: + * + * An MCP4802 dual-channel D to A convertor connected + * to the SPI bus, selected via chip-select B. + * + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdint.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/spi/spidev.h> + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "gertboard.h" + +// The A-D convertor won't run at more than 1MHz @ 3.3v + +#define SPI_ADC_SPEED 1000000 +#define SPI_DAC_SPEED 1000000 +#define SPI_A2D 0 +#define SPI_D2A 1 + + +/* + * gertboardAnalogWrite: + * Write an 8-bit data value to the MCP4802 Analog to digital + * convertor on the Gertboard. + ********************************************************************************* + */ + +void gertboardAnalogWrite (const int chan, const int value) +{ + uint8_t spiData [2] ; + uint8_t chanBits, dataBits ; + + if (chan == 0) + chanBits = 0x30 ; + else + chanBits = 0xB0 ; + + chanBits |= ((value >> 4) & 0x0F) ; + dataBits = ((value << 4) & 0xF0) ; + + spiData [0] = chanBits ; + spiData [1] = dataBits ; + + wiringPiSPIDataRW (SPI_D2A, spiData, 2) ; +} + + +/* + * gertboardAnalogRead: + * Return the analog value of the given channel (0/1). + * The A/D is a 10-bit device + ********************************************************************************* + */ + +int gertboardAnalogRead (const int chan) +{ + uint8_t spiData [2] ; + + uint8_t chanBits ; + + if (chan == 0) + chanBits = 0b11010000 ; + else + chanBits = 0b11110000 ; + + spiData [0] = chanBits ; + spiData [1] = 0 ; + + wiringPiSPIDataRW (SPI_A2D, spiData, 2) ; + + return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ; +} + + +/* + * gertboardSPISetup: + * Initialise the SPI bus, etc. + ********************************************************************************* + */ + +int gertboardSPISetup (void) +{ + if (wiringPiSPISetup (SPI_A2D, SPI_ADC_SPEED) < 0) + return -1 ; + + if (wiringPiSPISetup (SPI_D2A, SPI_DAC_SPEED) < 0) + return -1 ; + + return 0 ; +} + + +/* + * New wiringPi node extension methods. + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, const int chan) +{ + return gertboardAnalogRead (chan - node->pinBase) ; +} + +static void myAnalogWrite (struct wiringPiNodeStruct *node, const int chan, const int value) +{ + gertboardAnalogWrite (chan - node->pinBase, value) ; +} + + +/* + * gertboardAnalogSetup: + * Create a new wiringPi device node for the analog devices on the + * Gertboard. We create one node with 2 pins - each pin being read + * and write - although the operations actually go to different + * hardware devices. + ********************************************************************************* + */ + +int gertboardAnalogSetup (const int pinBase) +{ + struct wiringPiNodeStruct *node ; + int x ; + + if (( x = gertboardSPISetup ()) != 0) + return x; + + node = wiringPiNewNode (pinBase, 2) ; + node->analogRead = myAnalogRead ; + node->analogWrite = myAnalogWrite ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.h b/modules/catkin_ws/src/wiringPi/devLib/gertboard.h new file mode 100644 index 00000000..3fa19197 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/gertboard.h @@ -0,0 +1,45 @@ +/* + * gertboard.h: + * Access routines for the SPI devices on the Gertboard + * Copyright (c) 2012 Gordon Henderson + * + * The Gertboard has an MCP4802 dual-channel D to A convertor + * connected to the SPI bus, selected via chip-select B. + * + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +// Old routines + +extern void gertboardAnalogWrite (const int chan, const int value) ; +extern int gertboardAnalogRead (const int chan) ; +extern int gertboardSPISetup (void) ; + +// New + +extern int gertboardAnalogSetup (const int pinBase) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.o b/modules/catkin_ws/src/wiringPi/devLib/gertboard.o new file mode 100644 index 0000000000000000000000000000000000000000..5057c20bcb8ca8093383fc0076a19dbe9b5631ee GIT binary patch literal 2696 zcmbVNO>7%Q6rS}u#A%aV^Cua#QY_@6An3}5HYEruJ8_(?uu>~dS|On8O}vS%_$N4P znji#`7ErcTr5-tO;=~1x5$d5NP1SQ$RfwYnY88H@7A_!EWZs*dNv7Mag!-cOd+(d? z{p`Hi$tUCaTu71#7m1uC`yNLL(R=spG&R#?fE*yY^Lxzwv#ehX9~lBzce9B|YSZaT z-(!~NHn;u>Z`}zyoi*ntHN9>pBxkpvyLb9_u7qHHJ)GFZWco!2E9<X%N!mTSb3L|A zS6({d{^kDg3zF2qEHI%S4Gky>d2eJB5>!ofoleKujq?2J#&kkbH^PaXU$;8F>c-8! zog-Zt>*i_Qe%icPR~`HmYZ9!_s;{9B^&_e7)%2)JXn&t=t{kQweP0S~{XGc%N49Cd z-*rKLyF1VG%@o~#F$W8Fx7*KO#hq~PQbfP>>;(wWFAd13+=8yVdI8h9Kfd$cHklY3 zdp$lhGuv+1?f7x+n3g;`+@@aY<J7R0Jf@Aj=;85KlBwb3aB>8@Cgd4U5$VGzBCSNF zL;byx%P^uC;D^~-33XP9ht3>OBAJ6E3hrx&fgJP{<>#4QL5=)#`+SN4+{ZYW|08Cf zK%G^h^FYr*!Xa?KU~4B)XO!sYp^Or9<eU<JUx|$=(Toydj9`VQEKL6B2Cd40Cz%i# z{(?k?OhF=(o`>K8Kthne#8&wJ9AbEf;d~#^m5J~Xv2_m*en*)+A+S6X_v|U*y-JMn zCTN_OUy1+(;npMY4*<vfODs`^=?e_M$9y_Vu)l;SDE~K%pJbN_oiAY59>FIIR?D7k znys=nN9wDYhFNPaoNZNYYtNgq%<?`>WEd0q)1#TZaXObPj!zrYnbG{XLC#lO)y6`h zS}dH(nzlK0mKeseZO$zkbCpG7-mKRA*&eI_aYf5+FNujfV6RuNi3eGe*7?b18TS`u z)Km0i;hDLQ_W{Ve0<H-7R{}2bZwa`_zc1iV3VBqv?|7m`d_=%;ZoHqj1pH|MUjQ2g z^WYih{M!hEAg;p0@i^Ehc&FjR<qc+Vyu|#14_{(_&4+iGzvjd5F(1z%3eV5a9nqFo z>$W)y+HQHe!mXB7Gd0^<v58iO146Xf<z+$vt=*_q7p>YV(dL@<y43(mqiI{(#N^CT zdWMKbqpgZD-!kib+FlQj^BadC9D)CfPXmV1VDs_3hrc<zcW@SIPGGv!;~9LPaE6$Q z-#B<bqr3nQ;{KcQTVGw|qWIyL0mGb+8=qo1{qO&O>!(?K60|5h{<sK&&HLy2lz@rU zpE*GU1GwiHCZ2f=*=6yY=m^61pF?kh5j4L7+mOqQi1Wi(9?$28-?)G8F{H!dE9eN~ ne=YR=y(9f=26k9LKVZBET<7)i|6EZ0b$lt1o1WVH_1FIo@%Ma) literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.c b/modules/catkin_ws/src/wiringPi/devLib/lcd.c new file mode 100644 index 00000000..6c0e4749 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/lcd.c @@ -0,0 +1,495 @@ +/* + * lcd.c: + * Text-based LCD driver. + * This is designed to drive the parallel interface LCD drivers + * based in the Hitachi HD44780U controller and compatables. + * + * Copyright (c) 2012 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +#include <wiringPi.h> + +#include "lcd.h" + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +// HD44780U Commands + +#define LCD_CLEAR 0x01 +#define LCD_HOME 0x02 +#define LCD_ENTRY 0x04 +#define LCD_CTRL 0x08 +#define LCD_CDSHIFT 0x10 +#define LCD_FUNC 0x20 +#define LCD_CGRAM 0x40 +#define LCD_DGRAM 0x80 + +// Bits in the entry register + +#define LCD_ENTRY_SH 0x01 +#define LCD_ENTRY_ID 0x02 + +// Bits in the control register + +#define LCD_BLINK_CTRL 0x01 +#define LCD_CURSOR_CTRL 0x02 +#define LCD_DISPLAY_CTRL 0x04 + +// Bits in the function register + +#define LCD_FUNC_F 0x04 +#define LCD_FUNC_N 0x08 +#define LCD_FUNC_DL 0x10 + +#define LCD_CDSHIFT_RL 0x04 + +struct lcdDataStruct +{ + int bits, rows, cols ; + int rsPin, strbPin ; + int dataPins [8] ; + int cx, cy ; +} ; + +struct lcdDataStruct *lcds [MAX_LCDS] ; + +static int lcdControl ; + +// Row offsets + +static const int rowOff [4] = { 0x00, 0x40, 0x14, 0x54 } ; + + +/* + * strobe: + * Toggle the strobe (Really the "E") pin to the device. + * According to the docs, data is latched on the falling edge. + ********************************************************************************* + */ + +static void strobe (const struct lcdDataStruct *lcd) +{ + +// Note timing changes for new version of delayMicroseconds () + + digitalWrite (lcd->strbPin, 1) ; delayMicroseconds (50) ; + digitalWrite (lcd->strbPin, 0) ; delayMicroseconds (50) ; +} + + +/* + * sentDataCmd: + * Send an data or command byte to the display. + ********************************************************************************* + */ + +static void sendDataCmd (const struct lcdDataStruct *lcd, unsigned char data) +{ + register unsigned char myData = data ; + unsigned char i, d4 ; + + if (lcd->bits == 4) + { + d4 = (myData >> 4) & 0x0F; + for (i = 0 ; i < 4 ; ++i) + { + digitalWrite (lcd->dataPins [i], (d4 & 1)) ; + d4 >>= 1 ; + } + strobe (lcd) ; + + d4 = myData & 0x0F ; + for (i = 0 ; i < 4 ; ++i) + { + digitalWrite (lcd->dataPins [i], (d4 & 1)) ; + d4 >>= 1 ; + } + } + else + { + for (i = 0 ; i < 8 ; ++i) + { + digitalWrite (lcd->dataPins [i], (myData & 1)) ; + myData >>= 1 ; + } + } + strobe (lcd) ; +} + + +/* + * putCommand: + * Send a command byte to the display + ********************************************************************************* + */ + +static void putCommand (const struct lcdDataStruct *lcd, unsigned char command) +{ + digitalWrite (lcd->rsPin, 0) ; + sendDataCmd (lcd, command) ; + delay (2) ; +} + +static void put4Command (const struct lcdDataStruct *lcd, unsigned char command) +{ + register unsigned char myCommand = command ; + register unsigned char i ; + + digitalWrite (lcd->rsPin, 0) ; + + for (i = 0 ; i < 4 ; ++i) + { + digitalWrite (lcd->dataPins [i], (myCommand & 1)) ; + myCommand >>= 1 ; + } + strobe (lcd) ; +} + + +/* + ********************************************************************************* + * User Callable code below here + ********************************************************************************* + */ + +/* + * lcdHome: lcdClear: + * Home the cursor or clear the screen. + ********************************************************************************* + */ + +void lcdHome (const int fd) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + putCommand (lcd, LCD_HOME) ; + lcd->cx = lcd->cy = 0 ; + delay (5) ; +} + +void lcdClear (const int fd) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + putCommand (lcd, LCD_CLEAR) ; + putCommand (lcd, LCD_HOME) ; + lcd->cx = lcd->cy = 0 ; + delay (5) ; +} + + +/* + * lcdDisplay: lcdCursor: lcdCursorBlink: + * Turn the display, cursor, cursor blinking on/off + ********************************************************************************* + */ + +void lcdDisplay (const int fd, int state) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + if (state) + lcdControl |= LCD_DISPLAY_CTRL ; + else + lcdControl &= ~LCD_DISPLAY_CTRL ; + + putCommand (lcd, LCD_CTRL | lcdControl) ; +} + +void lcdCursor (const int fd, int state) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + if (state) + lcdControl |= LCD_CURSOR_CTRL ; + else + lcdControl &= ~LCD_CURSOR_CTRL ; + + putCommand (lcd, LCD_CTRL | lcdControl) ; +} + +void lcdCursorBlink (const int fd, int state) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + if (state) + lcdControl |= LCD_BLINK_CTRL ; + else + lcdControl &= ~LCD_BLINK_CTRL ; + + putCommand (lcd, LCD_CTRL | lcdControl) ; +} + + +/* + * lcdSendCommand: + * Send any arbitary command to the display + ********************************************************************************* + */ + +void lcdSendCommand (const int fd, unsigned char command) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + putCommand (lcd, command) ; +} + + +/* + * lcdPosition: + * Update the position of the cursor on the display. + * Ignore invalid locations. + ********************************************************************************* + */ + +void lcdPosition (const int fd, int x, int y) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + if ((x > lcd->cols) || (x < 0)) + return ; + if ((y > lcd->rows) || (y < 0)) + return ; + + putCommand (lcd, x + (LCD_DGRAM | rowOff [y])) ; + + lcd->cx = x ; + lcd->cy = y ; +} + + +/* + * lcdCharDef: + * Defines a new character in the CGRAM + ********************************************************************************* + */ + +void lcdCharDef (const int fd, int index, unsigned char data [8]) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + int i ; + + putCommand (lcd, LCD_CGRAM | ((index & 7) << 3)) ; + + digitalWrite (lcd->rsPin, 1) ; + for (i = 0 ; i < 8 ; ++i) + sendDataCmd (lcd, data [i]) ; +} + + +/* + * lcdPutchar: + * Send a data byte to be displayed on the display. We implement a very + * simple terminal here - with line wrapping, but no scrolling. Yet. + ********************************************************************************* + */ + +void lcdPutchar (const int fd, unsigned char data) +{ + struct lcdDataStruct *lcd = lcds [fd] ; + + digitalWrite (lcd->rsPin, 1) ; + sendDataCmd (lcd, data) ; + + if (++lcd->cx == lcd->cols) + { + lcd->cx = 0 ; + if (++lcd->cy == lcd->rows) + lcd->cy = 0 ; + + putCommand (lcd, lcd->cx + (LCD_DGRAM | rowOff [lcd->cy])) ; + } +} + + +/* + * lcdPuts: + * Send a string to be displayed on the display + ********************************************************************************* + */ + +void lcdPuts (const int fd, const char *string) +{ + while (*string) + lcdPutchar (fd, *string++) ; +} + + +/* + * lcdPrintf: + * Printf to an LCD display + ********************************************************************************* + */ + +void lcdPrintf (const int fd, const char *message, ...) +{ + va_list argp ; + char buffer [1024] ; + + va_start (argp, message) ; + vsnprintf (buffer, 1023, message, argp) ; + va_end (argp) ; + + lcdPuts (fd, buffer) ; +} + + +/* + * lcdInit: + * Take a lot of parameters and initialise the LCD, and return a handle to + * that LCD, or -1 if any error. + ********************************************************************************* + */ + +int lcdInit (const int rows, const int cols, const int bits, + const int rs, const int strb, + const int d0, const int d1, const int d2, const int d3, const int d4, + const int d5, const int d6, const int d7) +{ + static int initialised = 0 ; + + unsigned char func ; + int i ; + int lcdFd = -1 ; + struct lcdDataStruct *lcd ; + + if (initialised == 0) + { + initialised = 1 ; + for (i = 0 ; i < MAX_LCDS ; ++i) + lcds [i] = NULL ; + } + +// Simple sanity checks + + if (! ((bits == 4) || (bits == 8))) + return -1 ; + + if ((rows < 0) || (rows > 20)) + return -1 ; + + if ((cols < 0) || (cols > 20)) + return -1 ; + +// Create a new LCD: + + for (i = 0 ; i < MAX_LCDS ; ++i) + { + if (lcds [i] == NULL) + { + lcdFd = i ; + break ; + } + } + + if (lcdFd == -1) + return -1 ; + + lcd = (struct lcdDataStruct *)malloc (sizeof (struct lcdDataStruct)) ; + if (lcd == NULL) + return -1 ; + + lcd->rsPin = rs ; + lcd->strbPin = strb ; + lcd->bits = 8 ; // For now - we'll set it properly later. + lcd->rows = rows ; + lcd->cols = cols ; + lcd->cx = 0 ; + lcd->cy = 0 ; + + lcd->dataPins [0] = d0 ; + lcd->dataPins [1] = d1 ; + lcd->dataPins [2] = d2 ; + lcd->dataPins [3] = d3 ; + lcd->dataPins [4] = d4 ; + lcd->dataPins [5] = d5 ; + lcd->dataPins [6] = d6 ; + lcd->dataPins [7] = d7 ; + + lcds [lcdFd] = lcd ; + + digitalWrite (lcd->rsPin, 0) ; pinMode (lcd->rsPin, OUTPUT) ; + digitalWrite (lcd->strbPin, 0) ; pinMode (lcd->strbPin, OUTPUT) ; + + for (i = 0 ; i < bits ; ++i) + { + digitalWrite (lcd->dataPins [i], 0) ; + pinMode (lcd->dataPins [i], OUTPUT) ; + } + delay (35) ; // mS + + +// 4-bit mode? +// OK. This is a PIG and it's not at all obvious from the documentation I had, +// so I guess some others have worked through either with better documentation +// or more trial and error... Anyway here goes: +// +// It seems that the controller needs to see the FUNC command at least 3 times +// consecutively - in 8-bit mode. If you're only using 8-bit mode, then it appears +// that you can get away with one func-set, however I'd not rely on it... +// +// So to set 4-bit mode, you need to send the commands one nibble at a time, +// the same three times, but send the command to set it into 8-bit mode those +// three times, then send a final 4th command to set it into 4-bit mode, and only +// then can you flip the switch for the rest of the library to work in 4-bit +// mode which sends the commands as 2 x 4-bit values. + + if (bits == 4) + { + func = LCD_FUNC | LCD_FUNC_DL ; // Set 8-bit mode 3 times + put4Command (lcd, func >> 4) ; delay (35) ; + put4Command (lcd, func >> 4) ; delay (35) ; + put4Command (lcd, func >> 4) ; delay (35) ; + func = LCD_FUNC ; // 4th set: 4-bit mode + put4Command (lcd, func >> 4) ; delay (35) ; + lcd->bits = 4 ; + } + else + { + func = LCD_FUNC | LCD_FUNC_DL ; + putCommand (lcd, func ) ; delay (35) ; + putCommand (lcd, func ) ; delay (35) ; + putCommand (lcd, func ) ; delay (35) ; + } + + if (lcd->rows > 1) + { + func |= LCD_FUNC_N ; + putCommand (lcd, func) ; delay (35) ; + } + +// Rest of the initialisation sequence + + lcdDisplay (lcdFd, TRUE) ; + lcdCursor (lcdFd, FALSE) ; + lcdCursorBlink (lcdFd, FALSE) ; + lcdClear (lcdFd) ; + + putCommand (lcd, LCD_ENTRY | LCD_ENTRY_ID) ; + putCommand (lcd, LCD_CDSHIFT | LCD_CDSHIFT_RL) ; + + return lcdFd ; +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.h b/modules/catkin_ws/src/wiringPi/devLib/lcd.h new file mode 100644 index 00000000..0a0e5988 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/lcd.h @@ -0,0 +1,52 @@ +/* + * lcd.h: + * Text-based LCD driver. + * This is designed to drive the parallel interface LCD drivers + * based in the Hitachi HD44780U controller and compatables. + * + * Copyright (c) 2012 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#define MAX_LCDS 8 + +#ifdef __cplusplus +extern "C" { +#endif + +extern void lcdHome (const int fd) ; +extern void lcdClear (const int fd) ; +extern void lcdDisplay (const int fd, int state) ; +extern void lcdCursor (const int fd, int state) ; +extern void lcdCursorBlink (const int fd, int state) ; +extern void lcdSendCommand (const int fd, unsigned char command) ; +extern void lcdPosition (const int fd, int x, int y) ; +extern void lcdCharDef (const int fd, int index, unsigned char data [8]) ; +extern void lcdPutchar (const int fd, unsigned char data) ; +extern void lcdPuts (const int fd, const char *string) ; +extern void lcdPrintf (const int fd, const char *message, ...) ; + +extern int lcdInit (const int rows, const int cols, const int bits, + const int rs, const int strb, + const int d0, const int d1, const int d2, const int d3, const int d4, + const int d5, const int d6, const int d7) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.o b/modules/catkin_ws/src/wiringPi/devLib/lcd.o new file mode 100644 index 0000000000000000000000000000000000000000..97f9fee758a23c83c7ab88544f7baa85bcd8128f GIT binary patch literal 7240 zcmbtYe{5UD9Y4n|HBER9P)2}iG3x`RsCW)FRkBv#m*=$4)NM1`LQ$HzuI;Q=T|4*( zKh^>%FAba=(@Y?QCWJbe_75N-Z7K{+X;|8ZZO}%8Y5S|~1S^hONTF)hiMHPNd%m-u z-~1+|eWT~^-RHhP@4k2MUY_X<t!c8^h#(uekJNesCFH}lTHDW>ej<@(vPq-g7Ve)w zl@h{-?-8xSs?K=^^)qZ1M+e81hn0sy#m9Zh7G-mgUf!~aUet==#hQN3so(F&c?+xP zSDHTM(9hWXGhZ_OVE4&<DX1T5)$}9I5dETmK-s1YC_hocXZMXO^j}&rEi3e*GCAi6 z(vwQzz5u-%)Q_PFWoC|<2z6h~pFtCf{!bT}DD{@h<-)2!)tAD3Y29b@Uz~k;(Bo<! z!GOsYNbm~1&^eD07M^Kg<}^CzI&`7r1tS>K;U*C5A7B|)^IBg_%5t!{O<qhd)@wIN zF$8W)XewCTE4Nk>oc-n1a(P@UEWj|dXnE5Fy3q<tE@|{sDF(i$)h-;HR(;40qhLP^ zV!Rf=Q6Cpc=*t*8J;iL6ZvJ1!T<w0+$lm_>!oBEME3CehZ`03wOIcSx?)1A3&CgCj z^saWIA9vK_Z(>&8#om>Ay{xd;RFC(6S9@3M^_B{IwtBqT${uEgxz5gBDVGODebnYx z*$lN(SbnKH@7$}<^B<JjM<(-K-CG=cSJ0VC?=G##SMx9QLXdt6byV<;>&J&}C((N8 z09d92z5tDPVGT^d{MFmn&n*1lj9sIjpd<abKU9o5!AR*LP%J#vQrm{r_*{opfB@_$ zTWR0rayiufS^gZiJ&dadF-ObvBGbeY7yh8k3VSNm4xwGdl2bsxp!)Pl+bY#bRbQ?d zE4F_C!t|4Z+QsXTjXS8?m0PM6Z$cm1E1+KRJzEinbXkGC4(0~Oc@5(b2=xz441>b# zD2}<>1C{-E0RwX#TInB|&)rI|FdQ?2#L+yY2qXC~4bjx<3l5ko+P-ro2O%Sq8huIj zLrbG$vIaavN8~=n$K<WRbAH#d5qUebT+7DfA;w>lhZ%oW9%uYl@<GPmlHXzcxAG+8 zzn5o#$Fzdujt&S)1JfM<bWUo;5t+cUYj760L&cEn4AS$zBQW+p+mJLMx1x*}kcqM# zRZmR^WM?Z_0p8+e)&g=HKYC8`w6#LTLrhyyahYGF?K^^r!je=b2G@lZ-2Tb@oqT1d z8GxQc#XkSIHVrNCsZTmX-81>~#h%Oh>2F>8UxLF%FE4gISHQ+qXgmuIJiR+7@r;AI z(a*JoDn|g+X;5E%jL@UGcCcjA^h-{*9&PWz$x^Nz*i++luk1Ly8a(#W69GuQMWG)n z^i!IXot6Cd!zxYXrV23BIUk^N0lKSY+U^7mUSGUosM-oLjsV@Wn5qtFLP<J-^-;AA z*jB180k)m0ZeTm9Dgzs$Y6q|<sJa{`Zy0P+)vHC12I-Px%sZ5PZ4VXpwDLC?v}$ng z{?A=6?1u?diUGMCD(+ewD(3VyS3BAxO5rKeIUm%II+#J|UaqOGhu6@_!%IP|GN@m6 zxJKTG?nGsgPnC-QE|+TpRrs;SaQMGreUHQT^eu1*Llv<zWmTOFovTGd=XiRZ^Sq=) zWx;#l8Vs_0sq&IojGb?=qaSIbCF6QdK*3_gmh5$Ys_;3`G9)CV|5^{THyaq4sDr2N zP|Re)4L`H^zQS|nJuIlH+WxNDo_!ZiZV)BJ4-baC86L7$Re$8}*s>#^%H`endVC)5 z-7E8~*ZFkkN{`p)>0VaB-S>DqS9(`^yHO4Gk!(MEkl3DRwcXaT&^Zo^j@O_iY=jUG zaz$#@o1zjHs0I&vBLn|6JfufzJ<!x6wY^|pBe{!?9;st&K|u13UZY4|`oae!e|(YD z1%M)T^hj<H1ce^SsWuZLgZc>C0K(!xKch{G)TZ0lN$!WGwlz|#0$zPE^cIc-ZNwii zQAD3(_JHIbb%1Go!Gn@FCUrmzpkHyp^7tI(f!KR{9p({dd9bS<o)ADi_`}9BYz$AO zC48(G$AA#?HoyW6u&o@snQ0Qz0X)gE0mMR5>lo%aYF8w;?r2&kwL$7ID;3#Sxa=d1 zWY^YY@rXIXWq*OPwfWm1xgTA`Bw+%3n|D^*8=ApcpfayG{|+omAiUBV^w&!6L7~p# zU(V$&*UJT^;YCfeRqIOg^Dw@Z%g!Nh>Z=wAEEX>irCJ~XsV@QrvStb@<QSC5M^Gal z!wMdU`8Xjtdz$Tku)(-$Io>oRIj4?&^zrc%eNvykaP*q71x3dT_5(Zy4A)FJWe)On zWh0pe?G3*S2(iOoBeLU5t^wKcb!ei6&~Gx>XL}1Uyg(q%_5ifmz5;$b$4>)C664FE zjq<I0?b)6H4ELoC;t>%Et}+}?y9!|~BRv2Q$_uKsFyETI7)Nd=P^1mWPOfc$qC93@ zPyNspF&IZ4wZNaYz{f4{mjS;4GTYAQhwXj9UW4a)@=e(d9Ldjq33&rJ${*zNJsig~ z2l4Y97iYn{9QX4Y6Zi)lA2;DM96!x*aW0(VxF{`lHUM^(<J)=3v2y^hd5%wVob7qQ z@Y9y%%NLOCWx%iH_(6`dy$kq_fH#`|r53nP*x@D3_BGg9Z6U8(;3OH1d7>nn%cOV2 zJ&9~4;_;GfJQWK>auIcRj11*-YI^tXNQyOmq77<lIt5xul1V?lad40%Qi)t5l1yad zG0zI$JzXTcHng!v357SVS+l8kb9l4T6Y33<SmLLNTqOB$CXtJiSUeeda(yD2NoV8H zbSjpuAQ+UE-W^At#UC{pk7TeBNMwgVg<<(jHqAhlwR)0?)Gi#@1koG9>`P}Muyl&) z?2Kdr@j-0%<#SQ!@h0=qmr0~@gCrb&ESnl)?QnGGF6d`-k?1aLhX*5xB&q}<S+YBl zOs1n`D3My9j>Tc}fm$kz?cf`r4IdPYzGuL1G~n$9+$bNmz+bn(|7?MOZGry~>H!JM z(CD|v0*`Y1E|AAuL|$)L;1?|Ls~pE|XFS`k<NMHz-(i8P95=_a!9sq(0?%9EFIw1t z%|iZd3;d`B{+We+J3mLvd3ACe)vhzlf7C+$MUI=-_Y({GQx@`WzDQ=j&u|>s_YLtR z`FVu+?FRfY1CBK>>gN>${sRO4I>*s3+7j|_bKE>XzcI<fg`Sa(zcS78A&#SM*<k-q z2HdzW{${}MFv$PIfE(q%GT=t}+xV*&{Tk($8E~U~mjTCb12GSeSl~kz_;VKcn-=)H z1|09@!tbO3zr}$6(SYA-z-J6NzGH=*8~K$5=fRlQT^6`vfp4|IM=fxy10?ioJcnEO zxnz##=N9-$3*3#yfv|4z5rp3bNCNj(y5xDz1%8_M-!b9hURg5X;y&fz@d!KO-sCpn z;@*V!2P7fy#|DsQ!o|I5n+ZS7<%dkTxHr9O!o|JmLlZ9UO-^o4#Iqe20?2E^4|05) z8Rz?-c(PCK&P8?r&t)onr)Xv1w&BUepU4qU3~o2Xvm=`&4DjSr$;7UB@=4;!q$^`l zxb(zRAeu_&;-0k|w%pBb0U&@@;yc5GnF!oa{$Fx~0h|(kTvW~ZdFueLV=-X9Bi;rB zI3<1|!1>>WAUBNn67(a?v2ShY-^p=){6nuoCxoB?IOoe(Me(}_Ma}v%T;FVlFJD!^ z6IzY(7y4B}-Z1<3bA4V8RdJy&ra=st`x@8x3IWbf^T5S-iWnCD1^+SE7vqB8)cDhj z<tk*555j}C%<;EzeX-9_7RfxH5x^R*KfiDe^FVR^(WKB9>wi69=CuQeY~=z&*fEgE nTR@Fs$FWQBza*q_ZXE9{=*#RMV`}98c^3=-tur|^b;*AK@d7G| literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c new file mode 100644 index 00000000..accd5c3a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c @@ -0,0 +1,673 @@ +/* + * lcd128x64.c: + * Graphics-based LCD driver. + * This is designed to drive the parallel interface LCD drivers + * based on the generic 12864H chips + * + * There are many variations on these chips, however they all mostly + * seem to be similar. + * This implementation has the Pins from the Pi hard-wired into it, + * in particular wiringPi pins 0-7 so that we can use + * digitalWriteByete() to speed things up somewhat. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> + +#include <wiringPi.h> + +#include "font.h" +#include "lcd128x64.h" + +// Size + +#define LCD_WIDTH 128 +#define LCD_HEIGHT 64 + +// Hardware Pins +// Note pins 0-7 are the 8-bit data port + +#define CS1 10 +#define CS2 11 +#define STROBE 12 +#define RS 13 + +// Software copy of the framebuffer +// it's 8-bit deep although the display itself is only 1-bit deep. + +static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ; + +static int maxX, maxY ; +static int lastX, lastY ; +static int xOrigin, yOrigin ; +static int lcdOrientation = 0 ; + +/* + * strobe: + * Toggle the strobe (Really the "E") pin to the device. + * According to the docs, data is latched on the falling edge. + ********************************************************************************* + */ + +static void strobe (void) +{ + digitalWrite (STROBE, 1) ; delayMicroseconds (1) ; + digitalWrite (STROBE, 0) ; delayMicroseconds (5) ; +} + + +/* + * sentData: + * Send an data or command byte to the display. + ********************************************************************************* + */ + +static void sendData (const int data, const int chip) +{ + digitalWrite (chip, 0) ; + digitalWriteByte (data) ; + strobe () ; + digitalWrite (chip, 1) ; +} + + +/* + * sendCommand: + * Send a command byte to the display + ********************************************************************************* + */ + +static void sendCommand (const int command, const int chip) +{ + digitalWrite (RS, 0) ; + sendData (command, chip) ; + digitalWrite (RS, 1) ; +} + + +/* + * setCol: SetLine: + * Set the column and line addresses + ********************************************************************************* + */ + +static void setCol (int col, const int chip) + { sendCommand (0x40 | (col & 0x3F), chip) ; } + +static void setLine (int line, const int chip) + { sendCommand (0xB8 | (line & 0x07), chip) ; } + + +/* + * lcd128x64update: + * Copy our software version to the real display + ********************************************************************************* + */ + +void lcd128x64update (void) +{ + int line, x, y, fbLoc ; + unsigned char byte ; + +// Left side + + for (line = 0 ; line < 8 ; ++line) + { + setCol (0, CS1) ; + setLine (line, CS1) ; + + for (x = 63 ; x >= 0 ; --x) + { + byte = 0 ; + for (y = 0 ; y < 8 ; ++y) + { + fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; + if (frameBuffer [fbLoc] != 0) + byte |= (1 << y) ; + } + sendData (byte, CS1) ; + } + } + +// Right side + + for (line = 0 ; line < 8 ; ++line) + { + setCol (0, CS2) ; + setLine (line, CS2) ; + + for (x = 127 ; x >= 64 ; --x) + { + byte = 0 ; + for (y = 0 ; y < 8 ; ++y) + { + fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; + if (frameBuffer [fbLoc] != 0) + byte |= (1 << y) ; + } + sendData (byte, CS2) ; + } + } +} + + +/* + * lcd128x64setOrigin: + * Set the display offset origin + ********************************************************************************* + */ + +void lcd128x64setOrigin (int x, int y) +{ + xOrigin = x ; + yOrigin = y ; +} + + +/* + * lcd128x64setOrientation: + * Set the display orientation: + * 0: Normal, the display is portrait mode, 0,0 is top left + * 1: Landscape + * 2: Portrait, flipped + * 3: Landscape, flipped + ********************************************************************************* + */ + +void lcd128x64setOrientation (int orientation) +{ + lcdOrientation = orientation & 3 ; + + lcd128x64setOrigin (0,0) ; + + switch (lcdOrientation) + { + case 0: + maxX = LCD_WIDTH ; + maxY = LCD_HEIGHT ; + break ; + + case 1: + maxX = LCD_HEIGHT ; + maxY = LCD_WIDTH ; + break ; + + case 2: + maxX = LCD_WIDTH ; + maxY = LCD_HEIGHT ; + break ; + + case 3: + maxX = LCD_HEIGHT ; + maxY = LCD_WIDTH ; + break ; + } +} + + +/* + * lcd128x64orientCoordinates: + * Adjust the coordinates given to the display orientation + ********************************************************************************* + */ + +void lcd128x64orientCoordinates (int *x, int *y) +{ + register int tmp ; + + *x += xOrigin ; + *y += yOrigin ; + *y = maxY - *y - 1 ; + + switch (lcdOrientation) + { + case 0: + break; + + case 1: + tmp = maxY - *y - 1 ; + *y = *x ; + *x = tmp ; + break; + + case 2: + *x = maxX - *x - 1 ; + *y = maxY - *y - 1 ; + break; + + case 3: + *x = maxX - *x - 1 ; + tmp = *y ; + *y = *x ; + *x = tmp ; + break ; + } +} + + +/* + * lcd128x64getScreenSize: + * Return the max X & Y screen sizes. Needs to be called again, if you + * change screen orientation. + ********************************************************************************* + */ + +void lcd128x64getScreenSize (int *x, int *y) +{ + *x = maxX ; + *y = maxY ; +} + + +/* + ********************************************************************************* + * Standard Graphical Functions + ********************************************************************************* + */ + + +/* + * lcd128x64point: + * Plot a pixel. + ********************************************************************************* + */ + +void lcd128x64point (int x, int y, int colour) +{ + lastX = x ; + lastY = y ; + + lcd128x64orientCoordinates (&x, &y) ; + + if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT)) + return ; + + frameBuffer [x + y * LCD_WIDTH] = colour ; +} + + +/* + * lcd128x64line: lcd128x64lineTo: + * Classic Bressenham Line code + ********************************************************************************* + */ + +void lcd128x64line (int x0, int y0, int x1, int y1, int colour) +{ + int dx, dy ; + int sx, sy ; + int err, e2 ; + + lastX = x1 ; + lastY = y1 ; + + dx = abs (x1 - x0) ; + dy = abs (y1 - y0) ; + + sx = (x0 < x1) ? 1 : -1 ; + sy = (y0 < y1) ? 1 : -1 ; + + err = dx - dy ; + + for (;;) + { + lcd128x64point (x0, y0, colour) ; + + if ((x0 == x1) && (y0 == y1)) + break ; + + e2 = 2 * err ; + + if (e2 > -dy) + { + err -= dy ; + x0 += sx ; + } + + if (e2 < dx) + { + err += dx ; + y0 += sy ; + } + } + +} + +void lcd128x64lineTo (int x, int y, int colour) +{ + lcd128x64line (lastX, lastY, x, y, colour) ; +} + + +/* + * lcd128x64rectangle: + * A rectangle is a spoilt days fishing + ********************************************************************************* + */ + +void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) +{ + register int x ; + + if (filled) + { + /**/ if (x1 == x2) + lcd128x64line (x1, y1, x2, y2, colour) ; + else if (x1 < x2) + for (x = x1 ; x <= x2 ; ++x) + lcd128x64line (x, y1, x, y2, colour) ; + else + for (x = x2 ; x <= x1 ; ++x) + lcd128x64line (x, y1, x, y2, colour) ; + } + else + { + lcd128x64line (x1, y1, x2, y1, colour) ; + lcd128x64lineTo (x2, y2, colour) ; + lcd128x64lineTo (x1, y2, colour) ; + lcd128x64lineTo (x1, y1, colour) ; + } +} + + +/* + * lcd128x64circle: + * This is the midpoint circle algorithm. + ********************************************************************************* + */ + +void lcd128x64circle (int x, int y, int r, int colour, int filled) +{ + int ddF_x = 1 ; + int ddF_y = -2 * r ; + + int f = 1 - r ; + int x1 = 0 ; + int y1 = r ; + + if (filled) + { + lcd128x64line (x, y + r, x, y - r, colour) ; + lcd128x64line (x + r, y, x - r, y, colour) ; + } + else + { + lcd128x64point (x, y + r, colour) ; + lcd128x64point (x, y - r, colour) ; + lcd128x64point (x + r, y, colour) ; + lcd128x64point (x - r, y, colour) ; + } + + while (x1 < y1) + { + if (f >= 0) + { + y1-- ; + ddF_y += 2 ; + f += ddF_y ; + } + x1++ ; + ddF_x += 2 ; + f += ddF_x ; + if (filled) + { + lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ; + lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ; + lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ; + lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ; + } + else + { + lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ; + lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ; + lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ; + lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ; + } + } +} + + +/* + * lcd128x64ellipse: + * Fast ellipse drawing algorithm by + * John Kennedy + * Mathematics Department + * Santa Monica College + * 1900 Pico Blvd. + * Santa Monica, CA 90405 + * jrkennedy6@gmail.com + * -Confirned in email this algorithm is in the public domain -GH- + ********************************************************************************* + */ + +static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled) +{ + if (filled) + { + lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ; + lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ; + } + else + { + lcd128x64point (cx + x, cy + y, colour) ; + lcd128x64point (cx - x, cy + y, colour) ; + lcd128x64point (cx - x, cy - y, colour) ; + lcd128x64point (cx + x, cy - y, colour) ; + } +} + +void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) +{ + int x, y ; + int xChange, yChange, ellipseError ; + int twoAsquare, twoBsquare ; + int stoppingX, stoppingY ; + + twoAsquare = 2 * xRadius * xRadius ; + twoBsquare = 2 * yRadius * yRadius ; + + x = xRadius ; + y = 0 ; + + xChange = yRadius * yRadius * (1 - 2 * xRadius) ; + yChange = xRadius * xRadius ; + + ellipseError = 0 ; + stoppingX = twoBsquare * xRadius ; + stoppingY = 0 ; + + while (stoppingX >= stoppingY) // 1st set of points + { + plot4ellipsePoints (cx, cy, x, y, colour, filled) ; + ++y ; + stoppingY += twoAsquare ; + ellipseError += yChange ; + yChange += twoAsquare ; + + if ((2 * ellipseError + xChange) > 0 ) + { + --x ; + stoppingX -= twoBsquare ; + ellipseError += xChange ; + xChange += twoBsquare ; + } + } + + x = 0 ; + y = yRadius ; + + xChange = yRadius * yRadius ; + yChange = xRadius * xRadius * (1 - 2 * yRadius) ; + + ellipseError = 0 ; + stoppingX = 0 ; + stoppingY = twoAsquare * yRadius ; + + while (stoppingX <= stoppingY) //2nd set of points + { + plot4ellipsePoints (cx, cy, x, y, colour, filled) ; + ++x ; + stoppingX += twoBsquare ; + ellipseError += xChange ; + xChange += twoBsquare ; + + if ((2 * ellipseError + yChange) > 0 ) + { + --y ; + stoppingY -= twoAsquare ; + ellipseError += yChange ; + yChange += twoAsquare ; + } + } +} + + +/* + * lcd128x64putchar: + * Print a single character to the screen + ********************************************************************************* + */ + +void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) +{ + int y1, y2 ; + + unsigned char line ; + unsigned char *fontPtr ; + +// Can't print if we're offscreen + +//if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight))) +// return ; + + fontPtr = font + c * fontHeight ; + + for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1) + { + y2 = y + y1 ; + line = *fontPtr++ ; + lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ; + lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ; + } +} + + +/* + * lcd128x64puts: + * Send a string to the display. Obeys \n and \r formatting + ********************************************************************************* + */ + +void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) +{ + int c, mx, my ; + + mx = x ; my = y ; + + while (*str) + { + c = *str++ ; + + if (c == '\r') + { + mx = x ; + continue ; + } + + if (c == '\n') + { + mx = x ; + my -= fontHeight ; + continue ; + } + + lcd128x64putchar (mx, my, c, bgCol, fgCol) ; + + mx += fontWidth ; + if (mx >= (maxX - fontWidth)) + { + mx = 0 ; + my -= fontHeight ; + } + } +} + + +/* + * lcd128x64clear: + * Clear the display to the given colour. + ********************************************************************************* + */ + +void lcd128x64clear (int colour) +{ + register int i ; + register unsigned char *ptr = frameBuffer ; + + for (i = 0 ; i < (maxX * maxY) ; ++i) + *ptr++ = colour ; +} + + + + +/* + * lcd128x64setup: + * Initialise the display and GPIO. + ********************************************************************************* + */ + +int lcd128x64setup (void) +{ + int i ; + + for (i = 0 ; i < 8 ; ++i) + pinMode (i, OUTPUT) ; + + digitalWrite (CS1, 1) ; + digitalWrite (CS2, 1) ; + digitalWrite (STROBE, 0) ; + digitalWrite (RS, 1) ; + + pinMode (CS1, OUTPUT) ; + pinMode (CS2, OUTPUT) ; + pinMode (STROBE, OUTPUT) ; + pinMode (RS, OUTPUT) ; + + sendCommand (0x3F, CS1) ; // Display ON + sendCommand (0xC0, CS1) ; // Set display start line to 0 + + sendCommand (0x3F, CS2) ; // Display ON + sendCommand (0xC0, CS2) ; // Set display start line to 0 + + lcd128x64clear (0) ; + lcd128x64setOrientation (0) ; + lcd128x64update () ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h new file mode 100644 index 00000000..b448bbc8 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h @@ -0,0 +1,39 @@ +/* + * lcd128x64.h: + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +extern void lcd128x64setOrigin (int x, int y) ; +extern void lcd128x64setOrientation (int orientation) ; +extern void lcd128x64orientCoordinates (int *x, int *y) ; +extern void lcd128x64getScreenSize (int *x, int *y) ; +extern void lcd128x64point (int x, int y, int colour) ; +extern void lcd128x64line (int x0, int y0, int x1, int y1, int colour) ; +extern void lcd128x64lineTo (int x, int y, int colour) ; +extern void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) ; +extern void lcd128x64circle (int x, int y, int r, int colour, int filled) ; +extern void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ; +extern void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) ; +extern void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) ; +extern void lcd128x64update (void) ; +extern void lcd128x64clear (int colour) ; + +extern int lcd128x64setup (void) ; diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o new file mode 100644 index 0000000000000000000000000000000000000000..3efe19e452fa56c4822a502af4403b6d75fed381 GIT binary patch literal 11472 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 Wm+b4)v7KrC{qh0$zHLF<ko_;fYeHoJ literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0 b/modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0 new file mode 100755 index 0000000000000000000000000000000000000000..445f4b488f0dbc0bb236fc36f1c0ba6d1476e284 GIT binary patch literal 31136 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 HbIbp~f-sKk literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c new file mode 100755 index 00000000..23eabf80 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c @@ -0,0 +1,165 @@ +/* + * maxdetect.c: + * Driver for the MaxDetect series sensors + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +//#include <stdio.h> +//#include <stdlib.h> +//#include <unistd.h> + +#include <wiringPi.h> + +#include "maxdetect.h" + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + + +/* + * maxDetectLowHighWait: + * Wait for a transition from high to low on the bus + ********************************************************************************* + */ + +static void maxDetectLowHighWait (const int pin) +{ + unsigned int timeOut = millis () + 2000 ; + + while (digitalRead (pin) == HIGH) + if (millis () > timeOut) + return ; + + while (digitalRead (pin) == LOW) + if (millis () > timeOut) + return ; +} + + +/* + * maxDetectClockByte: + * Read in a single byte from the MaxDetect bus + ********************************************************************************* + */ + +static unsigned int maxDetectClockByte (const int pin) +{ + unsigned int byte = 0 ; + int bit ; + + for (bit = 0 ; bit < 8 ; ++bit) + { + maxDetectLowHighWait (pin) ; + +// bit starting now - we need to time it. + + delayMicroseconds (30) ; + byte <<= 1 ; + if (digitalRead (pin) == HIGH) // It's a 1 + byte |= 1 ; + } + + return byte ; +} + + +/* + * maxDetectRead: + * Read in and return the 4 data bytes from the MaxDetect sensor. + * Return TRUE/FALSE depending on the checksum validity + ********************************************************************************* + */ + +int maxDetectRead (const int pin, unsigned char buffer [4]) +{ + int i ; + unsigned int checksum ; + unsigned char localBuf [5] ; + +// Wake up the RHT03 by pulling the data line low, then high +// Low for 10mS, high for 40uS. + + pinMode (pin, OUTPUT) ; + digitalWrite (pin, 0) ; delay (10) ; + digitalWrite (pin, 1) ; delayMicroseconds (40) ; + pinMode (pin, INPUT) ; + +// Now wait for sensor to pull pin low + + maxDetectLowHighWait (pin) ; + +// and read in 5 bytes (40 bits) + + for (i = 0 ; i < 5 ; ++i) + localBuf [i] = maxDetectClockByte (pin) ; + + checksum = 0 ; + for (i = 0 ; i < 4 ; ++i) + { + buffer [i] = localBuf [i] ; + checksum += localBuf [i] ; + } + checksum &= 0xFF ; + + return checksum == localBuf [4] ; +} + + +/* + * readRHT03: + * Read the Temperature & Humidity from an RHT03 sensor + ********************************************************************************* + */ + +int readRHT03 (const int pin, int *temp, int *rh) +{ + static unsigned int nextTime = 0 ; + static int lastTemp = 0 ; + static int lastRh = 0 ; + static int lastResult = TRUE ; + + unsigned char buffer [4] ; + +// Don't read more than once a second + + if (millis () < nextTime) + { + *temp = lastTemp ; + *rh = lastRh ; + return lastResult ; + } + + lastResult = maxDetectRead (pin, buffer) ; + + if (lastResult) + { + *temp = lastTemp = (buffer [2] * 256 + buffer [3]) ; + *rh = lastRh = (buffer [0] * 256 + buffer [1]) ; + nextTime = millis () + 2000 ; + return TRUE ; + } + else + { + return FALSE ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h new file mode 100755 index 00000000..a1fd742e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h @@ -0,0 +1,40 @@ +/* + * maxdetect.h: + * Driver for the MaxDetect series sensors + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#ifdef __cplusplus +extern "C" { +#endif + +// Main generic function + +int maxDetectRead (const int pin, unsigned char buffer [4]) ; + +// Individual sensors + +int readRHT03 (const int pin, int *temp, int *rh) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.o b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.o new file mode 100644 index 0000000000000000000000000000000000000000..924f414a6ca9a33a4791cd54c4fd69830e8133b0 GIT binary patch literal 3312 zcmbW3Uu;uV7{JeMJ65-GTVawKjBE62YLsg`#<Gbay<NNAVG%Mqi6Yd}-mzx=m-aR= zAM~Mu+>GfoJir@ICKw+u8e(F?YQ_ssVt6n<>5~#mf;<R3p!56AJ!d<+YhV15+jG9( z_wW3@w;v{w<1R@eTqLrOtZSSSa`lPzew22jWGm?*(}%5p^u}H99b}6aZ*>#W>hlc{ zs*kQzpSSMOZsU<;wpu+)ocA(*rfJ^Q8#la1kFEFy;)G~Nw6`X$huXB3x{l*u`9nE< z!Sg~0fNsT=K%`0YL>^f8l8Xh!PqpP9Fdwk)QiTSy8p{~B7C<{-iLI`#PA(?8FrjzG zH}DZS5%RqkeiD%fT(|Beqz89)fba6NVBx{&8n^B@Zb~q*xG#Rc(UR)76X%AM$;J&S zxi_bH>)%G2k(-+DTB?g^=lZ+#MpKf0(i@LF^*<xck)+b^yU^4ZOeK)hcMs9I)qSuO zp`*vNceP{MaV@<<%fV{SsC+zHYFe`%AJ(nEb?Y`Pynn;Oc-g}2?ZN@p1{Y{+B?#-d z?N(n%Dqg7CXIC|#svoPa%q;2F?{Vu7TK7!TqT%K(-?g~nf{7^ZAAa*npr#ZFlG<k9 zHIG8E<+cG0?!uE`>)+u%wiYP1&(_4)*lWSi^oe@OtOxg~Luz=}aGh$A4<f^Act{<6 z$>zbqaAY_<93I8_p!C}fk=~yo(rLf6v#;B`1O*h}&oJ8?*lM!>tV@#v4fnVlbVcO= z08RGlV1i>tWjhWmCi_2i#pJ*z?t~m%^u*-Q`L1y}e0GZ_k2Jc+<@a2z9(hEQ!<rn5 z$wBahh?wlvdPx|<m+Vwz8C$TN$C_u|aXHxV?3cqXy+;lLf#MJ|*2}y%H#igzxxc#E zLWsNVjYRHl=ML1<fz$omVA~3sOUO^x4%l<>NRY?Nym>~PGjgu;b|2%+ea*g~^7V0Y zfAn(`I3sPuy;gOj(M`5&1fabGkAD*-q|$+(>cAVox53N~v0U_QK>xE2{+BxNFFNqA zI`Hcq_>aJGJQX|`AoP4;r<ggNGfX3Es#)yEX+K#$rRPu19?9fQQZi1PseI8;;p&7* zAyYF`MzMlgglbc>*dMg}My*~jQQu9{6Ul=yEtx(zK7KfnN~g3~GLa_5e4&u9kzD>{ z-pmxHj7)C5D%C3a(t&c$;2uY+c@q?)keRoC59G7ea?Qw=OSu|Jr)y>=JD1MR&ZTEE z`2wjz!YMr!-i=d3;hz~iCq8%{!<!f7X*7a3xng6=@f>jfh`_}>uM1rCpBMNxA<xGG z-!AYA0>^g}uX|bGqW_lye@gKGM&M%IzXUG&KNPq){xmx$xIR1J;p6#S;Nm)5WZVV5 z7=sVWWe2w@Ay*un=l@#Zc*{BenQ_efq`-ge;Qz0{`B<>F4+jXs$I0{eGmgIEyapWp zJlD&Dzqmd@Ob&u(=0bJ+PM~mp$W{s8ch33!Bx-HGXl718YgX-cmiMY~8&ngnB~f!3 zGegu9wHl#7t(OY<IioO7)NHv}G)mx7Dw~En@#gd{dR2%@qm9}0Of^$9*eL#g6NFG) zYUi6Y3Jm2{aS=erGbYMTP;gD7B82`DOITs?_@%=-{QD7L{x34V{zb42JdW=db6-1` zTz>^Rn9~_=vbufTk+sfz_+Dr?e;)4$r@kVKviPtFq0i&@I5<1jYk4MFyu*!LajZMH z^LVZwXYo$=s|+-`BWwBkbNn`R+U*~I@$z$z`-ibSp6?&tW#`%hB076<&!QrTbNr|~ g$Byn5mNd$YxQ{YC&iYuUUHz-<ugx!D7sXlsKW$kS2mk;8 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.c b/modules/catkin_ws/src/wiringPi/devLib/piFace.c new file mode 100644 index 00000000..4475c7f5 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piFace.c @@ -0,0 +1,112 @@ +/* + * piFace.: + * This file to interface with the PiFace peripheral device which + * has an MCP23S17 GPIO device connected via the SPI bus. + * + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdint.h> + +#include <wiringPi.h> +#include <mcp23s17.h> + +#include "piFace.h" + + +/* + * myDigitalWrite: + * Perform the digitalWrite function on the PiFace board + ********************************************************************************* + */ + +void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + digitalWrite (pin + 16, value) ; +} + + +/* + * myDigitalRead: + * Perform the digitalRead function on the PiFace board + * With a slight twist - if we read from base + 8, then we + * read from the output latch... + ********************************************************************************* + */ + +int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + if ((pin - node->pinBase) >= 8) + return digitalRead (pin + 8) ; + else + return digitalRead (pin + 16 + 8) ; +} + + +/* + * myPullUpDnControl: + * Perform the pullUpDnControl function on the PiFace board + ********************************************************************************* + */ + +void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud) +{ + pullUpDnControl (pin + 16 + 8, pud) ; +} + + +/* + * piFaceSetup + * We're going to create an instance of the mcp23s17 here, then + * provide our own read/write routines on-top of it... + * The supplied PiFace code (in Pithon) treats it as an 8-bit device + * where you write the output ports and read the input port using the + * same pin numbers, however I have had a request to be able to read + * the output port, so reading 8..15 will read the output latch. + ********************************************************************************* + */ + +int piFaceSetup (const int pinBase) +{ + int i ; + struct wiringPiNodeStruct *node ; + +// Create an mcp23s17 instance: + + mcp23s17Setup (pinBase + 16, 0, 0) ; + +// Set the direction bits + + for (i = 0 ; i < 8 ; ++i) + { + pinMode (pinBase + 16 + i, OUTPUT) ; // Port A is the outputs + pinMode (pinBase + 16 + 8 + i, INPUT) ; // Port B inputs. + } + + node = wiringPiNewNode (pinBase, 16) ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->pullUpDnControl = myPullUpDnControl ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.h b/modules/catkin_ws/src/wiringPi/devLib/piFace.h new file mode 100644 index 00000000..49653144 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piFace.h @@ -0,0 +1,32 @@ +/* + * piFace.h: + * Control the PiFace Interface board for the Raspberry Pi + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int piFaceSetup (const int pinBase) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.o b/modules/catkin_ws/src/wiringPi/devLib/piFace.o new file mode 100644 index 0000000000000000000000000000000000000000..cb2516fe77c25f4adee5e4806ec33ed7a42cd119 GIT binary patch literal 2376 zcmbW2%}*0i5WuGeZB=M1exwEy_Fxo0Si1-a#+bI050eT6s2>rnOIcvU_9N{!fF?kK zAvW5?cru<$ycm!E0mOv=z=KyzJgD)a9*74LoY}rdpPOx>PV#nUes5;p>%5oO<-T~o z+vNf-F1P|!k5d5e-l`q8%rG><ekd;mN*}%wnD)2C0R7+}e(C#J&+0GFvL7d`Fn`Mm zMVFVnmKzz5l(rLN<zygIHckYU_sUjj^9w~(>XkOvX*(7vKkzDBs~axM>G@Xt6f1pR z5AfN+$44k_urv~?n%z~iRe5*&PGn*O26}rhNv(;=V#X{=opOg9YU?Ump0cEL$)OIp z=X8Zj?IEQr)D`LhI83!sT=z%8wGePMH+Z~Hac8vracc&!8x<iIa$wjVOC+XSQQu^C zo^;d~c;b%vf@^gVpR`)<p78}EzChIHWkC*#no|!yb{wXl&haDxd7V=@()t>FPYv#= z!JRi;2f`&{nbfl;VV}H*$B<JW?Q$N06Tgg{>hL*UXQ)Q}T^28)CXuW!fPtFVV8~Jn z_@(+`2Cef#`ymde_-8fviy9nqdcT^|<P@YAWBQD4s>Y4HZfcMmh!002@#JuS|5)F6 zay$}^_a$LU3`sAJ6b&Phi)DJV88e?XAZPP;YmRE_6i>G7%CcjcS<FE?m21CHP%c)y zoSwOsozh@l&+D0)5q(ITA0odZ*O{gpa}dY&PDN$~-X!p14ZbGuLqdF+@iVA>0)H;> zeFA?a@CJeN8%O&*An>Cso_M3c+XU_xINdK2iWj*=5XH@g<>04-8JzPwGHBxx^CxUP z%zTgwi)mAxL~Z6PdX`&x%}`}iTQEVMQcV@)$wC1vAQv-+KBpOrAg8kFw3fk;OxD!o zfuTfO!BkUoAY0kmY;roUrunJzMgLt(m_lz6?>DayX2x3%nCAW9xET%VZI}b5y9uIr zsW=LqA({Mz2@*s(iG#TPW&25!4#LXq&YVMwYW{D&g1J=F{`>!S{V>Z9p%#VbcZv{g zzJIQ-3QP<=#REj>5KHeNh0=W$rIqEch!Abwe~xdV;dFjs_SbQb1=9IZF3;!ZM{kI| r_muLI<<F8Mi2Y|d?VZA3v%rr`)7wDrhJAfvPU}Bn@D0w3VqgC^baEY& literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.c b/modules/catkin_ws/src/wiringPi/devLib/piGlow.c new file mode 100644 index 00000000..44e3db8e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piGlow.c @@ -0,0 +1,118 @@ +/* + * piGlow.c: + * Easy access to the Pimoroni PiGlow board. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <sn3218.h> + +#include "piGlow.h" + +#define PIGLOW_BASE 577 + +static int leg0 [6] = { 6, 7, 8, 5, 4, 9 } ; +static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ; +static int leg2 [6] = { 0, 1, 2, 3, 14, 12 } ; + + +/* + * piGlow1: + * Light up an individual LED + ********************************************************************************* + */ + +void piGlow1 (const int leg, const int ring, const int intensity) +{ + int *legLeds ; + + if ((leg < 0) || (leg > 2)) return ; + if ((ring < 0) || (ring > 5)) return ; + + /**/ if (leg == 0) + legLeds = leg0 ; + else if (leg == 1) + legLeds = leg1 ; + else + legLeds = leg2 ; + + analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ; +} + +/* + * piGlowLeg: + * Light up all 6 LEDs on a leg + ********************************************************************************* + */ + +void piGlowLeg (const int leg, const int intensity) +{ + int i ; + int *legLeds ; + + if ((leg < 0) || (leg > 2)) + return ; + + /**/ if (leg == 0) + legLeds = leg0 ; + else if (leg == 1) + legLeds = leg1 ; + else + legLeds = leg2 ; + + for (i = 0 ; i < 6 ; ++i) + analogWrite (PIGLOW_BASE + legLeds [i], intensity) ; +} + + +/* + * piGlowRing: + * Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost + ********************************************************************************* + */ + +void piGlowRing (const int ring, const int intensity) +{ + if ((ring < 0) || (ring > 5)) + return ; + + analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ; + analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ; + analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ; +} + +/* + * piGlowSetup: + * Initialise the board & remember the pins we're using + ********************************************************************************* + */ + +void piGlowSetup (int clear) +{ + sn3218Setup (PIGLOW_BASE) ; + + if (clear) + { + piGlowLeg (0, 0) ; + piGlowLeg (1, 0) ; + piGlowLeg (2, 0) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.h b/modules/catkin_ws/src/wiringPi/devLib/piGlow.h new file mode 100644 index 00000000..a4d89d01 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piGlow.h @@ -0,0 +1,45 @@ +/* + * piglow.h: + * Easy access to the Pimoroni PiGlow board. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#define PIGLOW_RED 0 +#define PIGLOW_ORANGE 1 +#define PIGLOW_YELLOW 2 +#define PIGLOW_GREEN 3 +#define PIGLOW_BLUE 4 +#define PIGLOW_WHITE 5 + + +#ifdef __cplusplus +extern "C" { +#endif + +extern void piGlow1 (const int leg, const int ring, const int intensity) ; +extern void piGlowLeg (const int leg, const int intensity) ; +extern void piGlowRing (const int ring, const int intensity) ; +extern void piGlowSetup (int clear) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.o b/modules/catkin_ws/src/wiringPi/devLib/piGlow.o new file mode 100644 index 0000000000000000000000000000000000000000..d5f04a6a48200162f01b3ebc5925a524290a17be GIT binary patch literal 2768 zcmbVOO>7%Q6dv0NF-f~I6$hh&Y6PlM(X6~7O-TvJ&hJ_>gw{z5gkl_b^P@UW6z`Ij z168#ol9gJr1c!<fM~*#msd{h~a^Q@Rs00$1qM}NuYJ~t{-nTn1*-RV>@uau!&G&w0 z=DnHSy*8E|4~Ig6DJ0$$yCX)0sCVq@DNjv_!=h8T&G6bQ?mz8o$Jd)??Jz9POJ;Ga z`u*n6_3PiJ!$SNDu>06&5aLl|uKU=i5YpGIwF7mVA+vjQ`@vQn`A)Al(^Jzqv-SdP z&dF@87_UC|<2EDJho;+Tt9^si_u-Hkyyx7XxtRWda@S?hp1eOixJ|+S{BE=T<1TLz z{&-q?=FH+x)yJm$TXb{iroV14xinWF9t@lA-RR84z+UI-b2`tLtNwLoXQk^uIvq0& zZ~w*<qv=gxJh_8<d-@CwXjgv4ur;4x2OJ^Rhz}7nJwr;2xSJT&?;`FbW_pSgv@S}F zQnwL5O)MrxM$RO9re~e9?Icd={d%%@!0|@Lr^bMu?AHfR_;{i(X$&L>l7k3)77wD( zC+9@yN-T8rP)D>*3&a|p_bft8O4&~`DfJ7G87+1roYvwSk+ha@+sX|sp5D@8!{2Gq zQ2-l}8`x(L@dEsbF5z)ji*1BWE$&7#TEd~Ah8Ckh><M#z0Ux3>c%-$M8$R2qMaR3& zdmaGy6KdKfesAu#pw6)Fr-;{qRyeA<pCVqx_u}YHi1MT)9G4RP1J1-a>J2<04UA(L z@j5FF0TJ=K9RQ>n5jYKd={Xu63GA19_afowsY<5_XoZgujy&(k0I%Pqza{Zo68HK^ z`nwWO$WnW~BMkOd`NhiOL}__VFN%^ipTwgN4@2UH$WLS^htt{o<oI}QY$`vM9?p*C zMWI|MEze(AU9>IfnYHGnc5boEYR<Bq6;Ua_+Go7x>*xoF@7<6;6t7Fk_}@*Rh83Le z!iNgZd9FzuCkJ<$^L(!OGybK5bN;&u&iU_2T+RQB;?H>=9pL|`;?L_jA^V2>M~E4J zBY>lZjAstOUzYjRb;bhz!TOvJ;KBR}nFoCVGvOTsVw}%s$%l7vKA$%goX@AwD_587 z!YoO9)t3vbty-mmZd+Gup<gQ41)<MYD#8PFr(9aRY?ZDGy|}!zWR=OKylh+g#M{%o z6}wQpEOam0TFB3>7M3hI`~MdS3Pp+3o1P*J^uDa0KiYrSj*<brNU?*Iaql}V#4Q<* z?+jGDgF*aWI!-$9-8UJmLVP9TaPNbp-u07YL{2sS4;defg|5Pe#MJ%&*Z7o-Pm&B0 z$Day<r1ShNGXX5<+8aES0RzV|g!ct7)jcTzKBw%@_2=<>q_pbawk*g;(h>bbEXQ;I y@IRr}9w9yQ|8D_<0IBP5wRX7wEZ4s+1Mm+6R_DjRNvrw4#-@l?e6jOX=l>U0o>q?l literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.c b/modules/catkin_ws/src/wiringPi/devLib/piNes.c new file mode 100644 index 00000000..a115050e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piNes.c @@ -0,0 +1,113 @@ +/* + * piNes.c: + * Driver for the NES Joystick controller on the Raspberry Pi + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> + +#include "piNes.h" + +#define MAX_NES_JOYSTICKS 8 + +#define NES_RIGHT 0x01 +#define NES_LEFT 0x02 +#define NES_DOWN 0x04 +#define NES_UP 0x08 +#define NES_START 0x10 +#define NES_SELECT 0x20 +#define NES_B 0x40 +#define NES_A 0x80 + + +#define PULSE_TIME 25 + +// Data to store the pins for each controller + +struct nesPinsStruct +{ + unsigned int cPin, dPin, lPin ; +} ; + +static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ; + +static int joysticks = 0 ; + + +/* + * setupNesJoystick: + * Create a new NES joystick interface, program the pins, etc. + ********************************************************************************* + */ + +int setupNesJoystick (int dPin, int cPin, int lPin) +{ + if (joysticks == MAX_NES_JOYSTICKS) + return -1 ; + + nesPins [joysticks].dPin = dPin ; + nesPins [joysticks].cPin = cPin ; + nesPins [joysticks].lPin = lPin ; + + digitalWrite (lPin, LOW) ; + digitalWrite (cPin, LOW) ; + + pinMode (lPin, OUTPUT) ; + pinMode (cPin, OUTPUT) ; + pinMode (dPin, INPUT) ; + + return joysticks++ ; +} + + +/* + * readNesJoystick: + * Do a single scan of the NES Joystick. + ********************************************************************************* + */ + +unsigned int readNesJoystick (int joystick) +{ + unsigned int value = 0 ; + int i ; + + struct nesPinsStruct *pins = &nesPins [joystick] ; + +// Toggle Latch - which presents the first bit + + digitalWrite (pins->lPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; + digitalWrite (pins->lPin, LOW) ; delayMicroseconds (PULSE_TIME) ; + +// Read first bit + + value = digitalRead (pins->dPin) ; + +// Now get the next 7 bits with the clock + + for (i = 0 ; i < 7 ; ++i) + { + digitalWrite (pins->cPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; + digitalWrite (pins->cPin, LOW) ; delayMicroseconds (PULSE_TIME) ; + value = (value << 1) | digitalRead (pins->dPin) ; + } + + return value ^ 0xFF ; +} diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.h b/modules/catkin_ws/src/wiringPi/devLib/piNes.h new file mode 100644 index 00000000..897f1815 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/devLib/piNes.h @@ -0,0 +1,45 @@ +/* + * piNes.h: + * Driver for the NES Joystick controller on the Raspberry Pi + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#define MAX_NES_JOYSTICKS 8 + +#define NES_RIGHT 0x01 +#define NES_LEFT 0x02 +#define NES_DOWN 0x04 +#define NES_UP 0x08 +#define NES_START 0x10 +#define NES_SELECT 0x20 +#define NES_B 0x40 +#define NES_A 0x80 + +#ifdef __cplusplus +extern "C" { +#endif + +extern int setupNesJoystick (int dPin, int cPin, int lPin) ; +extern unsigned int readNesJoystick (int joystick) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.o b/modules/catkin_ws/src/wiringPi/devLib/piNes.o new file mode 100644 index 0000000000000000000000000000000000000000..a080524846d668b735113e77e539d0ccc1096f7e GIT binary patch literal 2592 zcmbW2-)mE67{{N}WHxRZqjOMkV6KLO9uijzjxloT(q<CdVpC*j7t`cuV%rm!a{|f0 zS?DG^bb(y$a({z2f)`_61O|e4A_!jCJG~HO6vPXqd!9G%LmyAix!F_N_jy0h_j%sm zr?>OPsS(2fHUqwaogPzw%{@DQPPsYQ4<AFJ`VsZk-zGfIDlPa=3cbU*LQlbY%YWx@ z6?*Z$---Jf|FvIFWZ%3bz5kq@*MHM+8t(Yt`Y*I%L)E&x*qbw~EB<GcJ-B8bIQ9#9 zaDN+3^b6H(J-SuGsoY+eS2eA_Mp0boo$PPiN~pme96_KwBzh>x;=?Ho4jfxUA#B_N zRmga@D;pxS_YSP}S4Ml_KONt`yl7n+P^ExPpF8(e`uM_9+wt1zGv>INIW^H%z3k7~ z2{SWpo;@+->C>6)L}ns$mMR?9WsILLg3(DCNB4~;`nZ!Pk$<jZcc`67rhXr>l4Eyb zGs*ONe55!?j#>XCQ~5{91cpgpBpuqH^ruMrJn1c^{|)8I)T9zqJi_P@<M8ixSU47X zqX1&~6J{~26lO6{SK))uUhEk{&zYZUp4RHCx}_!tbQyMA3}{DoTMWeI*Wshs9un(P zdyS0tGo>}MnT+7G5&RNzs^8Z|)Y+haJwo4&;Bd1sW4mS*ZZx~D*QhSL;Mne5!*Rj2 zz4lEEp4Sm5PZwt=tzvn0YHB`TDwnLuV!jNu#`T6*S-I3|cs5pZE;MU4wCqYvrq=A0 zO7}ve+G@IXwdvGcPP>RgS^}T+2>NtJ@95p4jZqMdIp5tchgfO%qtE)UBX~jZq|lcl z_zw|WO%`K3A0GEdtq<})0-Wc6Pt=$5e;_#B6R!VIaH)SRxYR!r{Gh0_CAh5fUT|4w zRDbO0Or-vx;8K4?a5-*T*QfoVU$!~zFz<7~bi1owWeH5zYYp2vdo8?7re}9NFl!aB z0_KwIf&ymSS!pcWD_t<F&DB-gL5b7!Y;$^M;gsuDs>@)iY`b2*)~c-9Jlg+m)0jz1 z4t@c0$jD5+AH&}6w@=>*+S?opbXzBgwyE<!L7!ay0`a@}LUVpU*j45P#$_JF^gW`Q z!TdEXT;oLDrUU&f_DLFCKj#PJN-J3oJCvW15Pi-+6W~05Zok7g`%-!@42Edwos(4F zNvd;S=Xa<hjQ5|>_vnP3UqNpOuZzx)ayg&RkKRad?-4;q=hvwtEV!(&xsyDj7j#!A Z>_f(Lpg50D{~yD~-_-C|5(^8C{~u86cESJv literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c new file mode 100644 index 00000000..8797e492 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c @@ -0,0 +1,221 @@ +/* + * 7segments.c: + * Simple test program to see if we can drive a 7-segment LED + * display using the GPIO and little else on the Raspberry Pi + * + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + */ + +#undef PHOTO_HACK + +#include <wiringPi.h> + +#include <stdio.h> +#include <time.h> +#include <ctype.h> +#include <string.h> + +/* + * Segment mapping + * + * --a-- + * | | + * f b + * | | + * --g-- + * | | + * e c + * | | + * --d-- p + */ + +// GPIO Pin Mapping + +static int digits [6] = { 7, 11, 10, 13, 12, 14 } ; +static int segments [7] = { 6, 5, 4, 3, 2, 1, 0 } ; + + +static const int segmentDigits [] = +{ +// a b c d e f g Segments +// 6 5 4 3 2 1 0, // wiringPi pin No. + + 1, 1, 1, 1, 1, 1, 0, // 0 + 0, 1, 1, 0, 0, 0, 0, // 1 + 1, 1, 0, 1, 1, 0, 1, // 2 + 1, 1, 1, 1, 0, 0, 1, // 3 + 0, 1, 1, 0, 0, 1, 1, // 4 + 1, 0, 1, 1, 0, 1, 1, // 5 + 1, 0, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 0, 0, 0, 0, // 7 + 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 0, 1, 1, // 9 + 1, 1, 1, 0, 1, 1, 1, // A + 0, 0, 1, 1, 1, 1, 1, // b + 1, 0, 0, 1, 1, 1, 0, // C + 0, 1, 1, 1, 1, 0, 1, // d + 1, 0, 0, 1, 1, 1, 1, // E + 1, 0, 0, 0, 1, 1, 1, // F + 0, 0, 0, 0, 0, 0, 0, // blank +} ; + + +// display: +// A global variable which is written to by the main program and +// read from by the thread that updates the display. Only the first +// 6 characters are used. + +char display [8] ; + + +/* + * displayDigits: + * This is our thread that's run concurrently with the main program. + * Essentially sit in a loop, parsing and displaying the data held in + * the "display" global. + ********************************************************************************* + */ + +PI_THREAD (displayDigits) +{ + int digit, segment ; + int index, d, segVal ; + + piHiPri (50) ; + + for (;;) + { + for (digit = 0 ; digit < 6 ; ++digit) + { + for (segment = 0 ; segment < 7 ; ++segment) + { + d = toupper (display [digit]) ; + /**/ if ((d >= '0') && (d <= '9')) // Digit + index = d - '0' ; + else if ((d >= 'A') && (d <= 'F')) // Hex + index = d - 'A' + 10 ; + else + index = 16 ; // Blank + + segVal = segmentDigits [index * 7 + segment] ; + + digitalWrite (segments [segment], segVal) ; + } + digitalWrite (digits [digit], 1) ; + delay (2) ; + digitalWrite (digits [digit], 0) ; + } + } +} + + +/* + * setup: + * Initialise the hardware and start the thread + ********************************************************************************* + */ + +void setup (void) +{ + int i, c ; + + wiringPiSetup () ; + +// 7 segments + + for (i = 0 ; i < 7 ; ++i) + { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; } + +// 6 digits + + for (i = 0 ; i < 6 ; ++i) + { digitalWrite (digits [i], 0) ; pinMode (digits [i], OUTPUT) ; } + + strcpy (display, " ") ; + piThreadCreate (displayDigits) ; + delay (10) ; // Just to make sure it's started + +// Quick countdown LED test sort of thing + + c = 999999 ; + for (i = 0 ; i < 10 ; ++i) + { + sprintf (display, "%06d", c) ; + delay (400) ; + c -= 111111 ; + } + + strcpy (display, " ") ; + delay (400) ; + +#ifdef PHOTO_HACK + sprintf (display, "%s", "123456") ; + for (;;) + delay (1000) ; +#endif + +} + + +/* + * teenager: + * No explanation needed. (Nor one given!) + ********************************************************************************* + */ + +void teenager (void) +{ + char *message = " feedbeef babe cafe b00b " ; + int i ; + + for (i = 0 ; i < strlen (message) - 4 ; ++i) + { + strncpy (display, &message [i], 6) ; + delay (200) ; + } + delay (1000) ; + for (i = 0 ; i < 3 ; ++i) + { + strcpy (display, " ") ; + delay (150) ; + strcpy (display, " b00b ") ; + delay (250) ; + } + delay (1000) ; + strcpy (display, " ") ; + delay (1000) ; +} + + +/* + ********************************************************************************* + * main: + * Let the fun begin + ********************************************************************************* + */ + +int main (void) +{ + struct tm *t ; + time_t tim ; + + setup () ; + teenager () ; + + tim = time (NULL) ; + for (;;) + { + while (time (NULL) == tim) + delay (5) ; + + tim = time (NULL) ; + t = localtime (&tim) ; + + sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ; + + delay (500) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile b/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile new file mode 100644 index 00000000..75692611 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile @@ -0,0 +1,74 @@ +# +# Makefile: +# Gertboard - Examples using wiringPi +# +# Copyright (c) 2013 Gordon Henderson +################################################################################# + +#DEBUG = -g -O0 +DEBUG = -O3 +CC = gcc +INCLUDE = -I/usr/local/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L/usr/local/lib +LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +# Should not alter anything below this line +############################################################################### + +SRC = gertboard.c \ + buttons.c 7segments.c \ + voltmeter.c temperature.c vumeter.c \ + record.c + +OBJ = $(SRC:.c=.o) + +BINS = $(SRC:.c=) + +all: $(BINS) + +gertboard: gertboard.o + @echo [link] + @$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS) + +buttons: buttons.o + @echo [link] + @$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) + +7segments: 7segments.o + @echo [link] + @$(CC) -o $@ 7segments.o $(LDFLAGS) $(LDLIBS) + +voltmeter: voltmeter.o + @echo [link] + @$(CC) -o $@ voltmeter.o $(LDFLAGS) $(LDLIBS) + +temperature: temperature.o + @echo [link] + @$(CC) -o $@ temperature.o $(LDFLAGS) $(LDLIBS) + +vumeter: vumeter.o + @echo [link] + @$(CC) -o $@ vumeter.o $(LDFLAGS) $(LDLIBS) + +record: record.o + @echo [link] + @$(CC) -o $@ record.o $(LDFLAGS) $(LDLIBS) + +.c.o: + @echo [CC] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +clean: + @echo [Clean] + @rm -f $(OBJ) *~ core tags $(BINS) + +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c new file mode 100644 index 00000000..5f767641 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c @@ -0,0 +1,83 @@ +/* + * buttons.c: + * Read the Gertboard buttons. Each one will act as an on/off + * tiggle switch for 3 different LEDs + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +// Array to keep track of our LEDs + +int leds [] = { 0, 0, 0 } ; + +// scanButton: +// See if a button is pushed, if so, then flip that LED and +// wait for the button to be let-go + +void scanButton (int button) +{ + if (digitalRead (button) == HIGH) // Low is pushed + return ; + + leds [button] ^= 1 ; // Invert state + digitalWrite (4 + button, leds [button]) ; + + while (digitalRead (button) == LOW) // Wait for release + delay (10) ; +} + +int main (void) +{ + int i ; + + printf ("Raspberry Pi Gertboard Button Test\n") ; + + wiringPiSetup () ; + +// Setup the outputs: +// Pins 3, 4, 5, 6 and 7 output: +// We're not using 3 or 4, but make sure they're off anyway +// (Using same hardware config as blink12.c) + + for (i = 3 ; i < 8 ; ++i) + { + pinMode (i, OUTPUT) ; + digitalWrite (i, 0) ; + } + +// Setup the inputs + + for (i = 0 ; i < 3 ; ++i) + { + pinMode (i, INPUT) ; + pullUpDnControl (i, PUD_UP) ; + leds [i] = 0 ; + } + + for (;;) + { + for (i = 0 ; i < 3 ; ++i) + scanButton (i) ; + delay (1) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c new file mode 100644 index 00000000..aefcb124 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c @@ -0,0 +1,96 @@ +/* + * gertboard.c: + * Simple test for the SPI bus on the Gertboard + * + * Hardware setup: + * D/A port 0 jumpered to A/D port 0. + * + * We output a sine wave on D/A port 0 and sample A/D port 0. We then + * plot the input value on the terminal as a sort of vertical scrolling + * oscilloscipe. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <sys/ioctl.h> +#include <stdlib.h> +#include <math.h> + +// Gertboard D to A is an 8-bit unit. + +#define B_SIZE 256 + +#include <wiringPi.h> +#include <gertboard.h> + +int main (void) +{ + double angle ; + int i, inputValue ; + int buffer [B_SIZE] ; + int cols ; + struct winsize w ; + + + printf ("Raspberry Pi Gertboard SPI test program\n") ; + printf ("=======================================\n") ; + + ioctl (fileno (stdin), TIOCGWINSZ, &w); + cols = w.ws_col - 2 ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + +// Initialise the Gertboard analog hardware at pin 100 + + gertboardAnalogSetup (100) ; + +// Generate a Sine Wave and store in our buffer + + for (i = 0 ; i < B_SIZE ; ++i) + { + angle = ((double)i / (double)B_SIZE) * M_PI * 2.0 ; + buffer [i] = (int)rint ((sin (angle)) * 127.0 + 128.0) ; + } + +// Loop, output the sine wave on analog out port 0, read it into A-D port 0 +// and display it on the screen + + for (;;) + { + for (i = 0 ; i < B_SIZE ; ++i) + { + analogWrite (100, buffer [i]) ; + + inputValue = analogRead (100) ; + +// We don't need to wory about the scale or sign - the analog hardware is +// a 10-bit value, so 0-1023. Just scale this to our terminal + + printf ("%*s\n", (inputValue * cols) / 1023, "*") ; + delay (2) ; + } + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c new file mode 100644 index 00000000..71d87184 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c @@ -0,0 +1,60 @@ +/* + * record.c: + * Record some audio via the Gertboard + * + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + */ + +#include <stdio.h> +#include <sys/time.h> + +#include <wiringPi.h> +#include <gertboard.h> + +#define B_SIZE 40000 + +int main () +{ + int i ; + struct timeval tStart, tEnd, tTaken ; + unsigned char buffer [B_SIZE] ; + + printf ("\n") ; + printf ("Gertboard demo: Recorder\n") ; + printf ("========================\n") ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + +// Initialise the Gertboard analog hardware at pin 100 + + gertboardAnalogSetup (100) ; + + gettimeofday (&tStart, NULL) ; + + for (i = 0 ; i < B_SIZE ; ++i) + buffer [i] = analogRead (100) >> 2 ; + + gettimeofday (&tEnd, NULL) ; + + timersub (&tEnd, &tStart, &tTaken) ; + + printf ("Time taken for %d reads: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; + + gettimeofday (&tStart, NULL) ; + + for (i = 0 ; i < B_SIZE ; ++i) + analogWrite (100, buffer [i]) ; + + gettimeofday (&tEnd, NULL) ; + + timersub (&tEnd, &tStart, &tTaken) ; + + printf ("Time taken for %d writes: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; + + return 0 ; +} + diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c new file mode 100644 index 00000000..5985a122 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c @@ -0,0 +1,78 @@ +/* + * temperature.c: + * Demonstrate use of the Gertboard A to D converter to make + * a simple thermometer using the LM35. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> + +#include <wiringPi.h> +#include <gertboard.h> + +int main () +{ + int x1, x2 ; + double v1, v2 ; + + printf ("\n") ; + printf ("Gertboard demo: Simple Thermemeter\n") ; + printf ("==================================\n") ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + +// Initialise the Gertboard analog hardware at pin 100 + + gertboardAnalogSetup (100) ; + + printf ("\n") ; + printf ("| Channel 0 | Channel 1 | Temperature 1 | Temperature 2 |\n") ; + + for (;;) + { + +// Read the 2 channels: + + x1 = analogRead (100) ; + x2 = analogRead (101) ; + +// Convert to a voltage: + + v1 = (double)x1 / 1023.0 * 3.3 ; + v2 = (double)x2 / 1023.0 * 3.3 ; + +// Print + + printf ("| %6.3f | %6.3f |", v1, v2) ; + +// Print Temperature of both channels by converting the LM35 reading +// to a temperature. Fortunately these are easy: 0.01 volts per C. + + printf (" %4.1f | %4.1f |\r", v1 * 100.0, v2 * 100.0) ; + fflush (stdout) ; + } + + return 0 ; +} + diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c new file mode 100644 index 00000000..c4d2113f --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c @@ -0,0 +1,73 @@ +/* + * voltmeter.c: + * Demonstrate use of the Gertboard A to D converter to make + * a simple voltmeter. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> + +#include <wiringPi.h> +#include <gertboard.h> + +int main () +{ + int x1, x2 ; + double v1, v2 ; + + printf ("\n") ; + printf ("Gertboard demo: Simple Voltmeters\n") ; + printf ("=================================\n") ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + +// Initialise the Gertboard analog hardware at pin 100 + + gertboardAnalogSetup (100) ; + + printf ("\n") ; + printf ("| Channel 0 | Channel 1 |\n") ; + + for (;;) + { + +// Read the 2 channels: + + x1 = analogRead (100) ; + x2 = analogRead (101) ; + +// Convert to a voltage: + + v1 = (double)x1 / 1023.0 * 3.3 ; + v2 = (double)x2 / 1023.0 * 3.3 ; + +// Print + + printf ("| %6.3f | %6.3f |\r", v1, v2) ; + fflush (stdout) ; + } + + return 0 ; +} + diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c new file mode 100644 index 00000000..9643ace9 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c @@ -0,0 +1,152 @@ +/* + * vumeter.c: + * Simple VU meter + * + * Heres the theory: + * We will sample at 4000 samples/sec and put the data into a + * low-pass filter with a depth of 1000 samples. This will give + * us 1/4 a second of lag on the signal, but I think it might + * produce a more pleasing output. + * + * The input of the microphone should be at mid-pont with no + * sound input, but we might have to sample that too, to get + * our reference zero... + * + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> + +#include <wiringPi.h> +#include <gertboard.h> + +#ifndef TRUE +#define TRUE (1==1) +#define FALSE (!TRUE) +#endif + +#define B_SIZE 1000 +#define S_SIZE 128 + +static int buffer [B_SIZE] ; +static int bPtr = 0 ; + +/* + * ledPercent: + * Output the given value as a percentage on the LEDs + ********************************************************************************* + */ + +static void ledPercent (int percent) +{ + unsigned int output = 0 ; + + if (percent > 11) output |= 0x01 ; + if (percent > 22) output |= 0x02 ; + if (percent > 33) output |= 0x04 ; + if (percent > 44) output |= 0x08 ; + if (percent > 55) output |= 0x10 ; + if (percent > 66) output |= 0x20 ; + if (percent > 77) output |= 0x40 ; + if (percent > 88) output |= 0x80 ; + + digitalWriteByte (output) ; +} + +static unsigned int tPeriod, tNextSampleTime ; + +/* + * sample: + * Get a sample from the Gertboard. If not enough time has elapsed + * since the last sample, then wait... + ********************************************************************************* + */ + +static void sample (void) +{ + unsigned int tFuture ; + +// Calculate the future sample time + + tFuture = tPeriod + tNextSampleTime ; + +// Wait until the next sample time + + while (micros () < tNextSampleTime) + ; + + buffer [bPtr] = gertboardAnalogRead (0) ; + + tNextSampleTime = tFuture ; +} + + +int main () +{ + int quietLevel, min, max ; + int i, sum ; + unsigned int tStart, tEnd ; + + printf ("\n") ; + printf ("Gertboard demo: VU Meter\n") ; + printf ("========================\n") ; + + wiringPiSetup () ; + gertboardSPISetup () ; + + ledPercent (0) ; + for (i = 0 ; i < 8 ; ++i) + pinMode (i, OUTPUT) ; + + for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) + buffer [bPtr] = 99 ; + + tPeriod = 1000000 / 1000 ; + + printf ("Shhhh.... ") ; fflush (stdout) ; + delay (1000) ; + printf ("Sampling quiet... ") ; fflush (stdout) ; + + tStart = micros () ; + + tNextSampleTime = micros () ; + for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) + sample () ; + + tEnd = micros () ; + + quietLevel = 0 ; + max = 0 ; + min = 1024 ; + for (i = 0 ; i < B_SIZE ; ++i) + { + quietLevel += buffer [i] ; + if (buffer [i] > max) max = buffer [i] ; + if (buffer [i] < min) min = buffer [i] ; + } + quietLevel /= B_SIZE ; + + printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ; + + printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ; + + for (bPtr = 0 ;;) + { + sample () ; + sum = 0 ; + for (i = 0 ; i < S_SIZE ; ++i) + sum += buffer [i] ; + sum /= S_SIZE ; + sum = abs (quietLevel - sum) ; + sum = (sum * 1000) / quietLevel ; + ledPercent (sum) ; + if (++bPtr > S_SIZE) + bPtr = 0 ; + } + + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/Makefile b/modules/catkin_ws/src/wiringPi/examples/Makefile new file mode 100644 index 00000000..c9967dc4 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/Makefile @@ -0,0 +1,168 @@ +# +# Makefile: +# wiringPi - Wiring Compatable library for the Raspberry Pi +# https://projects.drogon.net/wiring-pi +# +# Copyright (c) 2012 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + + +#DEBUG = -g -O0 +DEBUG = -O3 +CC = gcc +INCLUDE = -I/usr/local/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L/usr/local/lib +LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +# Should not alter anything below this line +############################################################################### + +SRC = blink.c blink8.c blink12.c \ + blink12drcs.c \ + pwm.c \ + speed.c wfi.c isr.c isr-osc.c \ + lcd.c lcd-adafruit.c clock.c \ + nes.c \ + softPwm.c softTone.c \ + delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ + lowPower.c \ + rht03.c piglow.c + +OBJ = $(SRC:.c=.o) + +BINS = $(SRC:.c=) + +all: + @cat README.TXT + @echo " $(BINS)" | fmt + @echo "" + +really-all: $(BINS) + +blink: blink.o + @echo [link] + @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) + +blink8: blink8.o + @echo [link] + @$(CC) -o $@ blink8.o $(LDFLAGS) $(LDLIBS) + +blink12drcs: blink12drcs.o + @echo [link] + @$(CC) -o $@ blink12drcs.o $(LDFLAGS) $(LDLIBS) + +blink12: blink12.o + @echo [link] + @$(CC) -o $@ blink12.o $(LDFLAGS) $(LDLIBS) + +speed: speed.o + @echo [link] + @$(CC) -o $@ speed.o $(LDFLAGS) $(LDLIBS) + +lcd: lcd.o + @echo [link] + @$(CC) -o $@ lcd.o $(LDFLAGS) $(LDLIBS) + +lcd-adafruit: lcd-adafruit.o + @echo [link] + @$(CC) -o $@ lcd-adafruit.o $(LDFLAGS) $(LDLIBS) + +clock: clock.o + @echo [link] + @$(CC) -o $@ clock.o $(LDFLAGS) $(LDLIBS) + +wfi: wfi.o + @echo [link] + @$(CC) -o $@ wfi.o $(LDFLAGS) $(LDLIBS) + +isr: isr.o + @echo [link] + @$(CC) -o $@ isr.o $(LDFLAGS) $(LDLIBS) + +isr-osc: isr-osc.o + @echo [link] + @$(CC) -o $@ isr-osc.o $(LDFLAGS) $(LDLIBS) + +nes: nes.o + @echo [link] + @$(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) + +rht03: rht03.o + @echo [link] + @$(CC) -o $@ rht03.o $(LDFLAGS) $(LDLIBS) + +pwm: pwm.o + @echo [link] + @$(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS) + +softPwm: softPwm.o + @echo [link] + @$(CC) -o $@ softPwm.o $(LDFLAGS) $(LDLIBS) + +softTone: softTone.o + @echo [link] + @$(CC) -o $@ softTone.o $(LDFLAGS) $(LDLIBS) + +delayTest: delayTest.o + @echo [link] + @$(CC) -o $@ delayTest.o $(LDFLAGS) $(LDLIBS) + +serialRead: serialRead.o + @echo [link] + @$(CC) -o $@ serialRead.o $(LDFLAGS) $(LDLIBS) + +serialTest: serialTest.o + @echo [link] + @$(CC) -o $@ serialTest.o $(LDFLAGS) $(LDLIBS) + +okLed: okLed.o + @echo [link] + @$(CC) -o $@ okLed.o $(LDFLAGS) $(LDLIBS) + +tone: tone.o + @echo [link] + @$(CC) -o $@ tone.o $(LDFLAGS) $(LDLIBS) + +ds1302: ds1302.o + @echo [link] + @$(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) + +piglow: piglow.o + @echo [link] + @$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) + + +.c.o: + @echo [CC] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +clean: + @echo "[Clean]" + @rm -f $(OBJ) *~ core tags $(BINS) + +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile b/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile new file mode 100644 index 00000000..0bde334f --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile @@ -0,0 +1,85 @@ +# +# Makefile: +# wiringPi - Wiring Compatable library for the Raspberry Pi +# https://projects.drogon.net/wiring-pi +# +# Copyright (c) 2012 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + + +#DEBUG = -g -O0 +DEBUG = -O3 +CC = gcc +INCLUDE = -I/usr/local/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L/usr/local/lib +LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +# Should not alter anything below this line +############################################################################### + +SRC = blink.c buttons.c reaction.c ladder.c metro.c motor.c + +OBJ = $(SRC:.c=.o) + +BINS = $(SRC:.c=) + +all: $(BINS) + +blink: blink.o + @echo [link] + @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) + +buttons: buttons.o + @echo [link] + @$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) + +reaction: reaction.o + @echo [link] + @$(CC) -o $@ reaction.o $(LDFLAGS) $(LDLIBS) + +ladder: ladder.o + @echo [link] + @$(CC) -o $@ ladder.o $(LDFLAGS) $(LDLIBS) + +metro: metro.o + @echo [link] + @$(CC) -o $@ metro.o $(LDFLAGS) $(LDLIBS) + +motor: motor.o + @echo [link] + @$(CC) -o $@ motor.o $(LDFLAGS) $(LDLIBS) + +.c.o: + @echo [CC] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +clean: + @echo "[Clean]" + @rm -f $(OBJ) *~ core tags $(BINS) + +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c new file mode 100644 index 00000000..ffb8a2e3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c @@ -0,0 +1,59 @@ +/* + * blink.c: + * Simple "blink" test for the PiFace interface board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> + +#include <wiringPi.h> +#include <piFace.h> + +// Use 200 as the pin-base for the PiFace board, and pick a pin +// for the LED that's not connected to a relay + +#define PIFACE 200 +#define LED (PIFACE+2) + +int main (int argc, char *argv []) +{ + printf ("Raspberry Pi PiFace Blink\n") ; + printf ("=========================\n") ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + +// Setup the PiFace board + + piFaceSetup (PIFACE) ; + + for (;;) + { + digitalWrite (LED, HIGH) ; // On + delay (500) ; // mS + digitalWrite (LED, LOW) ; // Off + delay (500) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c new file mode 100644 index 00000000..147a4bdb --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c @@ -0,0 +1,103 @@ +/* + * buttons.c: + * Simple test for the PiFace interface board. + * + * Read the buttons and output the same to the LEDs + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> + +#include <wiringPi.h> +#include <piFace.h> + +int outputs [4] = { 0,0,0,0 } ; + +// Use 200 as the pin-base for the PiFace board + +#define PIFACE_BASE 200 + + +/* + * scanButton: + * Read the guiven button - if it's pressed, then flip the state + * of the correspoinding output pin + ********************************************************************************* + */ + +void scanButton (int button) +{ + if (digitalRead (PIFACE_BASE + button) == LOW) + { + outputs [button] ^= 1 ; + digitalWrite (PIFACE_BASE + button, outputs [button]) ; + printf ("Button %d pushed - output now: %s\n", + button, (outputs [button] == 0) ? "Off" : "On") ; + } + + while (digitalRead (PIFACE_BASE + button) == LOW) + delay (1) ; +} + + +/* + * start here + ********************************************************************************* + */ + +int main (void) +{ + int pin, button ; + + printf ("Raspberry Pi wiringPi + PiFace test program\n") ; + printf ("===========================================\n") ; + printf ("\n") ; + printf ( +"This program reads the buttons and uses them to toggle the first 4\n" +"outputs. Push a button once to turn an output on, and push it again to\n" +"turn it off again.\n\n") ; + +// Always initialise wiringPi. Use wiringPiSys() if you don't need +// (or want) to run as root + + wiringPiSetupSys () ; + + piFaceSetup (PIFACE_BASE) ; + +// Enable internal pull-ups & start with all off + + for (pin = 0 ; pin < 8 ; ++pin) + { + pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; + digitalWrite (PIFACE_BASE + pin, 0) ; + } + +// Loop, scanning the buttons + + for (;;) + { + for (button = 0 ; button < 4 ; ++button) + scanButton (button) ; + delay (5) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c new file mode 100755 index 00000000..4f08a6f5 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c @@ -0,0 +1,337 @@ +/* + * ladder.c: + * + * Gordon Henderson, June 2012 + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <math.h> + +#include <wiringPi.h> +#include <piFace.h> + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +#undef DEBUG + +#define NUM_LEDS 8 + + +// Map the LEDs to the hardware pins +// using PiFace pin numbers here + +#define PIFACE 200 + +const int ledMap [NUM_LEDS] = +{ +// 0, 1, 2, 3, 4, 5, 6, 7, 8 + 200, 201, 202, 203, 204, 205, 206, 207 +} ; + + +// Some constants for our circuit simulation + +const double vBatt = 9.0 ; // Volts (ie. a PP3) +const double capacitor = 0.001 ; // 1000uF +const double rCharge = 2200.0 ; // ohms +const double rDischarge = 68000.0 ; // ohms +const double timeInc = 0.01 ; // Seconds + +double vCharge, vCap, vCapLast ; + + + +/* + * setup: + * Program the GPIO correctly and initialise the lamps + *********************************************************************** + */ + +void setup (void) +{ + int i ; + + wiringPiSetupSys () ; + + if (piFaceSetup (200) == -1) + exit (1) ; + +// Enable internal pull-ups + + for (i = 0 ; i < 8 ; ++i) + pullUpDnControl (PIFACE + i, PUD_UP) ; + +// Calculate the actual charging voltage - standard calculation of +// vCharge = r2 / (r1 + r2) * vBatt +// +// +// -----+--- vBatt +// | +// R1 +// | +// +---+---- vCharge +// | | +// R2 C +// | | +// -----+---+----- + + vCharge = rDischarge / (rCharge + rDischarge) * vBatt ; + +// Start with no charge + + vCap = vCapLast = 0.0 ; +} + + +/* + * introLeds + * Put a little pattern on the LEDs to start with + ********************************************************************************* + */ + +void introLeds (void) +{ + int i, j ; + + + printf ("Pi Ladder\n") ; + printf ("=========\n\n") ; + printf (" vBatt: %6.2f volts\n", vBatt) ; + printf (" rCharge: %6.0f ohms\n", rCharge) ; + printf (" rDischarge: %6.0f ohms\n", rDischarge) ; + printf (" vCharge: %6.2f volts\n", vCharge) ; + printf (" capacitor: %6.0f uF\n", capacitor * 1000.0) ; + +// Flash 3 times: + + for (j = 0 ; j < 3 ; ++j) + { + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 1) ; + delay (500) ; + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 0) ; + delay (100) ; + } + +// All On + + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 1) ; + delay (500) ; + +// Countdown... + + for (i = NUM_LEDS - 1 ; i >= 0 ; --i) + { + digitalWrite (ledMap [i], 0) ; + delay (100) ; + } + delay (500) ; +} + + +/* + * winningLeds + * Put a little pattern on the LEDs to start with + ********************************************************************************* + */ + +void winningLeds (void) +{ + int i, j ; + +// Flash 3 times: + + for (j = 0 ; j < 3 ; ++j) + { + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 1) ; + delay (500) ; + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 0) ; + delay (100) ; + } + +// All On + + for (i = 0 ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 1) ; + delay (500) ; + +// Countup... + + for (i = 0 ; i < NUM_LEDS ; ++i) + { + digitalWrite (ledMap [i], 0) ; + delay (100) ; + } + delay (500) ; +} + + +/* + * chargeCapacitor: dischargeCapacitor: + * Add or remove charge to the capacitor. + * Standard capacitor formulae. + ********************************************************************************* + */ + +void chargeCapacitor (void) +{ + vCap = (vCapLast - vCharge) * + exp (- timeInc / (rCharge * capacitor)) + vCharge ; + +#ifdef DEBUG + printf ("+vCap: %7.4f\n", vCap) ; +#endif + + vCapLast = vCap ; +} + +void dischargeCapacitor (void) +{ + vCap = vCapLast * + exp (- timeInc / (rDischarge * capacitor)) ; + +#ifdef DEBUG + printf ("-vCap: %7.4f\n", vCap) ; +#endif + + vCapLast = vCap ; +} + + +/* + * ledBargraph: + * Output the supplied number as a bargraph on the LEDs + ********************************************************************************* + */ + +void ledBargraph (double value, int topLedOn) +{ + int topLed = (int)floor (value / vCharge * (double)NUM_LEDS) + 1 ; + int i ; + + if (topLed > NUM_LEDS) + topLed = NUM_LEDS ; + + if (!topLedOn) + --topLed ; + + for (i = 0 ; i < topLed ; ++i) + digitalWrite (ledMap [i], 1) ; + + for (i = topLed ; i < NUM_LEDS ; ++i) + digitalWrite (ledMap [i], 0) ; +} + + +/* + * ledOnAction: + * Make sure the leading LED is on and check the button + ********************************************************************************* + */ + +void ledOnAction (void) +{ + if (digitalRead (PIFACE) == LOW) + { + chargeCapacitor () ; + ledBargraph (vCap, TRUE) ; + } +} + + +/* + * ledOffAction: + * Make sure the leading LED is off and check the button + ********************************************************************************* + */ + +void ledOffAction (void) +{ + dischargeCapacitor () ; + +// Are we still pushing the button? + + if (digitalRead (PIFACE) == LOW) + { + vCap = vCapLast = 0.0 ; + ledBargraph (vCap, FALSE) ; + +// Wait until we release the button + + while (digitalRead (PIFACE) == LOW) + delay (10) ; + } +} + + +/* + *********************************************************************** + * The main program + *********************************************************************** + */ + +int main (void) +{ + unsigned int then, ledOnTime, ledOffTime ; + unsigned int ourDelay = (int)(1000.0 * timeInc) ; + + setup () ; + introLeds () ; + +// Setup the LED times - TODO reduce the ON time as the game progresses + + ledOnTime = 1000 ; + ledOffTime = 1000 ; + +// This is our Gate/Squarewave loop + + for (;;) + { + +// LED ON: + + (void)ledBargraph (vCap, TRUE) ; + then = millis () + ledOnTime ; + while (millis () < then) + { + ledOnAction () ; + delay (ourDelay) ; + } + +// Have we won yet? +// We need vCap to be in the top NUM_LEDS of the vCharge + + if (vCap > ((double)(NUM_LEDS - 1) / (double)NUM_LEDS * vCharge)) // Woo hoo! + { + winningLeds () ; + while (digitalRead (PIFACE) == HIGH) + delay (10) ; + while (digitalRead (PIFACE) == LOW) + delay (10) ; + vCap = vCapLast = 0.0 ; + } + +// LED OFF: + + (void)ledBargraph (vCap, FALSE) ; + then = millis () + ledOffTime ; + while (millis () < then) + { + ledOffAction () ; + delay (ourDelay) ; + } + + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c new file mode 100644 index 00000000..a4a8c1d0 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c @@ -0,0 +1,111 @@ +/* + * metronome.c: + * Simple test for the PiFace interface board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <wiringPi.h> +#include <piFace.h> + +#define PIFACE 200 + +/* + * middleA: + * Play middle A (on the relays - yea!) + ********************************************************************************* + */ + +static void middleA (void) +{ + unsigned int next ; + + for (;;) + { + next = micros () + 1136 ; + digitalWrite (PIFACE + 0, 0) ; + digitalWrite (PIFACE + 1, 0) ; + while (micros () < next) + delayMicroseconds (1) ; + + next = micros () + 1137 ; + digitalWrite (PIFACE + 0, 1) ; + digitalWrite (PIFACE + 1, 1) ; + while (micros () < next) + delayMicroseconds (1) ; + + } +} + + +int main (int argc, char *argv []) +{ + int bpm, msPerBeat, state = 0 ; + unsigned int end ; + + printf ("Raspberry Pi PiFace Metronome\n") ; + printf ("=============================\n") ; + + piHiPri (50) ; + + wiringPiSetupSys () ; // Needed for timing functions + piFaceSetup (PIFACE) ; + + if (argc != 2) + { + printf ("Usage: %s <beates per minute>\n", argv [0]) ; + exit (1) ; + } + + if (strcmp (argv [1], "a") == 0) + middleA () ; + + bpm = atoi (argv [1]) ; + + if ((bpm < 40) || (bpm > 208)) + { + printf ("%s range is 40 through 208 beats per minute\n", argv [0]) ; + exit (1) ; + } + + msPerBeat = 60000 / bpm ; + +// Main loop: +// Put some random LED pairs up for a few seconds, then blank ... + + for (;;) + { + end = millis () + msPerBeat ; + + digitalWrite (PIFACE + 0, state) ; + digitalWrite (PIFACE + 1, state) ; + + while (millis () < end) + delayMicroseconds (500) ; + + state ^= 1 ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c new file mode 100644 index 00000000..14f55397 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c @@ -0,0 +1,120 @@ +/* + * motor.c: + * Use the PiFace board to demonstrate an H bridge + * circuit via the 2 relays. + * Then add on an external transsitor to help with PWM. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <piFace.h> +#include <softPwm.h> + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +int outputs [2] = { 0,0 } ; + +#define PIFACE_BASE 200 +#define PWM_OUT_PIN 204 +#define PWM_UP 202 +#define PWM_DOWN 203 + +void scanButton (int button) +{ + if (digitalRead (PIFACE_BASE + button) == LOW) + { + outputs [button] ^= 1 ; + digitalWrite (PIFACE_BASE + button, outputs [button]) ; + printf ("Button %d pushed - output now: %s\n", + button, (outputs [button] == 0) ? "Off" : "On") ; + } + + while (digitalRead (PIFACE_BASE + button) == LOW) + delay (1) ; +} + + +int main (void) +{ + int pin, button ; + int pwmValue = 0 ; + + printf ("Raspberry Pi PiFace - Motor control\n") ; + printf ("==================================\n") ; + printf ("\n") ; + printf ( +"This program is designed to be used with a motor connected to the relays\n" +"in an H-Bridge type configuration with optional speeed control via PWM.\n" +"\n" +"Use the leftmost buttons to turn each relay on and off, and the rigthmost\n" +"buttons to increase ot decrease the PWM output on the control pin (pin\n" +"4)\n\n") ; + + wiringPiSetup () ; + piFaceSetup (PIFACE_BASE) ; + softPwmCreate (PWM_OUT_PIN, 100, 100) ; + +// Enable internal pull-ups & start with all off + + for (pin = 0 ; pin < 8 ; ++pin) + { + pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; + digitalWrite (PIFACE_BASE + pin, 0) ; + } + + for (;;) + { + for (button = 0 ; button < 2 ; ++button) + scanButton (button) ; + + if (digitalRead (PWM_UP) == LOW) + { + pwmValue += 10 ; + if (pwmValue > 100) + pwmValue = 100 ; + + softPwmWrite (PWM_OUT_PIN, pwmValue) ; + printf ("PWM -> %3d\n", pwmValue) ; + + while (digitalRead (PWM_UP) == LOW) + delay (5) ; + } + + if (digitalRead (PWM_DOWN) == LOW) + { + pwmValue -= 10 ; + if (pwmValue < 0) + pwmValue = 0 ; + + softPwmWrite (PWM_OUT_PIN, pwmValue) ; + printf ("PWM -> %3d\n", pwmValue) ; + + while (digitalRead (PWM_DOWN) == LOW) + delay (5) ; + } + + delay (5) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c new file mode 100644 index 00000000..50845080 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c @@ -0,0 +1,194 @@ +/* + * reaction.c: + * Simple test for the PiFace interface board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include <wiringPi.h> +#include <piFace.h> + + +int outputs [4] = { 0,0,0,0 } ; + +#define PIFACE 200 + +/* + * light: + * Light up the given LED - actually lights up a pair + ********************************************************************************* + */ + +void light (int led, int value) +{ + led *= 2 ; + digitalWrite (PIFACE + led + 0, value) ; + digitalWrite (PIFACE + led + 1, value) ; +} + +/* + * lightAll: + * All On or Off + ********************************************************************************* + */ + +void lightAll (int onoff) +{ + light (0, onoff) ; + light (1, onoff) ; + light (2, onoff) ; + light (3, onoff) ; +} + + +/* + * waitForNoButtons: + * Wait for all buttons to be released + ********************************************************************************* + */ + +void waitForNoButtons (void) +{ + int i, button ; + + for (;;) + { + button = 0 ; + for (i = 0 ; i < 4 ; ++i) + button += digitalRead (PIFACE + i) ; + + if (button == 4) + break ; + } +} + + +void scanButton (int button) +{ + if (digitalRead (PIFACE + button) == LOW) + { + outputs [button] ^= 1 ; + digitalWrite (PIFACE + button, outputs [button]) ; + } + + while (digitalRead (PIFACE + button) == LOW) + delay (1) ; +} + + +int main (void) +{ + int i, j ; + int led, button ; + unsigned int start, stop ; + + printf ("Raspberry Pi PiFace Reaction Timer\n") ; + printf ("==================================\n") ; + + if (piFaceSetup (PIFACE) == -1) + exit (1) ; + +// Enable internal pull-ups + + for (i = 0 ; i < 8 ; ++i) + pullUpDnControl (PIFACE + i, PUD_UP) ; + + +// Main game loop: +// Put some random LED pairs up for a few seconds, then blank ... + + for (;;) + { + printf ("Press any button to start ... \n") ; fflush (stdout) ; + + for (;;) + { + led = rand () % 4 ; + light (led, 1) ; + delay (10) ; + light (led, 0) ; + + button = 0 ; + for (j = 0 ; j < 4 ; ++j) + button += digitalRead (PIFACE + j) ; + + if (button != 4) + break ; + } + + waitForNoButtons () ; + + printf ("Wait for it ... ") ; fflush (stdout) ; + + led = rand () % 4 ; + delay (rand () % 500 + 1000) ; + light (led, 1) ; + + start = millis () ; + for (button = -1 ; button == -1 ; ) + { + for (j = 0 ; j < 4 ; ++j) + if (digitalRead (PIFACE + j) == 0) // Pushed + { + button = j ; + break ; + } + } + stop = millis () ; + button = 3 - button ; // Correct for the buttons/LEDs reversed + + light (led, 0) ; + + waitForNoButtons () ; + + light (led, 1) ; + + if (button == led) + { + printf ("You got it in %3d mS\n", stop - start) ; + } + else + { + printf ("Missed: You pushed %d - LED was %d\n", button, led) ; + for (;;) + { + light (button, 1) ; + delay (100) ; + light (button, 0) ; + delay (100) ; + i = 0 ; + for (j = 0 ; j < 4 ; ++j) + i += digitalRead (PIFACE + j) ; + if (i != 4) + break ; + } + + waitForNoButtons () ; + } + light (led, 0) ; + delay (4000) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile b/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile new file mode 100644 index 00000000..8d31141a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile @@ -0,0 +1,79 @@ +# +# Makefile: +# wiringPi - Wiring Compatable library for the Raspberry Pi +# https://projects.drogon.net/wiring-pi +# +# Copyright (c) 2012-2013 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + + +#DEBUG = -g -O0 +DEBUG = -O3 +CC = gcc +INCLUDE = -I/usr/local/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L/usr/local/lib +LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +# Should not alter anything below this line +############################################################################### + +SRC = piGlow0.c piGlow1.c piglow.c + +OBJ = $(SRC:.c=.o) + +BINS = $(SRC:.c=) + +all: $(BINS) + +piGlow0: piGlow0.o + @echo [link] + @$(CC) -o $@ piGlow0.o $(LDFLAGS) $(LDLIBS) + +piGlow1: piGlow1.o + @echo [link] + @$(CC) -o $@ piGlow1.o $(LDFLAGS) $(LDLIBS) + +piglow: piglow.o + @echo [link] + @$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) + +.c.o: + @echo [CC] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +clean: + @echo "[Clean]" + @rm -f $(OBJ) *~ core tags $(BINS) + +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +install: piglow + @echo Installing piglow into /usr/local/bin + @cp -a piglow /usr/local/bin/piglow + @chmod 755 /usr/local/bin/piglow + @echo Done. Remember to load the I2C drivers! + +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c new file mode 100644 index 00000000..d3fe4b96 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c @@ -0,0 +1,51 @@ +/* + * piglow.c: + * Very simple demonstration of the PiGlow board. + * This uses the SN3218 directly - soon there will be a new PiGlow + * devLib device which will handle the PiGlow board on a more easy + * to use manner... + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <sn3218.h> + +#define LED_BASE 533 + +int main (void) +{ + int i, j ; + + wiringPiSetupSys () ; + + sn3218Setup (LED_BASE) ; + + for (;;) + { + for (i = 0 ; i < 256 ; ++i) + for (j = 0 ; j < 18 ; ++j) + analogWrite (LED_BASE + j, i) ; + + for (i = 255 ; i >= 0 ; --i) + for (j = 0 ; j < 18 ; ++j) + analogWrite (LED_BASE + j, i) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c new file mode 100644 index 00000000..a00b31e3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c @@ -0,0 +1,258 @@ +/* + * piGlow1.c: + * Very simple demonstration of the PiGlow board. + * This uses the piGlow devLib. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <poll.h> + +#include <wiringPi.h> +#include <piGlow.h> + +#define PIGLOW_BASE 533 + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (!TRUE) +#endif + + +/* + * keypressed: clearKeypressed: + * Simple but effective ways to tell if the enter key has been pressed + ********************************************************************************* + */ + +static int keypressed (void) +{ + struct pollfd polls ; + + polls.fd = fileno (stdin) ; + polls.events = POLLIN ; + + return poll (&polls, 1, 0) != 0 ; +} + +static void clearKeypressed (void) +{ + while (keypressed ()) + (void)getchar () ; +} + + +/* + * pulseLed: + * Pulses the LED at position leg, ring from off to a max. value, + * then off again + ********************************************************************************* + */ + +static void pulseLed (int leg, int ring) +{ + int i ; + + for (i = 0 ; i < 140 ; ++i) + { + piGlow1 (leg, ring, i) ; + delay (1) ; + } + delay (10) ; + for (i = 140 ; i >= 0 ; --i) + { + piGlow1 (leg, ring, i) ; + delay (1) ; + } +} + +/* + * pulseLeg: + * Same as above, but a whole leg at a time + ********************************************************************************* + */ + +static void pulseLeg (int leg) +{ + int i ; + + for (i = 0 ; i < 140 ; ++i) + { + piGlowLeg (leg, i) ; delay (1) ; + } + delay (10) ; + for (i = 140 ; i >= 0 ; --i) + { + piGlowLeg (leg, i) ; delay (1) ; + } +} + + +/* + * pulse Ring: + * Same as above, but a whole ring at a time + ********************************************************************************* + */ + +static void pulseRing (int ring) +{ + int i ; + + for (i = 0 ; i < 140 ; ++i) + { + piGlowRing (ring, i) ; delay (1) ; + } + delay (10) ; + for (i = 140 ; i >= 0 ; --i) + { + piGlowRing (ring, i) ; delay (1) ; + } +} + +#define LEG_STEPS 3 + +static int legSequence [] = +{ + 4, 12, 99, + 99, 4, 12, + 12, 99, 4, +} ; + + +#define RING_STEPS 16 + +static int ringSequence [] = +{ + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 0, 64, 64, + 0, 0, 0, 64, 64, 0, + 0, 0, 64, 64, 0, 0, + 0, 64, 64, 0, 0, 0, + 64, 64, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, + 64, 64, 0, 0, 0, 0, + 0, 64, 64, 0, 0, 0, + 0, 0, 64, 64, 0, 0, + 0, 0, 0, 64, 64, 0, + 0, 0, 0, 0, 64, 64, + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 0, 0, 0, +} ; + +/* + * main: + * Our little demo prgoram + ********************************************************************************* + */ + +int main (void) +{ + int i ; + int step, ring, leg ; + +// Always initialise wiringPi: +// Use the Sys method if you don't need to run as root + + wiringPiSetupSys () ; + +// Initialise the piGlow devLib with our chosen pin base + + piGlowSetup (1) ; + +// LEDs, one at a time + + printf ("LEDs, one at a time\n") ; + for (; !keypressed () ;) + for (leg = 0 ; leg < 3 ; ++leg) + { + for (ring = 0 ; ring < 6 ; ++ring) + { + pulseLed (leg, ring) ; + if (keypressed ()) + break ; + } + if (keypressed ()) + break ; + } + clearKeypressed () ; + +// Rings, one at a time + + printf ("Rings, one at a time\n") ; + for (; !keypressed () ;) + for (ring = 0 ; ring < 6 ; ++ring) + { + pulseRing (ring) ; + if (keypressed ()) + break ; + } + clearKeypressed () ; + +// Legs, one at a time + + printf ("Legs, one at a time\n") ; + for (; !keypressed () ;) + for (leg = 0 ; leg < 3 ; ++leg) + { + pulseLeg (leg) ; + if (keypressed ()) + break ; + } + clearKeypressed () ; + + delay (1000) ; + +// Sequence - alternating rings, legs and random + + printf ("Sequence now\n") ; + for (; !keypressed () ;) + { + for (i = 0 ; i < 20 ; ++i) + for (step = 0 ; step < LEG_STEPS ; ++step) + { + for (leg = 0 ; leg < 3 ; ++leg) + piGlowLeg (leg, legSequence [step * 3 + leg]) ; + delay (80) ; + } + + for (i = 0 ; i < 10 ; ++i) + for (step = 0 ; step < RING_STEPS ; ++step) + { + for (ring = 0 ; ring < 6 ; ++ring) + piGlowRing (ring, ringSequence [step * 6 + ring]) ; + delay (80) ; + } + + for (i = 0 ; i < 1000 ; ++i) + { + leg = random () % 3 ; + ring = random () % 6 ; + piGlow1 (leg, ring, random () % 256) ; + delay (5) ; + piGlow1 (leg, ring, 0) ; + } + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c new file mode 100644 index 00000000..e6a2db36 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c @@ -0,0 +1,176 @@ +/* + * piglow.c: + * Very simple demonstration of the PiGlow board. + * This uses the piGlow devLib. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (!TRUE) +#endif + +#include <wiringPi.h> +#include <piGlow.h> + +static void failUsage (void) +{ + fprintf (stderr, "Usage examples:\n") ; + fprintf (stderr, " piglow off # All off\n") ; + fprintf (stderr, " piglow red 50 # Light the 3 red LEDs to 50%%\n") ; + fprintf (stderr, " colours are: red, yellow, orange, green, blue and white\n") ; + fprintf (stderr, " piglow all 75 # Light all to 75%%\n") ; + fprintf (stderr, " piglow leg 0 25 # Light leg 0 to 25%%\n") ; + fprintf (stderr, " piglow ring 3 100 # Light ring 3 to 100%%\n") ; + fprintf (stderr, " piglow led 2 5 100 # Light the single LED on Leg 2, ring 5 to 100%%\n") ; + + exit (EXIT_FAILURE) ; +} + +static int getPercent (char *typed) +{ + int percent ; + + percent = atoi (typed) ; + if ((percent < 0) || (percent > 100)) + { + fprintf (stderr, "piglow: percent value out of range\n") ; + exit (EXIT_FAILURE) ; + } + return (percent * 255) / 100 ; +} + + +/* + * main: + * Our little demo prgoram + ********************************************************************************* + */ + +int main (int argc, char *argv []) +{ + int percent ; + int ring, leg ; + +// Always initialise wiringPi: +// Use the Sys method if you don't need to run as root + + wiringPiSetupSys () ; + +// Initialise the piGlow devLib + + piGlowSetup (FALSE) ; + + if (argc == 1) + failUsage () ; + + if ((argc == 2) && (strcasecmp (argv [1], "off") == 0)) + { + for (leg = 0 ; leg < 3 ; ++leg) + piGlowLeg (leg, 0) ; + return 0 ; + } + + if (argc == 3) + { + percent = getPercent (argv [2]) ; + + /**/ if (strcasecmp (argv [1], "red") == 0) + piGlowRing (PIGLOW_RED, percent) ; + else if (strcasecmp (argv [1], "yellow") == 0) + piGlowRing (PIGLOW_YELLOW, percent) ; + else if (strcasecmp (argv [1], "orange") == 0) + piGlowRing (PIGLOW_ORANGE, percent) ; + else if (strcasecmp (argv [1], "green") == 0) + piGlowRing (PIGLOW_GREEN, percent) ; + else if (strcasecmp (argv [1], "blue") == 0) + piGlowRing (PIGLOW_BLUE, percent) ; + else if (strcasecmp (argv [1], "white") == 0) + piGlowRing (PIGLOW_WHITE, percent) ; + else if (strcasecmp (argv [1], "all") == 0) + for (ring = 0 ; ring < 6 ; ++ring) + piGlowRing (ring, percent) ; + else + { + fprintf (stderr, "piglow: invalid colour\n") ; + exit (EXIT_FAILURE) ; + } + return 0 ; + } + + if (argc == 4) + { + /**/ if (strcasecmp (argv [1], "leg") == 0) + { + leg = atoi (argv [2]) ; + if ((leg < 0) || (leg > 2)) + { + fprintf (stderr, "piglow: leg value out of range\n") ; + exit (EXIT_FAILURE) ; + } + percent = getPercent (argv [3]) ; + piGlowLeg (leg, percent) ; + } + else if (strcasecmp (argv [1], "ring") == 0) + { + ring = atoi (argv [2]) ; + if ((ring < 0) || (ring > 5)) + { + fprintf (stderr, "piglow: ring value out of range\n") ; + exit (EXIT_FAILURE) ; + } + percent = getPercent (argv [3]) ; + piGlowRing (ring, percent) ; + } + return 0 ; + } + + if (argc == 5) + { + if (strcasecmp (argv [1], "led") != 0) + failUsage () ; + + leg = atoi (argv [2]) ; + if ((leg < 0) || (leg > 2)) + { + fprintf (stderr, "piglow: leg value out of range\n") ; + exit (EXIT_FAILURE) ; + } + ring = atoi (argv [3]) ; + if ((ring < 0) || (ring > 5)) + { + fprintf (stderr, "piglow: ring value out of range\n") ; + exit (EXIT_FAILURE) ; + } + percent = getPercent (argv [4]) ; + piGlow1 (leg, ring, percent) ; + return 0 ; + } + + failUsage () ; + return 0 ; +} + + diff --git a/modules/catkin_ws/src/wiringPi/examples/README.TXT b/modules/catkin_ws/src/wiringPi/examples/README.TXT new file mode 100644 index 00000000..33263b1c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/README.TXT @@ -0,0 +1,18 @@ + +wiringPi Examples +================= + +There are now too many examples to compile them all in a sensible time, +and you probably don't want to compile or run them all anyway, so they +have been separated out. + +To compile an individual example, just type + + make exampleName + +To really compile everything: + + make really-all + +The individual tests are: + diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.c b/modules/catkin_ws/src/wiringPi/examples/blink.c new file mode 100644 index 00000000..c27a20e3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink.c @@ -0,0 +1,48 @@ +/* + * blink.c: + * Standard "blink" program in wiringPi. Blinks an LED connected + * to the first GPIO pin. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +// LED Pin - wiringPi pin 0 is BCM_GPIO 17. + +#define LED 0 + +int main (void) +{ + printf ("Raspberry Pi blink\n") ; + + wiringPiSetup () ; + pinMode (LED, OUTPUT) ; + + for (;;) + { + digitalWrite (LED, HIGH) ; // On + delay (500) ; // mS + digitalWrite (LED, LOW) ; // Off + delay (500) ; + } + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.rtb b/modules/catkin_ws/src/wiringPi/examples/blink.rtb new file mode 100644 index 00000000..eb7d26c7 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink.rtb @@ -0,0 +1,30 @@ +// blink.rtb: +// Blink program in Return to Basic +// +// Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> +//********************************************************************** +// This file is part of wiringPi: +// https://projects.drogon.net/raspberry-pi/wiringpi/ +// +// wiringPi is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// wiringPi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** +// +PinMode (0, 1) // Output +CYCLE + DigitalWrite (0, 1) // Pin 0 ON + WAIT (0.5) // 0.5 seconds + DigitalWrite (0, 0) + WAIT (0.5) +REPEAT +END diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.sh b/modules/catkin_ws/src/wiringPi/examples/blink.sh new file mode 100644 index 00000000..77553836 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# blink.sh: +# Standard "blink" program in wiringPi. Blinks an LED connected +# to the first GPIO pin. +# +# Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> +####################################################################### +# This file is part of wiringPi: +# https://projects.drogon.net/raspberry-pi/wiringpi/ +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +####################################################################### + +# LED Pin - wiringPi pin 0 is BCM_GPIO 17. + +PIN=0 + +gpio mode $PIN out + +while true; do + gpio write $PIN 1 + sleep 0.5 + gpio write $PIN 0 + sleep 0.5 +done diff --git a/modules/catkin_ws/src/wiringPi/examples/blink12.c b/modules/catkin_ws/src/wiringPi/examples/blink12.c new file mode 100644 index 00000000..c9b3d506 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink12.c @@ -0,0 +1,111 @@ +/* + * blink12.c: + * Simple sequence over the first 12 GPIO pins - LEDs + * Aimed at the Gertboard, but it's fairly generic. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +// Simple sequencer data +// Triplets of LED, On/Off and delay + +int data [] = +{ + 0, 1, 1, + 1, 1, 1, + 0, 0, 0, 2, 1, 1, + 1, 0, 0, 3, 1, 1, + 2, 0, 0, 4, 1, 1, + 3, 0, 0, 5, 1, 1, + 4, 0, 0, 6, 1, 1, + 5, 0, 0, 7, 1, 1, + 6, 0, 0, 11, 1, 1, + 7, 0, 0, 10, 1, 1, + 11, 0, 0, 13, 1, 1, + 10, 0, 0, 12, 1, 1, + 13, 0, 1, + 12, 0, 1, + + 0, 0, 1, // Extra delay + +// Back again + + 12, 1, 1, + 13, 1, 1, + 12, 0, 0, 10, 1, 1, + 13, 0, 0, 11, 1, 1, + 10, 0, 0, 7, 1, 1, + 11, 0, 0, 6, 1, 1, + 7, 0, 0, 5, 1, 1, + 6, 0, 0, 4, 1, 1, + 5, 0, 0, 3, 1, 1, + 4, 0, 0, 2, 1, 1, + 3, 0, 0, 1, 1, 1, + 2, 0, 0, 0, 1, 1, + 1, 0, 1, + 0, 0, 1, + + 0, 0, 1, // Extra delay + + 0, 9, 0, // End marker + +} ; + + +int main (void) +{ + int pin ; + int dataPtr ; + int l, s, d ; + + printf ("Raspberry Pi - 12-LED Sequence\n") ; + printf ("==============================\n") ; + printf ("\n") ; + printf ("Connect LEDs up to the first 8 GPIO pins, then pins 11, 10, 13, 12 in\n") ; + printf (" that order, then sit back and watch the show!\n") ; + + wiringPiSetup () ; + + for (pin = 0 ; pin < 14 ; ++pin) + pinMode (pin, OUTPUT) ; + + dataPtr = 0 ; + + for (;;) + { + l = data [dataPtr++] ; // LED + s = data [dataPtr++] ; // State + d = data [dataPtr++] ; // Duration (10ths) + + if (s == 9) // 9 -> End Marker + { + dataPtr = 0 ; + continue ; + } + + digitalWrite (l, s) ; + delay (d * 100) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c b/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c new file mode 100644 index 00000000..6ee11fd1 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c @@ -0,0 +1,125 @@ +/* + * blink12drcs.c: + * Simple sequence over the first 12 GPIO pins - LEDs + * Aimed at the Gertboard, but it's fairly generic. + * This version uses DRC totalk to the ATmega on the Gertboard + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <drcSerial.h> + +#define GERT_BASE 100 + +static int pinMap [] = +{ + 0, 1, 2, 3, // Pi Native + GERT_BASE + 2, GERT_BASE + 3, GERT_BASE + 4, GERT_BASE + 5, + GERT_BASE + 6, GERT_BASE + 7, GERT_BASE + 8, GERT_BASE + 9, +} ; + +// Simple sequencer data +// Triplets of LED, On/Off and delay + + +int data [] = +{ + 0, 1, 1, + 1, 1, 1, + 0, 0, 0, 2, 1, 1, + 1, 0, 0, 3, 1, 1, + 2, 0, 0, 4, 1, 1, + 3, 0, 0, 5, 1, 1, + 4, 0, 0, 6, 1, 1, + 5, 0, 0, 7, 1, 1, + 6, 0, 0, 8, 1, 1, + 7, 0, 0, 9, 1, 1, + 8, 0, 0, 10, 1, 1, + 9, 0, 0, 11, 1, 1, + 10, 0, 1, + 11, 0, 1, + + 0, 0, 1, // Extra delay + +// Back again + + 11, 1, 1, + 10, 1, 1, + 11, 0, 0, 9, 1, 1, + 10, 0, 0, 8, 1, 1, + 9, 0, 0, 7, 1, 1, + 8, 0, 0, 6, 1, 1, + 7, 0, 0, 5, 1, 1, + 6, 0, 0, 4, 1, 1, + 5, 0, 0, 3, 1, 1, + 4, 0, 0, 2, 1, 1, + 3, 0, 0, 1, 1, 1, + 2, 0, 0, 0, 1, 1, + 1, 0, 1, + 0, 0, 1, + + 0, 0, 1, // Extra delay + + 0, 9, 0, // End marker + +} ; + + +int main (void) +{ + int pin ; + int dataPtr ; + int l, s, d ; + + printf ("Raspberry Pi - 12-LED Sequence\n") ; + printf ("==============================\n") ; + printf ("\n") ; + printf ("Connect LEDs up to the first 4 Pi pins and 8 pins on the ATmega\n") ; + printf (" from PD2 through PB1 in that order,\n") ; + printf (" then sit back and watch the show!\n") ; + + wiringPiSetup () ; + drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; + + for (pin = 0 ; pin < 12 ; ++pin) + pinMode (pinMap [pin], OUTPUT) ; + + dataPtr = 0 ; + + for (;;) + { + l = data [dataPtr++] ; // LED + s = data [dataPtr++] ; // State + d = data [dataPtr++] ; // Duration (10ths) + + if (s == 9) // 9 -> End Marker + { + dataPtr = 0 ; + continue ; + } + + digitalWrite (pinMap [l], s) ; + delay (d * analogRead (GERT_BASE) / 4) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c b/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c new file mode 100644 index 00000000..32f4921e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c @@ -0,0 +1,115 @@ +/* + * blink6drcs.c: + * Simple sequence over 6 pins on a remote DRC board. + * Aimed at the Gertduino, but it's fairly generic. + * This version uses DRC to talk to the ATmega on the Gertduino + * + * Copyright (c) 2012-2014 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <drcSerial.h> + +#define GERT_BASE 100 + +static int pinMap [] = +{ + GERT_BASE + 6, GERT_BASE + 5, GERT_BASE + 3, GERT_BASE + 10, GERT_BASE + 9, GERT_BASE + 13, +} ; + +// Simple sequencer data +// Triplets of LED, On/Off and delay + + +int data [] = +{ + 0, 1, 1, + 1, 1, 1, + 0, 0, 0, 2, 1, 1, + 1, 0, 0, 3, 1, 1, + 2, 0, 0, 4, 1, 1, + 3, 0, 0, 5, 1, 1, + 4, 0, 1, + 5, 0, 1, + + 0, 0, 1, // Extra delay + +// Back again + + 5, 1, 1, + 4, 1, 1, + 5, 0, 0, 3, 1, 1, + 4, 0, 0, 2, 1, 1, + 3, 0, 0, 1, 1, 1, + 2, 0, 0, 0, 1, 1, + 1, 0, 1, + 0, 0, 1, + + 0, 0, 1, // Extra delay + + 0, 9, 0, // End marker + +} ; + + +int main (void) +{ + int pin ; + int dataPtr ; + int l, s, d ; + + printf ("Raspberry Pi - 6-LED Sequence\n") ; + printf ("=============================\n") ; + printf ("\n") ; + printf (" Use the 2 buttons to temporarily speed up the sequence\n") ; + + wiringPiSetupSys () ; // Not using the Pi's GPIO here + drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; + + for (pin = 0 ; pin < 6 ; ++pin) + pinMode (pinMap [pin], OUTPUT) ; + + pinMode (GERT_BASE + 16, INPUT) ; // Buttons + pinMode (GERT_BASE + 17, INPUT) ; + + pullUpDnControl (GERT_BASE + 16, PUD_UP) ; + pullUpDnControl (GERT_BASE + 17, PUD_UP) ; + + dataPtr = 0 ; + + for (;;) + { + l = data [dataPtr++] ; // LED + s = data [dataPtr++] ; // State + d = data [dataPtr++] ; // Duration (10ths) + + if (s == 9) // 9 -> End Marker + { + dataPtr = 0 ; + continue ; + } + + digitalWrite (pinMap [l], s) ; + delay (d * digitalRead (GERT_BASE + 16) * 15 + digitalRead (GERT_BASE + 17) * 20) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/blink8.c b/modules/catkin_ws/src/wiringPi/examples/blink8.c new file mode 100644 index 00000000..602d3c05 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/blink8.c @@ -0,0 +1,57 @@ +/* + * blink8.c: + * Simple sequence over the first 8 GPIO pins - LEDs + * Aimed at the Gertboard, but it's fairly generic. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +int main (void) +{ + int i, led ; + + printf ("Raspberry Pi - 8-LED Sequencer\n") ; + printf ("==============================\n") ; + printf ("\n") ; + printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ; + + wiringPiSetup () ; + + for (i = 0 ; i < 8 ; ++i) + pinMode (i, OUTPUT) ; + + for (;;) + { + for (led = 0 ; led < 8 ; ++led) + { + digitalWrite (led, 1) ; + delay (100) ; + } + + for (led = 0 ; led < 8 ; ++led) + { + digitalWrite (led, 0) ; + delay (100) ; + } + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/clock.c b/modules/catkin_ws/src/wiringPi/examples/clock.c new file mode 100644 index 00000000..9a53210a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/clock.c @@ -0,0 +1,201 @@ +/* + * clock.c: + * Demo of the 128x64 graphics based LCD driver. + * This is designed to drive the parallel interface LCD drivers + * based on the popular 12864H controller chip. + * + * This test program assumes the following: + * (Which is currently hard-wired into the driver) + * + * GPIO 0-7 is connected to display data pins 0-7. + * GPIO 10 is CS1 + * GPIO 11 is CS2 + * GPIO 12 is STROBE + * GPIO 10 is RS + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <time.h> +#include <math.h> + +#include <wiringPi.h> +#include <lcd128x64.h> + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +double clockRadius ; +double thickness, barLen ; +int maxX, maxY ; + +double rads (double degs) +{ + return degs * M_PI / 180.0 ; +} + +void drawClockHands (void) +{ + time_t t ; + struct tm *now ; + double angle, p, x0, y0, x1, y1 ; + int h24, h, m, s ; + char text [20] ; + + time (&t) ; + now = localtime (&t) ; + + h24 = now->tm_hour ; + m = now->tm_min ; + s = now->tm_sec ; + + h = h24 ; + if (h > 12) + h -= 12 ; + +// Hour hand + + angle = h * 30 + m * 0.5 ; + x0 = sin (rads (angle)) * (clockRadius * 0.75) ; + y0 = cos (rads (angle)) * (clockRadius * 0.75) ; + for (p = -3.0 ; p <= 3.0 ; p += 0.2) + { + x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ; + y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ; + lcd128x64line (0, 0, x1, y1, 1) ; + lcd128x64lineTo (x0, y0, 1) ; + } + +// Minute hand + + angle = m * 6 ; + x0 = sin (rads (angle)) * (clockRadius * 0.9) ; + y0 = cos (rads (angle)) * (clockRadius * 0.9) ; + for (p = -1.0 ; p <= 1.0 ; p += 0.2) + { + x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ; + y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ; + lcd128x64line (0, 0, x1, y1, 1) ; + lcd128x64lineTo (x0, y0, 1) ; + } + +// Second hand + + angle = s * 6 ; + x0 = sin (rads (angle)) * (clockRadius * 0.2) ; + y0 = cos (rads (angle)) * (clockRadius * 0.2) ; + x1 = sin (rads (angle)) * (clockRadius * 0.95) ; + y1 = cos (rads (angle)) * (clockRadius * 0.95) ; + lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ; + lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; + lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; + +// Text: + + sprintf (text, "%02d:%02d:%02d", h24, m, s) ; + lcd128x64puts (32, 24, text, 0, 1) ; + + sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ; + lcd128x64puts (32, -23, text, 0, 1) ; +} + +void drawClockFace (void) +{ + int m ; + double d, px1, py1, px2, py2 ; + + lcd128x64clear (0) ; + lcd128x64circle (0,0, clockRadius, 1, TRUE) ; + lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; + +// The four big indicators for 12,15,30 and 45 + + lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 + lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 + lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 + lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 + + +// Smaller 5 and 1 minute ticks + + for (m = 0 ; m < 60 ; ++m) + { + px1 = sin (rads (m * 6)) * clockRadius ; + py1 = cos (rads (m * 6)) * clockRadius ; + if ((m % 5) == 0) + d = barLen ; + else + d = barLen / 2.0 ; + + px2 = sin (rads (m * 6)) * (clockRadius - d) ; + py2 = cos (rads (m * 6)) * (clockRadius - d) ; + lcd128x64line (px1, py1, px2, py2, 1) ; + } +} + +void setup (void) +{ + lcd128x64getScreenSize (&maxX, &maxY) ; + clockRadius = maxY / 2 - 1 ; + thickness = maxX / 48 ; + barLen = thickness * 4 ; + lcd128x64setOrigin (32, 32) ; +} + + + + +/* + *********************************************************************** + * The main program + *********************************************************************** + */ + +int main (int argc, char *argv []) +{ + time_t now ; + + wiringPiSetup () ; + + lcd128x64setup () ; + + setup () ; + for (;;) + { + drawClockFace () ; + drawClockHands () ; + lcd128x64update () ; + + now = time (NULL) ; + while (time (NULL) == now) + delay (10) ; + } + + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/delayTest.c b/modules/catkin_ws/src/wiringPi/examples/delayTest.c new file mode 100644 index 00000000..4c8b6ca4 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/delayTest.c @@ -0,0 +1,107 @@ +/* + * delayTest.c: + * Just a little test program I'm using to experiment with + * various timings and latency, etc. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <unistd.h> +#include <wiringPi.h> + +#include <sys/time.h> + +#define CYCLES 1000 + +int main() +{ + int x ; + struct timeval t1, t2 ; + int t ; + int max, min ; + int del ; + int underRuns, overRuns, exactRuns, total ; + int descheds ; + + if (wiringPiSetup () == -1) + return 1 ; + + piHiPri (10) ; sleep (1) ; + +// Baseline test + + gettimeofday (&t1, NULL) ; + gettimeofday (&t2, NULL) ; + + t = t2.tv_usec - t1.tv_usec ; + printf ("Baseline test: %d\n", t); + + for (del = 1 ; del < 200 ; ++del) + { + underRuns = overRuns = exactRuns = total = 0 ; + descheds = 0 ; + max = del ; + min = del ; + + for (x = 0 ; x < CYCLES ; ++x) + { + for (;;) // Repeat this if we get a delay over 999uS + { // -> High probability Linux has deschedulled us + gettimeofday (&t1, NULL) ; + delayMicroseconds (del) ; + gettimeofday (&t2, NULL) ; + + if (t2.tv_usec < t1.tv_usec) // Counter wrapped + t = (1000000 + t2.tv_usec) - t1.tv_usec; + else + t = t2.tv_usec - t1.tv_usec ; + if (t > 999) + { + ++descheds ; + continue ; + } + else + break ; + } + + if (t > max) + { + max = t ; + ++overRuns ; + } + else if (t < min) + { + min = t ; + ++underRuns ; + } + else + ++exactRuns ; + + total += t ; + } + printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d, Descheds: %2d\n", + del, min, max, underRuns, overRuns, exactRuns, total / CYCLES, descheds) ; + fflush (stdout) ; + delay (1) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/ds1302.c b/modules/catkin_ws/src/wiringPi/examples/ds1302.c new file mode 100644 index 00000000..f1e9e205 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/ds1302.c @@ -0,0 +1,238 @@ +/* + * ds1302.c: + * Real Time clock + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> +#include <time.h> + +#include <wiringPi.h> +#include <ds1302.h> + +// Register defines + +#define RTC_SECS 0 +#define RTC_MINS 1 +#define RTC_HOURS 2 +#define RTC_DATE 3 +#define RTC_MONTH 4 +#define RTC_DAY 5 +#define RTC_YEAR 6 +#define RTC_WP 7 +#define RTC_TC 8 +#define RTC_BM 31 + + +static unsigned int masks [] = { 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x07, 0xFF } ; + + +/* + * bcdToD: dToBCD: + * BCD decode/encode + ********************************************************************************* + */ + +static int bcdToD (unsigned int byte, unsigned int mask) +{ + unsigned int b1, b2 ; + byte &= mask ; + b1 = byte & 0x0F ; + b2 = ((byte >> 4) & 0x0F) * 10 ; + return b1 + b2 ; +} + +static unsigned int dToBcd (unsigned int byte) +{ + return ((byte / 10) << 4) + (byte % 10) ; +} + + +/* + * ramTest: + * Simple test of the 31 bytes of RAM inside the DS1302 chip + ********************************************************************************* + */ + +static int ramTestValues [] = + { 0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xF0, 0x0F, -1 } ; + +static int ramTest (void) +{ + int addr ; + int got ; + int i = 0 ; + int errors = 0 ; + int testVal ; + + printf ("DS1302 RAM TEST\n") ; + + testVal = ramTestValues [i] ; + + while (testVal != -1) + { + for (addr = 0 ; addr < 31 ; ++addr) + ds1302ramWrite (addr, testVal) ; + + for (addr = 0 ; addr < 31 ; ++addr) + if ((got = ds1302ramRead (addr)) != testVal) + { + printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", + addr, testVal, got) ; + ++errors ; + } + testVal = ramTestValues [++i] ; + } + + for (addr = 0 ; addr < 31 ; ++addr) + ds1302ramWrite (addr, addr) ; + + for (addr = 0 ; addr < 31 ; ++addr) + if ((got = ds1302ramRead (addr)) != addr) + { + printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", + addr, addr, got) ; + ++errors ; + } + + if (errors == 0) + printf ("-- DS1302 RAM TEST: OK\n") ; + else + printf ("-- DS1302 RAM TEST FAILURE. %d errors.\n", errors) ; + + return 0 ; +} + +/* + * setLinuxClock: + * Set the Linux clock from the hardware + ********************************************************************************* + */ + +static int setLinuxClock (void) +{ + char dateTime [20] ; + char command [64] ; + int clock [8] ; + + + printf ("Setting the Linux Clock from the DS1302... ") ; fflush (stdout) ; + + ds1302clockRead (clock) ; + +// [MMDDhhmm[[CC]YY][.ss]] + + sprintf (dateTime, "%02d%02d%02d%02d%02d%02d.%02d", + bcdToD (clock [RTC_MONTH], masks [RTC_MONTH]), + bcdToD (clock [RTC_DATE], masks [RTC_DATE]), + bcdToD (clock [RTC_HOURS], masks [RTC_HOURS]), + bcdToD (clock [RTC_MINS], masks [RTC_MINS]), + 20, + bcdToD (clock [RTC_YEAR], masks [RTC_YEAR]), + bcdToD (clock [RTC_SECS], masks [RTC_SECS])) ; + + sprintf (command, "/bin/date %s", dateTime) ; + system (command) ; + + return 0 ; +} + + +/* + * setDSclock: + * Set the DS1302 block from Linux time + ********************************************************************************* + */ + +static int setDSclock (void) +{ + struct tm t ; + time_t now ; + int clock [8] ; + + printf ("Setting the clock in the DS1302 from Linux time... ") ; + + now = time (NULL) ; + gmtime_r (&now, &t) ; + + clock [ 0] = dToBcd (t.tm_sec) ; // seconds + clock [ 1] = dToBcd (t.tm_min) ; // mins + clock [ 2] = dToBcd (t.tm_hour) ; // hours + clock [ 3] = dToBcd (t.tm_mday) ; // date + clock [ 4] = dToBcd (t.tm_mon + 1) ; // months 0-11 --> 1-12 + clock [ 5] = dToBcd (t.tm_wday + 1) ; // weekdays (sun 0) + clock [ 6] = dToBcd (t.tm_year - 100) ; // years + clock [ 7] = 0 ; // W-Protect off + + ds1302clockWrite (clock) ; + + printf ("OK\n") ; + + return 0 ; +} + + + + +int main (int argc, char *argv []) +{ + int i ; + int clock [8] ; + + wiringPiSetup () ; + ds1302setup (0, 1, 2) ; + + if (argc == 2) + { + /**/ if (strcmp (argv [1], "-slc") == 0) + return setLinuxClock () ; + else if (strcmp (argv [1], "-sdsc") == 0) + return setDSclock () ; + else if (strcmp (argv [1], "-rtest") == 0) + return ramTest () ; + else + { + printf ("Usage: ds1302 [-slc | -sdsc | -rtest]\n") ; + return EXIT_FAILURE ; + } + } + + for (i = 0 ;; ++i) + { + printf ("%5d: ", i) ; + + ds1302clockRead (clock) ; + printf (" %2d:%02d:%02d", + bcdToD (clock [2], masks [2]), bcdToD (clock [1], masks [1]), bcdToD (clock [0], masks [0])) ; + + printf (" %2d/%02d/%04d", + bcdToD (clock [3], masks [3]), bcdToD (clock [4], masks [4]), bcdToD (clock [6], masks [6]) + 2000) ; + + printf ("\n") ; + + delay (200) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/header.h b/modules/catkin_ws/src/wiringPi/examples/header.h new file mode 100644 index 00000000..82f723d3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/header.h @@ -0,0 +1,23 @@ +/* + * file.c: + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + diff --git a/modules/catkin_ws/src/wiringPi/examples/isr-osc.c b/modules/catkin_ws/src/wiringPi/examples/isr-osc.c new file mode 100644 index 00000000..a872ee3a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/isr-osc.c @@ -0,0 +1,118 @@ +/* + * isr-osc.c: + * Wait for Interrupt test program - ISR method - interrupt oscillator + * + * How to test: + * + * IMPORTANT: To run this test we connect 2 GPIO pins together, but + * before we do that YOU must make sure that they are both setup + * the right way. If they are set to outputs and one is high and one low, + * then you connect the wire, you'll create a short and that won't be good. + * + * Before making the connection, type: + * gpio mode 0 output + * gpio write 0 0 + * gpio mode 1 input + * then you can connect them together. + * + * Run the program, then: + * gpio write 0 1 + * gpio write 0 0 + * + * at which point it will trigger an interrupt and the program will + * then do the up/down toggling for itself and run at full speed, and + * it will report the number of interrupts recieved every second. + * + * Copyright (c) 2013 Gordon Henderson. projects@drogon.net + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> +#include <wiringPi.h> + + +// What GPIO input are we using? +// This is a wiringPi pin number + +#define OUT_PIN 0 +#define IN_PIN 1 + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter = 0 ; + +/* + * myInterrupt: + ********************************************************************************* + */ + +void myInterrupt (void) +{ + digitalWrite (OUT_PIN, 1) ; + ++globalCounter ; + digitalWrite (OUT_PIN, 0) ; +} + + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +int main (void) +{ + int myCounter = 0 ; + int lastCounter = 0 ; + + if (wiringPiSetup () < 0) + { + fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ; + return 1 ; + } + + pinMode (OUT_PIN, OUTPUT) ; + pinMode (IN_PIN, INPUT) ; + + if (wiringPiISR (IN_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) + { + fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ; + return 1 ; + } + + for (;;) + { + printf ("Waiting ... ") ; fflush (stdout) ; + + while (myCounter == globalCounter) + delay (1000) ; + + printf (" Done. counter: %6d: %6d\n", + globalCounter, myCounter - lastCounter) ; + lastCounter = myCounter ; + myCounter = globalCounter ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/isr.c b/modules/catkin_ws/src/wiringPi/examples/isr.c new file mode 100644 index 00000000..abc6aec9 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/isr.c @@ -0,0 +1,110 @@ +/* + * isr.c: + * Wait for Interrupt test program - ISR method + * + * How to test: + * Use the SoC's pull-up and pull down resistors that are avalable + * on input pins. So compile & run this program (via sudo), then + * in another terminal: + * gpio mode 0 up + * gpio mode 0 down + * at which point it should trigger an interrupt. Toggle the pin + * up/down to generate more interrupts to test. + * + * Copyright (c) 2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> +#include <wiringPi.h> + + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter [8] ; + + +/* + * myInterrupt: + ********************************************************************************* + */ + +void myInterrupt0 (void) { ++globalCounter [0] ; } +void myInterrupt1 (void) { ++globalCounter [1] ; } +void myInterrupt2 (void) { ++globalCounter [2] ; } +void myInterrupt3 (void) { ++globalCounter [3] ; } +void myInterrupt4 (void) { ++globalCounter [4] ; } +void myInterrupt5 (void) { ++globalCounter [5] ; } +void myInterrupt6 (void) { ++globalCounter [6] ; } +void myInterrupt7 (void) { ++globalCounter [7] ; } + + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +int main (void) +{ + int gotOne, pin ; + int myCounter [8] ; + + for (pin = 0 ; pin < 8 ; ++pin) + globalCounter [pin] = myCounter [pin] = 0 ; + + wiringPiSetup () ; + + wiringPiISR (0, INT_EDGE_FALLING, &myInterrupt0) ; + wiringPiISR (1, INT_EDGE_FALLING, &myInterrupt1) ; + wiringPiISR (2, INT_EDGE_FALLING, &myInterrupt2) ; + wiringPiISR (3, INT_EDGE_FALLING, &myInterrupt3) ; + wiringPiISR (4, INT_EDGE_FALLING, &myInterrupt4) ; + wiringPiISR (5, INT_EDGE_FALLING, &myInterrupt5) ; + wiringPiISR (6, INT_EDGE_FALLING, &myInterrupt6) ; + wiringPiISR (7, INT_EDGE_FALLING, &myInterrupt7) ; + + for (;;) + { + gotOne = 0 ; + printf ("Waiting ... ") ; fflush (stdout) ; + + for (;;) + { + for (pin = 0 ; pin < 8 ; ++pin) + { + if (globalCounter [pin] != myCounter [pin]) + { + printf (" Int on pin %d: Counter: %5d\n", pin, globalCounter [pin]) ; + myCounter [pin] = globalCounter [pin] ; + ++gotOne ; + } + } + if (gotOne != 0) + break ; + } + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c b/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c new file mode 100644 index 00000000..47c9b9b2 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c @@ -0,0 +1,347 @@ +/* + * lcd-adafruit.c: + * Text-based LCD driver test code + * This is designed to drive the Adafruit RGB LCD Plate + * with the additional 5 buttons for the Raspberry Pi + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <time.h> + +#include <wiringPi.h> +#include <mcp23017.h> +#include <lcd.h> + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + + +// Defines for the Adafruit Pi LCD interface board + +#define AF_BASE 100 +#define AF_RED (AF_BASE + 6) +#define AF_GREEN (AF_BASE + 7) +#define AF_BLUE (AF_BASE + 8) + +#define AF_E (AF_BASE + 13) +#define AF_RW (AF_BASE + 14) +#define AF_RS (AF_BASE + 15) + +#define AF_DB4 (AF_BASE + 12) +#define AF_DB5 (AF_BASE + 11) +#define AF_DB6 (AF_BASE + 10) +#define AF_DB7 (AF_BASE + 9) + +#define AF_SELECT (AF_BASE + 0) +#define AF_RIGHT (AF_BASE + 1) +#define AF_DOWN (AF_BASE + 2) +#define AF_UP (AF_BASE + 3) +#define AF_LEFT (AF_BASE + 4) + + +// User-Defined character test + +static unsigned char newChar [8] = +{ + 0b00100, + 0b00100, + 0b00000, + 0b00100, + 0b01110, + 0b11011, + 0b11011, + 0b10001, +} ; + +// Global lcd handle: + +static int lcdHandle ; + +/* + * usage: + ********************************************************************************* + */ + +int usage (const char *progName) +{ + fprintf (stderr, "Usage: %s colour\n", progName) ; + return EXIT_FAILURE ; +} + + +/* + * scrollMessage: + ********************************************************************************* + */ + +static const char *message = + " " + "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" + " " ; + +void scrollMessage (int line, int width) +{ + char buf [32] ; + static int position = 0 ; + static int timer = 0 ; + + if (millis () < timer) + return ; + + timer = millis () + 200 ; + + strncpy (buf, &message [position], width) ; + buf [width] = 0 ; + lcdPosition (lcdHandle, 0, line) ; + lcdPuts (lcdHandle, buf) ; + + if (++position == (strlen (message) - width)) + position = 0 ; +} + + +/* + * setBacklightColour: + * The colour outputs are inverted. + ********************************************************************************* + */ + +static void setBacklightColour (int colour) +{ + colour &= 7 ; + + digitalWrite (AF_RED, !(colour & 1)) ; + digitalWrite (AF_GREEN, !(colour & 2)) ; + digitalWrite (AF_BLUE, !(colour & 4)) ; +} + + +/* + * adafruitLCDSetup: + * Setup the Adafruit board by making sure the additional pins are + * set to the correct modes, etc. + ********************************************************************************* + */ + +static void adafruitLCDSetup (int colour) +{ + int i ; + +// Backlight LEDs + + pinMode (AF_RED, OUTPUT) ; + pinMode (AF_GREEN, OUTPUT) ; + pinMode (AF_BLUE, OUTPUT) ; + setBacklightColour (colour) ; + +// Input buttons + + for (i = 0 ; i <= 4 ; ++i) + { + pinMode (AF_BASE + i, INPUT) ; + pullUpDnControl (AF_BASE + i, PUD_UP) ; // Enable pull-ups, switches close to 0v + } + +// Control signals + + pinMode (AF_RW, OUTPUT) ; digitalWrite (AF_RW, LOW) ; // Not used with wiringPi - always in write mode + +// The other control pins are initialised with lcdInit () + + lcdHandle = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ; + + if (lcdHandle < 0) + { + fprintf (stderr, "lcdInit failed\n") ; + exit (EXIT_FAILURE) ; + } +} + + +/* + * waitForEnter: + * On the Adafruit display, wait for the select button + ********************************************************************************* + */ + +static void waitForEnter (void) +{ + printf ("Press SELECT to continue: ") ; fflush (stdout) ; + + while (digitalRead (AF_SELECT) == HIGH) // Wait for push + delay (1) ; + + while (digitalRead (AF_SELECT) == LOW) // Wait for release + delay (1) ; + + printf ("OK\n") ; +} + + +/* + * speedTest: + * Test the update speed of the display + ********************************************************************************* + */ + +static void speedTest (void) +{ + unsigned int start, end, taken ; + int times ; + + lcdClear (lcdHandle) ; + start = millis () ; + for (times = 0 ; times < 10 ; ++times) + { + lcdPuts (lcdHandle, "0123456789ABCDEF") ; + lcdPuts (lcdHandle, "0123456789ABCDEF") ; + } + end = millis () ; + taken = (end - start) / 10; + + lcdClear (lcdHandle) ; + lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Speed: %dmS", taken) ; + lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "For full update") ; + + waitForEnter () ; + + lcdClear (lcdHandle) ; + lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Time: %dmS", taken / 32) ; + lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "Per character") ; + + waitForEnter () ; + + lcdClear (lcdHandle) ; + lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "%d cps...", 32000 / taken) ; + + waitForEnter () ; +} + + +/* + * The works + ********************************************************************************* + */ + +int main (int argc, char *argv[]) +{ + int colour ; + int cols = 16 ; + int waitForRelease = FALSE ; + + struct tm *t ; + time_t tim ; + + char buf [32] ; + + if (argc != 2) + return usage (argv [0]) ; + + printf ("Raspberry Pi Adafruit LCD test\n") ; + printf ("==============================\n") ; + + colour = atoi (argv [1]) ; + + wiringPiSetupSys () ; + mcp23017Setup (AF_BASE, 0x20) ; + + adafruitLCDSetup (colour) ; + + lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; + lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; + + waitForEnter () ; + + lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "Adafruit RGB LCD") ; + + waitForEnter () ; + + lcdCharDef (lcdHandle, 2, newChar) ; + + lcdClear (lcdHandle) ; + lcdPosition (lcdHandle, 0, 0) ; + lcdPuts (lcdHandle, "User Char: ") ; + lcdPutchar (lcdHandle, 2) ; + + lcdCursor (lcdHandle, TRUE) ; + lcdCursorBlink (lcdHandle, TRUE) ; + + waitForEnter () ; + + lcdCursor (lcdHandle, FALSE) ; + lcdCursorBlink (lcdHandle, FALSE) ; + + speedTest () ; + + lcdClear (lcdHandle) ; + + for (;;) + { + scrollMessage (0, cols) ; + + tim = time (NULL) ; + t = localtime (&tim) ; + + sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; + + lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; + lcdPuts (lcdHandle, buf) ; + +// Check buttons to cycle colour + +// If Up or Down are still pushed, then skip + + if (waitForRelease) + { + if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW)) + continue ; + else + waitForRelease = FALSE ; + } + + if (digitalRead (AF_UP) == LOW) // Pushed + { + colour = colour + 1 ; + if (colour == 8) + colour = 0 ; + setBacklightColour (colour) ; + waitForRelease = TRUE ; + } + + if (digitalRead (AF_DOWN) == LOW) // Pushed + { + colour = colour - 1 ; + if (colour == -1) + colour = 7 ; + setBacklightColour (colour) ; + waitForRelease = TRUE ; + } + + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/lcd.c b/modules/catkin_ws/src/wiringPi/examples/lcd.c new file mode 100644 index 00000000..510f5620 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/lcd.c @@ -0,0 +1,286 @@ +/* + * lcd.c: + * Text-based LCD driver. + * This is designed to drive the parallel interface LCD drivers + * based in the Hitachi HD44780U controller and compatables. + * + * This test program assumes the following: + * + * 8-bit displays: + * GPIO 0-7 is connected to display data pins 0-7. + * GPIO 11 is the RS pin. + * GPIO 10 is the Strobe/E pin. + * + * For 4-bit interface: + * GPIO 4-7 is connected to display data pins 4-7. + * GPIO 11 is the RS pin. + * GPIO 10 is the Strobe/E pin. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include <unistd.h> +#include <string.h> +#include <time.h> + +#include <wiringPi.h> +#include <lcd.h> + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +static unsigned char newChar [8] = +{ + 0b11111, + 0b10001, + 0b10001, + 0b10101, + 0b11111, + 0b10001, + 0b10001, + 0b11111, +} ; + + +// Global lcd handle: + +static int lcdHandle ; + +/* + * usage: + ********************************************************************************* + */ + +int usage (const char *progName) +{ + fprintf (stderr, "Usage: %s bits cols rows\n", progName) ; + return EXIT_FAILURE ; +} + + +/* + * scrollMessage: + ********************************************************************************* + */ + +static const char *message = + " " + "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" + " " ; + +void scrollMessage (int line, int width) +{ + char buf [32] ; + static int position = 0 ; + static int timer = 0 ; + + if (millis () < timer) + return ; + + timer = millis () + 200 ; + + strncpy (buf, &message [position], width) ; + buf [width] = 0 ; + lcdPosition (lcdHandle, 0, line) ; + lcdPuts (lcdHandle, buf) ; + + if (++position == (strlen (message) - width)) + position = 0 ; +} + + +/* + * pingPong: + * Bounce a character - only on 4-line displays + ********************************************************************************* + */ + +static void pingPong (int lcd, int cols) +{ + static int position = 0 ; + static int dir = 0 ; + + if (dir == 0) // Setup + { + dir = 1 ; + lcdPosition (lcdHandle, 0, 3) ; + lcdPutchar (lcdHandle, '*') ; + return ; + } + + lcdPosition (lcdHandle, position, 3) ; + lcdPutchar (lcdHandle, ' ') ; + position += dir ; + + if (position == cols) + { + dir = -1 ; + --position ; + } + + if (position < 0) + { + dir = 1 ; + ++position ; + } + + lcdPosition (lcdHandle, position, 3) ; + lcdPutchar (lcdHandle, '#') ; +} + + +/* + * waitForEnter: + ********************************************************************************* + */ + +static void waitForEnter (void) +{ + printf ("Press ENTER to continue: ") ; + (void)fgetc (stdin) ; +} + + +/* + * The works + ********************************************************************************* + */ + +int main (int argc, char *argv[]) +{ + int i ; + int lcd ; + int bits, rows, cols ; + + struct tm *t ; + time_t tim ; + + char buf [32] ; + + if (argc != 4) + return usage (argv [0]) ; + + printf ("Raspberry Pi LCD test\n") ; + printf ("=====================\n") ; + + bits = atoi (argv [1]) ; + cols = atoi (argv [2]) ; + rows = atoi (argv [3]) ; + + if (!((rows == 1) || (rows == 2) || (rows == 4))) + { + fprintf (stderr, "%s: rows must be 1, 2 or 4\n", argv [0]) ; + return EXIT_FAILURE ; + } + + if (!((cols == 16) || (cols == 20))) + { + fprintf (stderr, "%s: cols must be 16 or 20\n", argv [0]) ; + return EXIT_FAILURE ; + } + + wiringPiSetup () ; + + if (bits == 4) + lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ; + else + lcdHandle = lcdInit (rows, cols, 8, 11,10, 0,1,2,3,4,5,6,7) ; + + if (lcdHandle < 0) + { + fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ; + return -1 ; + } + + lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; + lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; + + waitForEnter () ; + + if (rows > 1) + { + lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; + + if (rows == 4) + { + lcdPosition (lcdHandle, 0, 2) ; + for (i = 0 ; i < ((cols - 1) / 2) ; ++i) + lcdPuts (lcdHandle, "=-") ; + lcdPuts (lcdHandle, "=3") ; + + lcdPosition (lcdHandle, 0, 3) ; + for (i = 0 ; i < ((cols - 1) / 2) ; ++i) + lcdPuts (lcdHandle, "-=") ; + lcdPuts (lcdHandle, "-4") ; + } + } + + waitForEnter () ; + + lcdCharDef (lcdHandle, 2, newChar) ; + + lcdClear (lcdHandle) ; + lcdPosition (lcdHandle, 0, 0) ; + lcdPuts (lcdHandle, "User Char: ") ; + lcdPutchar (lcdHandle, 2) ; + + lcdCursor (lcdHandle, TRUE) ; + lcdCursorBlink (lcdHandle, TRUE) ; + + waitForEnter () ; + + lcdCursor (lcdHandle, FALSE) ; + lcdCursorBlink (lcdHandle, FALSE) ; + lcdClear (lcdHandle) ; + + for (;;) + { + scrollMessage (0, cols) ; + + if (rows == 1) + continue ; + + tim = time (NULL) ; + t = localtime (&tim) ; + + sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; + + lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; + lcdPuts (lcdHandle, buf) ; + + if (rows == 2) + continue ; + + sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ; + + lcdPosition (lcdHandle, (cols - 10) / 2, 2) ; + lcdPuts (lcdHandle, buf) ; + + pingPong (lcd, cols) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/lowPower.c b/modules/catkin_ws/src/wiringPi/examples/lowPower.c new file mode 100644 index 00000000..e901e7fa --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/lowPower.c @@ -0,0 +1,68 @@ +/* + * lowPower.c: + * Check the Pi's LOW-Power signal. + * + * This is a demonstration program that could be turned into some sort + * of logger via e.g. syslog - however it's also probably something + * that might be better handled by a future kernel - who knows. + * + * Copyright (c) 2014 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <time.h> +#include <wiringPi.h> + + +#define LOW_POWER 35 + +/* + * lowPower: + * This is an ISR that waits for the low-power signal going low and + * prints the result. + ********************************************************************************* + */ + +void lowPower (void) +{ + time_t t ; + + time (&t) ; + printf ("%s: LOW POWER DETECTED\n", ctime (&t)) ; +} + + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +int main (void) +{ + wiringPiSetupGpio () ; // GPIO mode as it's an internal pin + + wiringPiISR (LOW_POWER, INT_EDGE_FALLING, &lowPower) ; + + for (;;) + delay (1000) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/nes.c b/modules/catkin_ws/src/wiringPi/examples/nes.c new file mode 100644 index 00000000..31908e8a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/nes.c @@ -0,0 +1,67 @@ +/* + * nes.c: + * Test program for an old NES controller connected to the Pi. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <wiringPi.h> +#include <piNes.h> + +#define BLANK "| " + +int main () +{ + int joystick ; + unsigned int buttons ; + + if (wiringPiSetup () == -1) + { + fprintf (stdout, "oops: %s\n", strerror (errno)) ; + return 1 ; + } + + if ((joystick = setupNesJoystick (2, 1, 0)) == -1) + { + fprintf (stdout, "Unable to setup joystick\n") ; + return 1 ; + } + + for (;;) + { + buttons = readNesJoystick (joystick) ; + + if ((buttons & NES_UP) != 0) printf ("| UP " ) ; else printf (BLANK) ; + if ((buttons & NES_DOWN) != 0) printf ("| DOWN " ) ; else printf (BLANK) ; + if ((buttons & NES_LEFT) != 0) printf ("| LEFT " ) ; else printf (BLANK) ; + if ((buttons & NES_RIGHT) != 0) printf ("|RIGHT " ) ; else printf (BLANK) ; + if ((buttons & NES_SELECT) != 0) printf ("|SELECT" ) ; else printf (BLANK) ; + if ((buttons & NES_START) != 0) printf ("|START " ) ; else printf (BLANK) ; + if ((buttons & NES_A) != 0) printf ("| A " ) ; else printf (BLANK) ; + if ((buttons & NES_B) != 0) printf ("| B " ) ; else printf (BLANK) ; + printf ("|\n") ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/okLed.c b/modules/catkin_ws/src/wiringPi/examples/okLed.c new file mode 100644 index 00000000..930f266b --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/okLed.c @@ -0,0 +1,82 @@ +/* + * okLed.c: + * Make the OK LED on the Pi Pulsate... + * + * Originally posted to the Raspberry Pi forums: + * http://www.raspberrypi.org/phpBB3/viewtopic.php?p=162581#p162581 + * + * Compile this and store it somewhere, then kick it off at boot time + * e.g. by putting it in /etc/rc.local and running it in the + * background & + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <math.h> + +#include <wiringPi.h> +#include <softPwm.h> + +// The OK/Act LED is connected to BCM_GPIO pin 16 + +#define OK_LED 16 + +int main () +{ + int fd, i ; + + wiringPiSetupGpio () ; + +// Change the trigger on the OK/Act LED to "none" + + if ((fd = open ("/sys/class/leds/led0/trigger", O_RDWR)) < 0) + { + fprintf (stderr, "Unable to change LED trigger: %s\n", strerror (errno)) ; + return 1 ; + } + write (fd, "none\n", 5) ; + close (fd) ; + + softPwmCreate (OK_LED, 0, 100) ; + + for (;;) + { + for (i = 0 ; i <= 100 ; ++i) + { + softPwmWrite (OK_LED, i) ; + delay (10) ; + } + delay (50) ; + + for (i = 100 ; i >= 0 ; --i) + { + softPwmWrite (OK_LED, i) ; + delay (10) ; + } + delay (10) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/pwm.c b/modules/catkin_ws/src/wiringPi/examples/pwm.c new file mode 100644 index 00000000..816c8322 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/pwm.c @@ -0,0 +1,58 @@ +/* + * pwm.c: + * This tests the hardware PWM channel. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +int main (void) +{ + int bright ; + + printf ("Raspberry Pi wiringPi PWM test program\n") ; + + if (wiringPiSetup () == -1) + exit (1) ; + + pinMode (1, PWM_OUTPUT) ; + + for (;;) + { + for (bright = 0 ; bright < 1024 ; ++bright) + { + pwmWrite (1, bright) ; + delay (1) ; + } + + for (bright = 1023 ; bright >= 0 ; --bright) + { + pwmWrite (1, bright) ; + delay (1) ; + } + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile b/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile new file mode 100644 index 00000000..150c825f --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile @@ -0,0 +1,81 @@ +# +# Makefile: +# wiringPi - Wiring Compatable library for the Raspberry Pi +# https://projects.drogon.net/wiring-pi +# +# Copyright (c) 2012-2013 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + + +#DEBUG = -g -O0 +DEBUG = -O3 +CC = gcc +INCLUDE = -I/usr/local/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L/usr/local/lib +LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +############################################################################### + +SRC = blink.c button.c blink-io.c volts.c bright.c + +OBJ = $(SRC:.c=.o) + +BINS = $(SRC:.c=) + +all: $(BINS) + +blink: blink.o + @echo [link] + @$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) + +blink-io: blink-io.o + @echo [link] + @$(CC) -o $@ blink-io.o $(LDFLAGS) $(LDLIBS) + +button: button.o + @echo [link] + @$(CC) -o $@ button.o $(LDFLAGS) $(LDLIBS) + +volts: volts.o + @echo [link] + @$(CC) -o $@ volts.o $(LDFLAGS) $(LDLIBS) + +bright: bright.o + @echo [link] + @$(CC) -o $@ bright.o $(LDFLAGS) $(LDLIBS) + + +.c.o: + @echo [CC] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +clean: + @echo "[Clean]" + @rm -f $(OBJ) *~ core tags $(BINS) + +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c b/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c new file mode 100644 index 00000000..3c987c6a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c @@ -0,0 +1,79 @@ +/* + * binary.c: + * Using the Quick 2 wire 16-bit GPIO expansion board to output + * a binary counter. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <mcp23017.h> + +#define Q2W_BASE 100 + +int main (void) +{ + int i, bit ; + +// Enable the on-goard GPIO + + wiringPiSetup () ; + +// Add in the mcp23017 on the q2w board + + mcp23017Setup (Q2W_BASE, 0x20) ; + + printf ("Raspberry Pi - quite2Wire MCP23017 Test\n") ; + +// On-board button Input: + + pinMode (0, INPUT) ; + +// First 10 pins on q2w board as outputs: + + for (i = 0 ; i < 10 ; ++i) + pinMode (Q2W_BASE + i, OUTPUT) ; + +// Last pin as an input with the internal pull-up enabled + + pinMode (Q2W_BASE + 15, INPUT) ; + pullUpDnControl (Q2W_BASE + 15, PUD_UP) ; + +// Loop, outputting a binary number, +// Go faster with the button, or stop if the +// on-board button is pushed + + for (;;) + { + for (i = 0 ; i < 1024 ; ++i) + { + for (bit = 0 ; bit < 10 ; ++bit) + digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ; + + while (digitalRead (0) == HIGH) // While pushed + delay (1) ; + + if (digitalRead (Q2W_BASE + 15) == HIGH) // Not Pushed + delay (100) ; + } + } + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c b/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c new file mode 100644 index 00000000..4dd42765 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c @@ -0,0 +1,61 @@ +/* + * blink-io.c: + * Simple "blink" test for the Quick2Wire 16-pin IO board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <mcp23017.h> + +#define LED 1 +#define Q2W_BASE 100 + +int main (void) +{ + +// Enable the on-goard GPIO + + wiringPiSetup () ; + +// Add in the mcp23017 on the q2w board + + mcp23017Setup (Q2W_BASE, 0x20) ; + + printf ("Raspberry Pi - Quick2Wire MCP23017 Blink Test\n") ; + +// Blink the on-board LED as well as one on the mcp23017 + + pinMode (LED, OUTPUT) ; + pinMode (Q2W_BASE + 0, OUTPUT) ; + + for (;;) + { + digitalWrite (LED, HIGH) ; + digitalWrite (Q2W_BASE + 0, HIGH) ; + delay (500) ; + digitalWrite (LED, LOW) ; + digitalWrite (Q2W_BASE + 0, LOW) ; + delay (500) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c new file mode 100644 index 00000000..62b694a7 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c @@ -0,0 +1,50 @@ +/* + * blink.c: + * Simple "blink" test for the Quick2Wire interface board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +#define LED 1 + +int main (void) +{ + +// Enable the on-goard GPIO + + wiringPiSetup () ; + + printf ("Raspberry Pi - Quick2Wire Mainboard LED Blink Test\n") ; + + pinMode (LED, OUTPUT) ; + + for (;;) + { + digitalWrite (LED, HIGH) ; + delay (500) ; + digitalWrite (LED, LOW) ; + delay (500) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh new file mode 100755 index 00000000..2dee6c73 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# blink.sh: +# Standard "blink" program in wiringPi. Blinks an LED connected +# to the LED on the Quick2Wire board +# +# Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> +####################################################################### +# This file is part of wiringPi: +# https://projects.drogon.net/raspberry-pi/wiringpi/ +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +####################################################################### + +# LED Pin - wiringPi pin 1 is BCM_GPIO 18. + +LED=1 + +gpio mode $LED out + +while true; do + gpio write $LED 1 + sleep 0.5 + gpio write $LED 0 + sleep 0.5 +done diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c b/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c new file mode 100644 index 00000000..23188341 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c @@ -0,0 +1,59 @@ +/* + * bright.c: + * Vary the Q2W LED brightness with the analog card + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <pcf8591.h> + +#define LED 1 +#define Q2W_ABASE 120 + +int main (void) +{ + int value ; + +// Enable the on-goard GPIO + + wiringPiSetup () ; + +// Add in the pcf8591 on the q2w board + + pcf8591Setup (Q2W_ABASE, 0x48) ; + + printf ("Raspberry Pi - Quick2Wire Analog Test\n") ; + +// Setup the LED + + pinMode (LED, PWM_OUTPUT) ; + pwmWrite (LED, 0) ; + + for (;;) + { + value = analogRead (Q2W_ABASE + 0) ; + pwmWrite (LED, value * 4) ; + delay (10) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/button.c b/modules/catkin_ws/src/wiringPi/examples/q2w/button.c new file mode 100644 index 00000000..1781f02f --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/button.c @@ -0,0 +1,63 @@ +/* + * button.c: + * Simple button test for the Quick2Wire interface board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> + +#define BUTTON 0 +#define LED1 1 +#define LED2 7 + +int main (void) +{ + +// Enable the on-goard GPIO + + wiringPiSetup () ; + + printf ("Raspberry Pi - Quick2Wire Mainboard Button & LED Test\n") ; + + pinMode (BUTTON, INPUT) ; + pinMode (LED1, OUTPUT) ; + pinMode (LED2, OUTPUT) ; + + digitalWrite (LED1, HIGH) ; // On-board LED on + digitalWrite (LED2, LOW) ; // 2nd LED off + + for (;;) + { + if (digitalRead (BUTTON) == HIGH) // Swap LED states + { + digitalWrite (LED1, LOW) ; + digitalWrite (LED2, HIGH) ; + while (digitalRead (BUTTON) == HIGH) + delay (1) ; + digitalWrite (LED1, HIGH) ; + digitalWrite (LED2, LOW) ; + } + delay (1) ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c b/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c new file mode 100644 index 00000000..e0910933 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c @@ -0,0 +1,62 @@ +/* + * volts.c: + * Read in all 4 analogs on the Q2W analog board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <wiringPi.h> +#include <pcf8591.h> + +#define LED 1 +#define Q2W_ABASE 120 + +int main (void) +{ + int value, pin ; + +// Enable the on-goard GPIO + + wiringPiSetup () ; + + pinMode (LED, OUTPUT) ; // On-board LED + +// Add in the pcf8591 on the q2w board + + pcf8591Setup (Q2W_ABASE, 0x48) ; + + printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ; + + for (;;) + { + for (pin = 0 ; pin < 4 ; ++pin) + { + value = analogRead (Q2W_ABASE + pin) ; + printf (" %5.2f", (double)value * 3.3 / 255.0) ; + } + printf ("\r") ; fflush (stdout) ; + + delay (100) ; + digitalWrite (LED, !digitalRead (LED)) ; // Flicker the LED + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/rht03.c b/modules/catkin_ws/src/wiringPi/examples/rht03.c new file mode 100644 index 00000000..566e954c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/rht03.c @@ -0,0 +1,69 @@ +/* + * rht03.c: + * Driver for the MaxDetect series sensors + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> + +#include <wiringPi.h> +#include <maxdetect.h> + +#define RHT03_PIN 0 + +/* + *********************************************************************** + * The main program + *********************************************************************** + */ + +int main (void) +{ + int temp, rh ; + int newTemp, newRh ; + + temp = rh = newTemp = newRh = 0 ; + + wiringPiSetup () ; + piHiPri (55) ; + + for (;;) + { + delay (100) ; + + if (!readRHT03 (RHT03_PIN, &newTemp, &newRh)) + continue ; + + if ((temp != newTemp) || (rh != newRh)) + { + temp = newTemp ; + rh = newRh ; + if ((temp & 0x8000) != 0) // Negative + { + temp &= 0x7FFF ; + temp = -temp ; + } + printf ("Temp: %5.1f, RH: %5.1f%%\n", temp / 10.0, rh / 10.0) ; + } + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/serialRead.c b/modules/catkin_ws/src/wiringPi/examples/serialRead.c new file mode 100644 index 00000000..9ee11ac2 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/serialRead.c @@ -0,0 +1,48 @@ +/* + * serial.c: + * Example program to read bytes from the Serial line + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> + +#include <wiringSerial.h> + +int main () +{ + int fd ; + + if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) + { + fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; + return 1 ; + } + +// Loop, getting and printing characters + + for (;;) + { + putchar (serialGetchar (fd)) ; + fflush (stdout) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/serialTest.c b/modules/catkin_ws/src/wiringPi/examples/serialTest.c new file mode 100644 index 00000000..0d6da5f0 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/serialTest.c @@ -0,0 +1,75 @@ +/* + * serialTest.c: + * Very simple program to test the serial port. Expects + * the port to be looped back to itself + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> + +#include <wiringPi.h> +#include <wiringSerial.h> + +int main () +{ + int fd ; + int count ; + unsigned int nextTime ; + + if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) + { + fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; + return 1 ; + } + + if (wiringPiSetup () == -1) + { + fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; + return 1 ; + } + + nextTime = millis () + 300 ; + + for (count = 0 ; count < 256 ; ) + { + if (millis () > nextTime) + { + printf ("\nOut: %3d: ", count) ; + fflush (stdout) ; + serialPutchar (fd, count) ; + nextTime += 300 ; + ++count ; + } + + delay (3) ; + + while (serialDataAvail (fd)) + { + printf (" -> %3d", serialGetchar (fd)) ; + fflush (stdout) ; + } + } + + printf ("\n") ; + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/servo.c b/modules/catkin_ws/src/wiringPi/examples/servo.c new file mode 100644 index 00000000..aa1ab052 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/servo.c @@ -0,0 +1,57 @@ +/* + * servo.c: + * Test of the softServo code. + * Do not use this code - use the servoBlaster kernel module instead + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <wiringPi.h> +#include <softServo.h> + +int main () +{ + if (wiringPiSetup () == -1) + { + fprintf (stdout, "oops: %s\n", strerror (errno)) ; + return 1 ; + } + + softServoSetup (0, 1, 2, 3, 4, 5, 6, 7) ; + + softServoWrite (0, 0) ; +/* + softServoWrite (1, 1000) ; + softServoWrite (2, 1100) ; + softServoWrite (3, 1200) ; + softServoWrite (4, 1300) ; + softServoWrite (5, 1400) ; + softServoWrite (6, 1500) ; + softServoWrite (7, 2200) ; +*/ + + for (;;) + delay (10) ; + +} diff --git a/modules/catkin_ws/src/wiringPi/examples/softPwm.c b/modules/catkin_ws/src/wiringPi/examples/softPwm.c new file mode 100644 index 00000000..11f7ad0a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/softPwm.c @@ -0,0 +1,89 @@ +/* + * softPwm.c: + * Test of the software PWM driver. Needs 8 LEDs connected + * to the Pi - e.g. Ladder board. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <wiringPi.h> +#include <softPwm.h> + +#define RANGE 100 +#define NUM_LEDS 8 + +int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7 } ; + +int values [NUM_LEDS] = { 0, 25, 50, 75, 100, 75, 50, 25 } ; + +int main () +{ + int i, j ; + char buf [80] ; + + wiringPiSetup () ; + + for (i = 0 ; i < NUM_LEDS ; ++i) + { + softPwmCreate (ledMap [i], 0, RANGE) ; + printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ; + } + + fgets (buf, 80, stdin) ; + +// Bring all up one by one: + + for (i = 0 ; i < NUM_LEDS ; ++i) + for (j = 0 ; j <= 100 ; ++j) + { + softPwmWrite (ledMap [i], j) ; + delay (10) ; + } + + fgets (buf, 80, stdin) ; + +// All Down + + for (i = 100 ; i > 0 ; --i) + { + for (j = 0 ; j < NUM_LEDS ; ++j) + softPwmWrite (ledMap [j], i) ; + delay (10) ; + } + + fgets (buf, 80, stdin) ; + + for (;;) + { + for (i = 0 ; i < NUM_LEDS ; ++i) + softPwmWrite (ledMap [i], values [i]) ; + + delay (50) ; + + i = values [0] ; + for (j = 0 ; j < NUM_LEDS - 1 ; ++j) + values [j] = values [j + 1] ; + values [NUM_LEDS - 1] = i ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/softTone.c b/modules/catkin_ws/src/wiringPi/examples/softTone.c new file mode 100644 index 00000000..2f46783e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/softTone.c @@ -0,0 +1,54 @@ +/* + * softTone.c: + * Test of the softTone module in wiringPi + * Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <wiringPi.h> +#include <softTone.h> + +#define PIN 3 + +int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ; + +int main () +{ + int i ; + + wiringPiSetup () ; + + softToneCreate (PIN) ; + + for (;;) + { + for (i = 0 ; i < 8 ; ++i) + { + printf ("%3d\n", i) ; + softToneWrite (PIN, scale [i]) ; + delay (500) ; + } + } +} diff --git a/modules/catkin_ws/src/wiringPi/examples/speed.c b/modules/catkin_ws/src/wiringPi/examples/speed.c new file mode 100644 index 00000000..0a42b362 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/speed.c @@ -0,0 +1,95 @@ +/* + * speed.c: + * Simple program to measure the speed of the various GPIO + * access mechanisms. + * + * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net> + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#define FAST_COUNT 10000000 +#define SLOW_COUNT 1000000 +#define PASSES 5 + +void speedTest (int pin, int maxCount) +{ + int count, sum, perSec, i ; + unsigned int start, end ; + + sum = 0 ; + + for (i = 0 ; i < PASSES ; ++i) + { + start = millis () ; + for (count = 0 ; count < maxCount ; ++count) + digitalWrite (pin, 1) ; + end = millis () ; + printf (" %6d", end - start) ; + fflush (stdout) ; + sum += (end - start) ; + } + + digitalWrite (pin, 0) ; + printf (". Av: %6dmS", sum / PASSES) ; + perSec = (int)(double)maxCount / (double)((double)sum / (double)PASSES) * 1000.0 ; + printf (": %7d/sec\n", perSec) ; +} + + +int main (void) +{ + printf ("Raspberry Pi wiringPi GPIO speed test program\n") ; + printf ("=============================================\n") ; + +// Start the standard way + + printf ("\nNative wiringPi method: (%8d iterations)\n", FAST_COUNT) ; + wiringPiSetup () ; + pinMode (0, OUTPUT) ; + speedTest (0, FAST_COUNT) ; + +// GPIO + + printf ("\nNative GPIO method: (%8d iterations)\n", FAST_COUNT) ; + wiringPiSetupGpio () ; + pinMode (17, OUTPUT) ; + speedTest (17, FAST_COUNT) ; + +// Phys + + printf ("\nPhysical pin GPIO method: (%8d iterations)\n", FAST_COUNT) ; + wiringPiSetupPhys () ; + pinMode (11, OUTPUT) ; + speedTest (11, FAST_COUNT) ; + +// Switch to SYS mode: + + system ("/usr/local/bin/gpio export 17 out") ; + printf ("\n/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ; + wiringPiSetupSys () ; + speedTest (17, SLOW_COUNT) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c b/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c new file mode 100644 index 00000000..0208f0a2 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c @@ -0,0 +1,118 @@ +/* + * spiSpeed.c: + * Code to measure the SPI speed/latency. + * Copyright (c) 2014 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdint.h> +#include <string.h> +#include <errno.h> +//#include <fcntl.h> +//#include <sys/ioctl.h> +//#include <linux/spi/spidev.h> + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#define TRUE (1==1) +#define FALSE (!TRUE) + +#define SPI_CHAN 0 +#define NUM_TIMES 100 +#define MAX_SIZE (1024*1024) + +static int myFd ; + + +void spiSetup (int speed) +{ + if ((myFd = wiringPiSPISetup (SPI_CHAN, speed)) < 0) + { + fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ; + exit (EXIT_FAILURE) ; + } +} + + +int main (void) +{ + int speed, times, size ; + unsigned int start, end ; + int spiFail ; + unsigned char *myData ; + double timePerTransaction, perfectTimePerTransaction, dataSpeed ; + + if ((myData = malloc (MAX_SIZE)) == NULL) + { + fprintf (stderr, "Unable to allocate buffer: %s\n", strerror (errno)) ; + exit (EXIT_FAILURE) ; + } + + wiringPiSetup () ; + + for (speed = 1 ; speed <= 32 ; speed *= 2) + { + printf ("+-------+--------+----------+----------+-----------+------------+\n") ; + printf ("| MHz | Size | mS/Trans | TpS | Mb/Sec | Latency mS |\n") ; + printf ("+-------+--------+----------+----------+-----------+------------+\n") ; + + spiFail = FALSE ; + spiSetup (speed * 1000000) ; + for (size = 1 ; size <= MAX_SIZE ; size *= 2) + { + printf ("| %5d | %6d ", speed, size) ; + + start = millis () ; + for (times = 0 ; times < NUM_TIMES ; ++times) + if (wiringPiSPIDataRW (SPI_CHAN, myData, size) == -1) + { + printf ("SPI failure: %s\n", strerror (errno)) ; + spiFail = TRUE ; + break ; + } + end = millis () ; + + if (spiFail) + break ; + + timePerTransaction = ((double)(end - start) / (double)NUM_TIMES) / 1000.0 ; + dataSpeed = (double)(size * 8) / (1024.0 * 1024.0) / timePerTransaction ; + perfectTimePerTransaction = ((double)(size * 8)) / ((double)(speed * 1000000)) ; + + printf ("| %8.3f ", timePerTransaction * 1000.0) ; + printf ("| %8.1f ", 1.0 / timePerTransaction) ; + printf ("| %9.5f ", dataSpeed) ; + printf ("| %8.5f ", (timePerTransaction - perfectTimePerTransaction) * 1000.0) ; + printf ("|\n") ; + + } + + close (myFd) ; + printf ("+-------+--------+----------+----------+-----------+------------+\n") ; + printf ("\n") ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/examples/wfi.c b/modules/catkin_ws/src/wiringPi/examples/wfi.c new file mode 100644 index 00000000..6bb68927 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/examples/wfi.c @@ -0,0 +1,161 @@ +/* + * wfi.c: + * Wait for Interrupt test program + * + * This program demonstrates the use of the waitForInterrupt() + * function in wiringPi. It listens to a button input on + * BCM_GPIO pin 17 (wiringPi pin 0) + * + * The biggest issue with this method is that it really only works + * well in Sys mode. + * + * Jan 2013: This way of doing things is sort of deprecated now, see + * the wiringPiISR() function instead and the isr.c test program here. + * + * Copyright (c) 2012-2013 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <wiringPi.h> + +// A 'key' which we can lock and unlock - values are 0 through 3 +// This is interpreted internally as a pthread_mutex by wiringPi +// which is hiding some of that to make life simple. + +#define COUNT_KEY 0 + +// What BCM_GPIO input are we using? + +#define BUTTON_PIN 17 + +// Debounce time in mS + +#define DEBOUNCE_TIME 100 + + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter = 0 ; + + +/* + * waitForIt: + * This is a thread created using the wiringPi simplified threading + * mechanism. It will wait on an interrupt on the button and increment + * a counter. + ********************************************************************************* + */ + +PI_THREAD (waitForIt) +{ + int state = 0 ; + int debounceTime = 0 ; + + (void)piHiPri (10) ; // Set this thread to be high priority + + for (;;) + { + if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it + { +// Bouncing? + + if (millis () < debounceTime) + { + debounceTime = millis () + DEBOUNCE_TIME ; + continue ; + } + +// We have a valid one + + state ^= 1 ; + + piLock (COUNT_KEY) ; + ++globalCounter ; + piUnlock (COUNT_KEY) ; + +// Wait for key to be released + + while (digitalRead (BUTTON_PIN) == LOW) + delay (1) ; + + debounceTime = millis () + DEBOUNCE_TIME ; + } + } +} + + +/* + * setup: + * Demo a crude but effective way to initialise the hardware + ********************************************************************************* + */ + +void setup (void) +{ + +// Use the gpio program to initialise the hardware +// (This is the crude, but effective) + + system ("gpio edge 17 falling") ; + +// Setup wiringPi + + wiringPiSetupSys () ; + +// Fire off our interrupt handler + + piThreadCreate (waitForIt) ; + +} + + +/* + * main + ********************************************************************************* + */ + +int main (void) +{ + int lastCounter = 0 ; + int myCounter = 0 ; + + setup () ; + + for (;;) + { + printf ("Waiting ... ") ; fflush (stdout) ; + + while (myCounter == lastCounter) + { + piLock (COUNT_KEY) ; + myCounter = globalCounter ; + piUnlock (COUNT_KEY) ; + delay (500) ; + } + + printf (" Done. myCounter: %5d\n", myCounter) ; + lastCounter = myCounter ; + } + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/modules/catkin_ws/src/wiringPi/gpio/Makefile b/modules/catkin_ws/src/wiringPi/gpio/Makefile new file mode 100644 index 00000000..37b4887d --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/Makefile @@ -0,0 +1,87 @@ +# +# Makefile: +# The gpio command: +# A swiss-army knige of GPIO shenanigans. +# https://projects.drogon.net/wiring-pi +# +# Copyright (c) 2012-2013 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + +DESTDIR=/usr +PREFIX=/local + +#DEBUG = -g -O0 +DEBUG = -O2 +CC = gcc +INCLUDE = -I$(DESTDIR)$(PREFIX)/include +CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe + +LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib +LIBS = -lwiringPi -lwiringPiDev -lpthread -lm + +# May not need to alter anything below this line +############################################################################### + +SRC = gpio.c extensions.c readall.c pins.c + +OBJ = $(SRC:.c=.o) + +all: gpio + +gpio: $(OBJ) + @echo [Link] + @$(CC) -o $@ $(OBJ) $(LDFLAGS) $(LIBS) + +.c.o: + @echo [Compile] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +.PHONY: clean +clean: + @echo "[Clean]" + @rm -f $(OBJ) gpio *~ core tags *.bak + +.PHONY: tags +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + +.PHONY: install +install: + @echo "[Install]" + @cp gpio $(DESTDIR)$(PREFIX)/bin + @chown root.root $(DESTDIR)$(PREFIX)/bin/gpio + @chmod 4755 $(DESTDIR)$(PREFIX)/bin/gpio + @mkdir -p $(DESTDIR)$(PREFIX)/man/man1 + @cp gpio.1 $(DESTDIR)$(PREFIX)/man/man1 + +.PHONY: uninstall +uninstall: + @echo "[UnInstall]" + @rm -f $(DESTDIR)$(PREFIX)/bin/gpio + @rm -f $(DESTDIR)$(PREFIX)/man/man1/gpio.1 + +.PHONY: depend +depend: + makedepend -Y $(SRC) + +# DO NOT DELETE + +gpio.o: extensions.h +extensions.o: extensions.h diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.c b/modules/catkin_ws/src/wiringPi/gpio/extensions.c new file mode 100644 index 00000000..96d6255f --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/extensions.c @@ -0,0 +1,700 @@ +/* + * extensions.c: + * Part of the GPIO program to test, peek, poke and otherwise + * noodle with the GPIO hardware on the Raspberry Pi. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <ctype.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <sys/types.h> +#include <fcntl.h> + +#include <wiringPi.h> + +#include <mcp23008.h> +#include <mcp23016.h> +#include <mcp23017.h> +#include <mcp23s08.h> +#include <mcp23s17.h> +#include <sr595.h> +#include <pcf8591.h> +#include <pcf8574.h> +#include <max31855.h> +#include <max5322.h> +#include <mcp3002.h> +#include <mcp3004.h> +#include <mcp4802.h> +#include <mcp3422.h> +#include <sn3218.h> +#include <drcSerial.h> + +#include "extensions.h" + +extern int wiringPiDebug ; + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +// Local structure to hold details + +struct extensionFunctionStruct +{ + const char *name ; + int (*function)(char *progName, int pinBase, char *params) ; +} ; + + +/* + * extractInt: + * Check & return an integer at the given location (prefixed by a :) + ********************************************************************************* + */ + +static char *extractInt (char *progName, char *p, int *num) +{ + if (*p != ':') + { + fprintf (stderr, "%s: colon expected\n", progName) ; + return NULL ; + } + + ++p ; + + if (!isdigit (*p)) + { + fprintf (stderr, "%s: digit expected\n", progName) ; + return NULL ; + } + + *num = strtol (p, NULL, 0) ; + while (isdigit (*p)) + ++p ; + + return p ; +} + + +/* + * extractStr: + * Check & return a string at the given location (prefixed by a :) + ********************************************************************************* + */ + +static char *extractStr (char *progName, char *p, char **str) +{ + char *q, *r ; + + if (*p != ':') + { + fprintf (stderr, "%s: colon expected\n", progName) ; + return NULL ; + } + + ++p ; + + if (!isprint (*p)) + { + fprintf (stderr, "%s: character expected\n", progName) ; + return NULL ; + } + + q = p ; + while ((*q != 0) && (*q != ':')) + ++q ; + + *str = r = calloc (q - p + 2, 1) ; // Zeros it + + while (p != q) + *r++ = *p++ ; + + return p ; +} + + + +/* + * doExtensionMcp23008: + * MCP23008 - 8-bit I2C GPIO expansion chip + * mcp23002:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionMcp23008 (char *progName, int pinBase, char *params) +{ + int i2c ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + mcp23008Setup (pinBase, i2c) ; + + return TRUE ; +} + + +/* + * doExtensionMcp23016: + * MCP230016- 16-bit I2C GPIO expansion chip + * mcp23016:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionMcp23016 (char *progName, int pinBase, char *params) +{ + int i2c ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + mcp23016Setup (pinBase, i2c) ; + + return TRUE ; +} + + +/* + * doExtensionMcp23017: + * MCP230017- 16-bit I2C GPIO expansion chip + * mcp23017:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionMcp23017 (char *progName, int pinBase, char *params) +{ + int i2c ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + mcp23017Setup (pinBase, i2c) ; + + return TRUE ; +} + + +/* + * doExtensionMcp23s08: + * MCP23s08 - 8-bit SPI GPIO expansion chip + * mcp23s08:base:spi:port + ********************************************************************************* + */ + +static int doExtensionMcp23s08 (char *progName, int pinBase, char *params) +{ + int spi, port ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &port)) == NULL) + return FALSE ; + + if ((port < 0) || (port > 7)) + { + fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ; + return FALSE ; + } + + mcp23s08Setup (pinBase, spi, port) ; + + return TRUE ; +} + + +/* + * doExtensionMcp23s17: + * MCP23s17 - 16-bit SPI GPIO expansion chip + * mcp23s17:base:spi:port + ********************************************************************************* + */ + +static int doExtensionMcp23s17 (char *progName, int pinBase, char *params) +{ + int spi, port ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &port)) == NULL) + return FALSE ; + + if ((port < 0) || (port > 7)) + { + fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ; + return FALSE ; + } + + mcp23s17Setup (pinBase, spi, port) ; + + return TRUE ; +} + + +/* + * doExtensionSr595: + * Shift Register 74x595 + * sr595:base:pins:data:clock:latch + ********************************************************************************* + */ + +static int doExtensionSr595 (char *progName, int pinBase, char *params) +{ + int pins, data, clock, latch ; + +// Extract pins + + if ((params = extractInt (progName, params, &pins)) == NULL) + return FALSE ; + + if ((pins < 8) || (pins > 32)) + { + fprintf (stderr, "%s: pin count (%d) out of range - 8-32 expected.\n", progName, pins) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &data)) == NULL) + return FALSE ; + + if ((params = extractInt (progName, params, &clock)) == NULL) + return FALSE ; + + if ((params = extractInt (progName, params, &latch)) == NULL) + return FALSE ; + + sr595Setup (pinBase, pins, data, clock, latch) ; + + return TRUE ; +} + + +/* + * doExtensionPcf8574: + * Digital IO (Crude!) + * pcf8574:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionPcf8574 (char *progName, int pinBase, char *params) +{ + int i2c ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + pcf8574Setup (pinBase, i2c) ; + + return TRUE ; +} + + +/* + * doExtensionPcf8591: + * Analog IO + * pcf8591:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionPcf8591 (char *progName, int pinBase, char *params) +{ + int i2c ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + pcf8591Setup (pinBase, i2c) ; + + return TRUE ; +} + + +/* + * doExtensionMax31855: + * Analog IO + * max31855:base:spiChan + ********************************************************************************* + */ + +static int doExtensionMax31855 (char *progName, int pinBase, char *params) +{ + int spi ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + max31855Setup (pinBase, spi) ; + + return TRUE ; +} + + +/* + * doExtensionMcp3002: + * Analog IO + * mcp3002:base:spiChan + ********************************************************************************* + */ + +static int doExtensionMcp3002 (char *progName, int pinBase, char *params) +{ + int spi ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + mcp3002Setup (pinBase, spi) ; + + return TRUE ; +} + + +/* + * doExtensionMcp3004: + * Analog IO + * mcp3004:base:spiChan + ********************************************************************************* + */ + +static int doExtensionMcp3004 (char *progName, int pinBase, char *params) +{ + int spi ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + mcp3004Setup (pinBase, spi) ; + + return TRUE ; +} + + +/* + * doExtensionMax5322: + * Analog O + * max5322:base:spiChan + ********************************************************************************* + */ + +static int doExtensionMax5322 (char *progName, int pinBase, char *params) +{ + int spi ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + max5322Setup (pinBase, spi) ; + + return TRUE ; +} + + +/* + * doExtensionMcp4802: + * Analog IO + * mcp4802:base:spiChan + ********************************************************************************* + */ + +static int doExtensionMcp4802 (char *progName, int pinBase, char *params) +{ + int spi ; + + if ((params = extractInt (progName, params, &spi)) == NULL) + return FALSE ; + + if ((spi < 0) || (spi > 1)) + { + fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ; + return FALSE ; + } + + mcp4802Setup (pinBase, spi) ; + + return TRUE ; +} + + +/* + * doExtensionSn3218: + * Analog Output (LED Driver) + * sn3218:base + ********************************************************************************* + */ + +static int doExtensionSn3218 (char *progName, int pinBase, char *params) +{ + sn3218Setup (pinBase) ; + return TRUE ; +} + + +/* + * doExtensionMcp3422: + * Analog IO + * mcp3422:base:i2cAddr + ********************************************************************************* + */ + +static int doExtensionMcp3422 (char *progName, int pinBase, char *params) +{ + int i2c, sampleRate, gain ; + + if ((params = extractInt (progName, params, &i2c)) == NULL) + return FALSE ; + + if ((i2c < 0x03) || (i2c > 0x77)) + { + fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &sampleRate)) == NULL) + return FALSE ; + + if ((sampleRate < 0) || (sampleRate > 3)) + { + fprintf (stderr, "%s: sample rate (%d) out of range\n", progName, sampleRate) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &gain)) == NULL) + return FALSE ; + + if ((gain < 0) || (gain > 3)) + { + fprintf (stderr, "%s: gain (%d) out of range\n", progName, gain) ; + return FALSE ; + } + + mcp3422Setup (pinBase, i2c, sampleRate, gain) ; + + return TRUE ; +} + +/* + * doExtensionDrcS: + * Interface to a DRC Serial system + * drcs:base:pins:serialPort:baud + ********************************************************************************* + */ + +static int doExtensionDrcS (char *progName, int pinBase, char *params) +{ + char *port ; + int pins, baud ; + + if ((params = extractInt (progName, params, &pins)) == NULL) + return FALSE ; + + if ((pins < 1) || (pins > 100)) + { + fprintf (stderr, "%s: pins (%d) out of range (2-100)\n", progName, pins) ; + return FALSE ; + } + + if ((params = extractStr (progName, params, &port)) == NULL) + return FALSE ; + + if (strlen (port) == 0) + { + fprintf (stderr, "%s: serial port device name required\n", progName) ; + return FALSE ; + } + + if ((params = extractInt (progName, params, &baud)) == NULL) + return FALSE ; + + if ((baud < 1) || (baud > 4000000)) + { + fprintf (stderr, "%s: baud rate (%d) out of range\n", progName, baud) ; + return FALSE ; + } + + drcSetupSerial (pinBase, pins, port, baud) ; + + return TRUE ; +} + + + +/* + * Function list + ********************************************************************************* + */ + +struct extensionFunctionStruct extensionFunctions [] = +{ + { "mcp23008", &doExtensionMcp23008 }, + { "mcp23016", &doExtensionMcp23016 }, + { "mcp23017", &doExtensionMcp23017 }, + { "mcp23s08", &doExtensionMcp23s08 }, + { "mcp23s17", &doExtensionMcp23s17 }, + { "sr595", &doExtensionSr595 }, + { "pcf8574", &doExtensionPcf8574 }, + { "pcf8591", &doExtensionPcf8591 }, + { "mcp3002", &doExtensionMcp3002 }, + { "mcp3004", &doExtensionMcp3004 }, + { "mcp4802", &doExtensionMcp4802 }, + { "mcp3422", &doExtensionMcp3422 }, + { "max31855", &doExtensionMax31855 }, + { "max5322", &doExtensionMax5322 }, + { "sn3218", &doExtensionSn3218 }, + { "drcs", &doExtensionDrcS }, + { NULL, NULL }, +} ; + + +/* + * doExtension: + * Load in a wiringPi extension + ********************************************************************************* + */ + +int doExtension (char *progName, char *extensionData) +{ + char *p ; + char *extension = extensionData ; + struct extensionFunctionStruct *extensionFn ; + int pinBase = 0 ; + +// Get the extension extension name by finding the first colon + + p = extension ; + while (*p != ':') + { + if (!*p) // ran out of characters + { + fprintf (stderr, "%s: extension name not terminated by a colon\n", progName) ; + return FALSE ; + } + ++p ; + } + + *p++ = 0 ; + + if (!isdigit (*p)) + { + fprintf (stderr, "%s: pinBase number expected after extension name\n", progName) ; + return FALSE ; + } + + while (isdigit (*p)) + { + if (pinBase > 1000000000) + { + fprintf (stderr, "%s: pinBase too large\n", progName) ; + return FALSE ; + } + + pinBase = pinBase * 10 + (*p - '0') ; + ++p ; + } + + if (pinBase < 64) + { + fprintf (stderr, "%s: pinBase (%d) too small. Minimum is 64.\n", progName, pinBase) ; + return FALSE ; + } + +// Search for extensions: + + for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn) + { + if (strcmp (extensionFn->name, extension) == 0) + return extensionFn->function (progName, pinBase, p) ; + } + + fprintf (stderr, "%s: extension %s not found\n", progName, extension) ; + return FALSE ; +} diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.h b/modules/catkin_ws/src/wiringPi/gpio/extensions.h new file mode 100644 index 00000000..5d271234 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/extensions.h @@ -0,0 +1,26 @@ +/* + * extensions.h: + * Part of the GPIO program to test, peek, poke and otherwise + * noodle with the GPIO hardware on the Raspberry Pi. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +extern int doExtension (char *progName, char *extensionData) ; diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.o b/modules/catkin_ws/src/wiringPi/gpio/extensions.o new file mode 100644 index 0000000000000000000000000000000000000000..fd7d06e442a7d111f4cffe03ddef9d0b6dbb7fdb GIT binary patch literal 12920 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 BnTP-Y literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio b/modules/catkin_ws/src/wiringPi/gpio/gpio new file mode 100755 index 0000000000000000000000000000000000000000..477efde624dbf2ac47b5806040a14645817dabc4 GIT binary patch literal 51680 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�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 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.1 b/modules/catkin_ws/src/wiringPi/gpio/gpio.1 new file mode 100644 index 00000000..e7131c1c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/gpio.1 @@ -0,0 +1,371 @@ +.TH "GPIO" "March 2013" "Command-Line access to Raspberry Pi's GPIO" + +.SH NAME +gpio \- Command-line access to Raspberry Pi's GPIO + +.SH SYNOPSIS +.B gpio +.B \-v +.PP +.B gpio +.B [ \-g | \-1 ] +.B mode/read/write/aread/awrite/wb/pwm/clock ... +.PP +.B gpio +.B [ \-x extension:params ] +.B mode/read/write/aread/awrite/pwm/pwmTone ... +.PP +.B gpio +.B [ \-p ] +.B read/write/toggle/wb +.B ... +.PP +.B gpio +.B readall/reset +.PP +.B gpio +.B unexportall/exports +.PP +.B gpio +.B export/edge/unexport +.B ... +.PP +.B gpio +.B wfi +.B ... +.PP +.B gpio +.B drive +group value +.PP +.B gpio +.B usbp +high | low +.PP +.B gpio +.B pwm-bal/pwm-ms +.PP +.B gpio +.B pwmr +range +.PP +.B gpio +.B load \ i2c/spi ... +.PP +.B gpio +.B gbr +channel +.PP +.B gpio +.B gbw +channel value + +.SH DESCRIPTION + +.B GPIO +is a swiss army knife of a command line tool to allow the user easy +access to the GPIO pins on the Raspberry Pi and the SPI A/D and D/A +converters on the Gertboard. It's designed for simple testing and +diagnostic purposes, but can be used in shell scripts for general if +somewhat slow control of the GPIO pins. + +It can also control the IO's on the PiFace IO board and load the SPI and I2C +kernel modules if required. + +Additionally, it can be used to set the exports in the \fI/sys/class/gpio\fR +system directory to allow subsequent programs to use the \fR/sys/class/gpio\fR +interface without needing to be run as root. + +.SH OPTIONS + +.TP +.B \-v +Output the current version including the board revision of the Raspberry Pi. + +.TP +.B \-g +Use the BCM_GPIO pins numbers rather than wiringPi pin numbers. +\fINote:\fR The BCM_GPIO pin numbers are always used with the +export and edge commands. + +.TP +.B \-1 +Use the physical pin numbers rather than wiringPi pin numbers. +\fINote:\fR that this applies to the P1 connector only. It is not possible to +use pins on the Revision 2 P5 connector this way, and as with \-g the +BCM_GPIO pin numbers are always used with the export and edge commands. + +.TP +.B \-x extension +This causes the named extension to be initialised. Extensions +comprise of a name (e.g. mcp23017) followed by a colon, then the +pin-base, then more optional parameters depending on the extension type. +See the web page on http://wiringpi.com/the-gpio-utility/ + +.TP +.B \-p +Use the PiFace interface board and its corresponding pin numbers. The PiFace +will always appear at pin number 200 in the gpio command. You can assign any +pin numbers you like in your own programs though. + +.TP +.B read <pin> +Read the digital value of the given pin and print 0 or 1 to represent the +respective logic levels. + +.TP +.B write <pin> <value> +Write the given value (0 or 1) to the pin. You need to set the pin +to output mode first. + +.TP +.B aread <pin> +Read the analog value of the given pin. This needs to be uses in +conjunction with a -x flag to add in an extension that handles analog +inputs. respective logic levels. + +e.g. gpio -x mcp3002:200:0 aread 200 + +will read the first analog input on an mcp3002 SPI ADC chip. + +.TP +.B awrite <pin> <value> +Write the analog value to the given pin. This needs to be used in +conjunction with a -x flag to add in an extension that handles analog +inputs. respective logic levels. + +e.g. gpio -x mcp4802:200:0 awrite 200 128 + +will write the value 128 to the first DAC port on an mcp4802 chip on +the Pi's SPI bus 0. + + +.TP +.B wb <value> +Write the given byte to the 8 main GPIO pins. You can prefix it with 0x +to specify a hexadecimal number. You need to set pins to output mode +first. + +.TP +.B readall +Output a table of all GPIO pins values. The values represent the actual values read +if the pin is in input mode, or the last value written if the pin is in output +mode. + +The readall command is usable with an extension module (via the -x parameter), +but it's unable to determine pin modes or states, so will perform both a +digital and analog read on each pin in-turn. + +.TP +.B reset +Resets the GPIO - As much as it's possible to do. All pins are set to +input mode and all the internal pull-up/down resistors are disconnected +(tristate mode). + +The reset command is usable with an extension module (via the -x parameter), +but it's limited to turning the pin into input mode (if applicable) and +removing any pull up/down resistor. + +.TP +.B pwm <pin> <value> +Write a PWM value (0-1023) to the given pin. The pin needs to be put +into PWM mode first. + +.TP +.B clock <pin> <frequency> +Set the output frequency on the given pin. The pin needs to be put into +clock mode first. + +.TP +.B mode <pin> <mode> +Set a pin into \fIinput\fR, \fIoutput\fR or \fIpwm\fR mode. Can also +use the literals \fIup\fR, \fIdown\fR or \fItri\fR to set the internal +pull-up, pull-down or tristate (off) controls. + +.TP +.B unexportall +Un-Export all the GPIO pins in the /sys/class/gpio directory. + +.TP +.B exports +Print a list (if any) of all the exported GPIO pins and their current values. + +.TP +.B export +Export a GPIO pin in the \fI/sys/class/gpio\fR directory. Use like the +mode command above however only \fIin\fR and \fIout\fR are supported at +this time. Note that the pin number is the \fBBCM_GPIO\fR number and +not the wiringPi number. + +Once a GPIO pin has been exported, the \fBgpio\fR program changes the +ownership of the \fI/sys/class/gpio/gpioX/value\fR and if present in +later kernels, the \fI/sys/class/gpio/gpioX/edge\fR pseudo files to +that of the user running the \fBgpio\fR program. This means that you +can have a small script of gpio exports to setup the gpio pins as your +program requires without the need to run anything as root, or with the +sudo command. + +.TP +.B edge +This exports a GPIO pin in the \fI/sys/class/gpio\fR directory, set +the direction to input and set the edge interrupt method to \fInone\fR, +\fIrising\fR, \fIfalling\fR or \fIboth\fR. Use like the export command +above and note that \fBBCM_GPIO\fR pin number is used not not wiringPi pin +numbering. + +Like the export commands above, ownership is set to that of the +calling user, allowing subsequent access from user programs without +requiring root/sudo. + +.TP +.B unexport +Un-Export a GPIO pin in the /sys/class/gpio directory. + +.TP +.B wfi <pin> <mode> +This set the given pin to the supplied interrupt mode: rising, falling +or both then waits for the interrupt to happen. It's a non-busy wait, +so does not consume and CPU while it's waiting. + +.TP +.B drive +group value + +Change the pad driver value for the given pad group to the supplied drive +value. Group is 0, 1 or 2 and value is 0-7. Do not use unless you are +absolutely sure you know what you're doing. + +.TP +.B usbp +high | low + +Change the USB current limiter to high (1.2 amps) or low (the default, 600mA) +This is only applicable to the model B+ + +.TP +.B pwm-bal/pwm-ms +Change the PWM mode to balanced (the default) or mark:space ratio (traditional) + +.TP +.B pwmr +Change the PWM range register. The default is 1024. + +.TP +.B load i2c [baudrate] +This loads the i2c or drivers into the kernel and changes the permissions +on the associated /dev/ entries so that the current user has access to +them. Optionally it will set the I2C baudrate to that supplied in Kb/sec +(or as close as the Pi can manage) The default speed is 100Kb/sec. + +.TP +.B load spi [buffer size in KB] +This loads the spi drivers into the kernel and changes the permissions +on the associated /dev/ entries so that the current user has access to +them. Optionally it will set the SPI buffer size to that supplied. The +default is 4KB. + +.TP +.B gbr +channel + +This reads the analog to digital converter on the Gertboard on the given +channel. The board jumpers need to be in-place to do this operation. + +.TP +.B gbw +channel value + +This writes the supplied value to the output channel on the Gertboards +SPI digital to analogue converter. +The board jumpers need to be in-place to do this operation. + + +.SH "WiringPi vs. BCM_GPIO Pin numbering" + +.PP +.TS +c c c c l. +WiringPi GPIO-r1 GPIO-r2 P1-Phys Function +_ + 0 17 17 11 + 1 18 18 12 (PWM) + 2 21 27 13 + 3 22 22 15 + 4 23 23 16 + 5 24 24 18 + 6 25 25 22 + 7 4 4 7 + 8 0 2 3 I2C: SDA0 + 9 1 3 5 I2C: SCL0 +10 8 8 24 SPI: CE0 +11 7 7 26 SPI: CE1 +12 10 10 19 SPI: MOSI +13 9 9 21 SPI: MISO +14 11 11 23 SPI: SCLK +15 14 14 8 TxD +16 15 16 10 RxD +17 - 28 +18 - 29 +19 - 30 +20 - 31 +.TE + +Note that "r1" and "r2" above refers to the board revision. Normally +wiringPi detects the correct board revision with use for it's own +numbering scheme, but if you are using a Revision 2 board with some +of the pins which change numbers between revisions you will need +to alter your software. + +.SH FILES + +.TP 2.2i +.I gpio +executable + +.SH EXAMPLES +.TP 2.2i +gpio mode 4 output # Set pin 4 to output +.PP +gpio -g mode 23 output # Set GPIO pin 23 to output (same as WiringPi pin 4) +.PP +gpio mode 1 pwm # Set pin 1 to PWM mode +.PP +gpio pwm 1 512 # Set pin 1 to PWM value 512 - half brightness +.PP +gpio export 17 out # Set GPIO Pin 17 to output +.PP +gpio export 0 in # Set GPIO Pin 0 (SDA0) to input. +.PP +gpio -g read 0 # Read GPIO Pin 0 (SDA0) + +.SH "NOTES" + +When using the \fIexport\fR, \fIedge\fR or \fIunexport\fR commands, the +pin numbers are \fBalways\fR native BCM_GPIO numbers and never wiringPi +pin numbers. + +.SH "SEE ALSO" + +.LP +WiringPi's home page +.IP +http://wiringpi.com/ + +.SH AUTHOR + +Gordon Henderson + +.SH "REPORTING BUGS" + +Please report bugs to <projects@drogon.net> + +.SH COPYRIGHT + +Copyright (c) 2012-2013 Gordon Henderson +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +.SH TRADEMARKS AND ACKNOWLEDGEMENTS + +Raspberry Pi is a trademark of the Raspberry Pi Foundation. See +http://raspberrypi.org/ for full details. diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.c b/modules/catkin_ws/src/wiringPi/gpio/gpio.c new file mode 100755 index 00000000..8567e77c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/gpio.c @@ -0,0 +1,1477 @@ +/* + * gpio.c: + * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry + * Pi's GPIO. + * Copyright (c) 2012-2014 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <ctype.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <wiringPi.h> + +#include <gertboard.h> +#include <piFace.h> + +#include "extensions.h" + +extern int wiringPiDebug ; + +// External functions I can't be bothered creating a separate .h file for: + +extern void doReadall (void) ; +extern void doPins (void) ; + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +/* + 2.31 : ODROID-C1/ODROID-C2 wiringPi support + 2.33 : ODROID-C1/ODROID-C2 GPIO sysfs irq support +*/ +#define VERSION "2.33" +#define PI_USB_POWER_CONTROL 38 +#define I2CDETECT "/usr/sbin/i2cdetect" + +int wpMode ; +int piModel = PI_MODEL_UNKNOWN; + +char *usage = "Usage: gpio -v\n" + " gpio -h\n" + " gpio [-g|-1] [-x extension:params] ...\n" + " gpio [-p] <read/write/wb> ...\n" + " gpio <read/write/aread/awritewb/pwm/clock/mode> ...\n" + " gpio readall/reset\n" + " gpio unexportall/exports\n" + " gpio export/edge/unexport ...\n" + " gpio wfi <pin> <mode>\n" + " gpio drive <group> <value>\n" + " gpio pwm-bal/pwm-ms \n" + " gpio pwmr <range> \n" + " gpio pwmc <divider> \n" + " gpio load spi/i2c\n" + " gpio i2cd/i2cdetect\n" + " gpio usbp high/low\n" + " gpio gbr <channel>\n" + " gpio gbw <channel> <value>" ; // No trailing newline needed here. + + +#ifdef NOT_FOR_NOW +/* + * decodePin: + * Decode a pin "number" which can actually be a pin name to represent + * one of the Pi's on-board pins. + ********************************************************************************* + */ + +static int decodePin (const char *str) +{ + +// The first case - see if it's a number: + + if (isdigit (str [0])) + return atoi (str) ; + + return 0 ; +} +#endif + + +/* + * changeOwner: + * Change the ownership of the file to the real userId of the calling + * program so we can access it. + ********************************************************************************* + */ + +static void changeOwner (char *cmd, char *file) +{ + uid_t uid = getuid () ; + uid_t gid = getgid () ; + + if (chown (file, uid, gid) != 0) + { + if (errno == ENOENT) // Warn that it's not there + fprintf (stderr, "%s: Warning: File not present: %s\n", cmd, file) ; + else + { + fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; + exit (1) ; + } + } +} + + +/* + * moduleLoaded: + * Return true/false if the supplied module is loaded + ********************************************************************************* + */ + +static int moduleLoaded (char *modName) +{ + int len = strlen (modName) ; + int found = FALSE ; + FILE *fd = fopen ("/proc/modules", "r") ; + char line [80] ; + + if (fd == NULL) + { + fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ; + exit (1) ; + } + + while (fgets (line, 80, fd) != NULL) + { + if (strncmp (line, modName, len) != 0) + continue ; + + found = TRUE ; + break ; + } + + fclose (fd) ; + + return found ; +} + + +/* + * doLoad: + * Load either the spi or i2c modules and change device ownerships, etc. + ********************************************************************************* + */ + +static void _doLoadUsage (char *argv []) +{ + fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ; + exit (1) ; +} + +static void doLoad (int argc, char *argv []) +{ + char *module1, *module2 ; + char cmd [80] ; + char *file1, *file2 ; + char args1 [32], args2 [32] ; + + if (argc < 3) + _doLoadUsage (argv) ; + + args1 [0] = args2 [0] = 0 ; + + /**/ if (strcasecmp (argv [2], "spi") == 0) + { + module1 = "spidev" ; + module2 = "spi_bcm2708" ; + file1 = "/dev/spidev0.0" ; + file2 = "/dev/spidev0.1" ; + if (argc == 4) + sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ; + else if (argc > 4) + _doLoadUsage (argv) ; + } + else if (strcasecmp (argv [2], "i2c") == 0) + { + module1 = "i2c_dev" ; + module2 = "i2c_bcm2708" ; + file1 = "/dev/i2c-0" ; + file2 = "/dev/i2c-1" ; + if (argc == 4) + sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; + else if (argc > 4) + _doLoadUsage (argv) ; + } + else + _doLoadUsage (argv) ; + + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + if (strcasecmp (argv [2], "i2c") == 0) { + if (piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2) { + module1 = "aml-i2c"; + file1 = "/dev/i2c-1"; + file2 = "/dev/i2c-2"; + + if (!moduleLoaded(module1)) { + sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s", module1) ; + system (cmd) ; + } + } + else { + file1 = "/dev/i2c-4"; /* i2c smbus : 0x12c70000 */ + file2 = "/dev/i2c-1"; /* hsi2c : 0x12cb0000 */ + } + + sleep (1) ; // To let things get settled + changeOwner (argv [0], file1) ; + changeOwner (argv [0], file2) ; + } + else { + if (piModel == PI_MODEL_ODROIDC2) { + fprintf (stderr, "ODROID-C2 : H/W SPI not support!\n") ; + return; + } + if (piModel == PI_MODEL_ODROIDC) { + file1 = "/dev/spidev0.0"; + module1 = "spidev"; + module2 = "spicc"; + if (!moduleLoaded(module1)) { + sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module1, args1) ; + system (cmd) ; + } + if (!moduleLoaded(module2)) { + sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s", module2) ; + system (cmd) ; + } + if (!moduleLoaded (module2)) + { + fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; + exit (1) ; + } + + sleep (1) ; // To let things get settled + changeOwner (argv [0], file1) ; + } + else { + module1 = "spidev"; + file1 = "/dev/spidev1.0"; + + if (!moduleLoaded (module1)) + { + fprintf (stderr, "%s: Unable to load %s\n", argv [0], module1) ; + fprintf (stderr, "\nYou need modified dtb file for spidev.\n"); + fprintf (stderr, "\nstep 1)\n"); + fprintf (stderr, " - install device-tree-compiler.\n"); + fprintf (stderr, " sudo apt-get install device-tree-compiler\n"); + fprintf (stderr, "\nstep 2)\n"); + fprintf (stderr, " - modified dtb file.\n"); + fprintf (stderr, " sudo -s\n"); + fprintf (stderr, " fdtput -c /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev\n"); + fprintf (stderr, " fdtput -t s /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev compatible \"spidev\"\n"); + fprintf (stderr, " fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev reg 0\n"); + fprintf (stderr, " fdtput -t i /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev spi-max-frequency 20000000\n"); + fprintf (stderr, " fdtput -c /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data\n"); + fprintf (stderr, " fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data cs-gpio 0x44, 0x5, 0x0\n"); + fprintf (stderr, " fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data samsung,spi-feedback-delay 0\n"); + fprintf (stderr, "\nstep 3)\n"); + fprintf (stderr, " - reboot system.\n"); + fprintf (stderr, " sudo reboot\n"); + fprintf (stderr, "\nstep 4)\n"); + fprintf (stderr, " - check your SPI node.\n"); + fprintf (stderr, " ls /dev/spidev1.0\n"); + // fdtput + exit (1) ; + } + + sleep (1) ; // To let things get settled + changeOwner (argv [0], file1) ; + } + } + } + else { + if (!moduleLoaded (module1)) + { + sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module1, args1) ; + system (cmd) ; + } + + if (!moduleLoaded (module2)) + { + sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module2, args2) ; + system (cmd) ; + } + + if (!moduleLoaded (module2)) + { + fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; + exit (1) ; + } + sleep (1) ; // To let things get settled + + changeOwner (argv [0], file1) ; + changeOwner (argv [0], file2) ; + } +} + + +/* + * doI2Cdetect: + * Run the i2cdetect command with the right runes for this Pi revision + ********************************************************************************* + */ + +static void doI2Cdetect (int argc, char *argv []) +{ + int port = piBoardRev () == 1 ? 0 : 1 ; + char command [128] ; + struct stat statBuf ; + + if (stat (I2CDETECT, &statBuf) < 0) + { + fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; + return ; + } + + if (!moduleLoaded ("i2c_dev")) + { + fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; + return ; + } + + sprintf (command, "%s -y %d", I2CDETECT, port) ; + if (system (command) < 0) + fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; + +} + + +/* + * doExports: + * List all GPIO exports + ********************************************************************************* + */ + +static void doExports (int argc, char *argv []) +{ + int fd ; + int i, l, first ; + char fName [128] ; + char buf [16] ; + + // ODROIDC GPIO Max 128, ODROIDXU_34 GPIO Max 256 + for (first = 0, i = 0 ; i < 256 ; ++i) // Crude, but effective + { + +// Try to read the direction + + sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) + continue ; + + if (first == 0) + { + ++first ; + printf ("GPIO Pins exported:\n") ; + } + + printf ("%4d: ", i) ; + + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; + + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + + printf ("%-3s", buf) ; + + close (fd) ; + +// Try to Read the value + + sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) + { + printf ("No Value file (huh?)\n") ; + continue ; + } + + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; + + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + + printf (" %s", buf) ; + +// Read any edge trigger file + + sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; + if ((fd = open (fName, O_RDONLY)) == -1) + { + printf ("\n") ; + continue ; + } + + if ((l = read (fd, buf, 16)) == 0) + sprintf (buf, "%s", "?") ; + + buf [l] = 0 ; + if ((buf [strlen (buf) - 1]) == '\n') + buf [strlen (buf) - 1] = 0 ; + + printf (" %-8s\n", buf) ; + + close (fd) ; + } +} + + +/* + * doExport: + * gpio export pin mode + * This uses the /sys/class/gpio device interface. + ********************************************************************************* + */ + +void doExport (int argc, char *argv []) +{ + FILE *fd ; + int pin ; + char *mode ; + char fName [128] ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + mode = argv [3] ; + + sprintf (fName, "/sys/class/%s/export", "gpio"); + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; + exit (1) ; + } + + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; + + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } + + /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) + fprintf (fd, "in\n") ; + else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) + fprintf (fd, "out\n") ; + else + { + fprintf (stderr, "%s: Invalid mode: %s. Should be in or out\n", argv [1], mode) ; + exit (1) ; + } + + fclose (fd) ; + +// Change ownership so the current user can actually use it! + + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; + + changeOwner (argv [0], fName) ; + + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; + + changeOwner (argv [0], fName) ; + +} + + +/* + * doWfi: + * gpio wfi pin mode + * Wait for Interrupt on a given pin. + * Slight cheat here - it's easier to actually use ISR now (which calls + * gpio to set the pin modes!) then we simply sleep, and expect the thread + * to exit the program. Crude but effective. + ********************************************************************************* + */ + +static void wfi (void) + { exit (0) ; } + +void doWfi (int argc, char *argv []) +{ + int pin, mode ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; + else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; + else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; + else + { + fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; + exit (1) ; + } + + if (wiringPiISR (pin, mode, &wfi) < 0) + { + fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; + exit (1) ; + } + + for (;;) + delay (9999) ; +} + + + +/* + * doEdge: + * gpio edge pin mode + * Easy access to changing the edge trigger on a GPIO pin + * This uses the /sys/class/gpio device interface. + ********************************************************************************* + */ + +void doEdge (int argc, char *argv []) +{ + FILE *fd ; + int pin ; + char *mode ; + char fName [128] ; + + // Reset irq gpio + doUnexport(3, argv); // unexport argc == 3 + + if (argc != 4) + { + fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + mode = argv [3] ; + +// Export the pin and set direction to input + + sprintf (fName, "/sys/class/%s/export", "gpio"); + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; + exit (1) ; + } + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; + + sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin); + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } + + fprintf (fd, "in\n") ; + fclose (fd) ; + + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin); + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; + exit (1) ; + } + + /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; + else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; + else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; + else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; + else + { + fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; + exit (1) ; + } + +// Change ownership of the value and edge files, so the current user can actually use it! + + sprintf (fName, "/sys/class/gpio/gpio%d/value", pin); + + changeOwner (argv [0], fName) ; + + sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin); + + changeOwner (argv [0], fName) ; + + fclose (fd) ; +} + + +/* + * doUnexport: + * gpio unexport pin + * This uses the /sys/class/gpio device interface. + ********************************************************************************* + */ + +void doUnexport (int argc, char *argv []) +{ + FILE *fd ; + int pin ; + char fName [128] ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + sprintf (fName, "/sys/class/%s/unexport", "gpio") ; + + if ((fd = fopen (fName, "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; + exit (1) ; + } + + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; +} + + +/* + * doUnexportAll: + * gpio unexportall + * Un-Export all the GPIO pins. + * This uses the /sys/class/gpio device interface. + ********************************************************************************* + */ + +void doUnexportall (char *progName) +{ + FILE *fd ; + int pin ; + + // ODROIDC GPIO Max 128, ODROIDXU_34 GPIO Max 256 + for (pin = 0 ; pin < 256 ; ++pin) + { + if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) + { + fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; + exit (1) ; + } + fprintf (fd, "%d\n", pin) ; + fclose (fd) ; + } +} + + +/* + * doResetExternal: + * Load readallExternal, we try to do this with an external device. + ********************************************************************************* + */ + +static void doResetExternal (void) +{ + int pin ; + + for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) + { + pinMode (pin, INPUT) ; + pullUpDnControl (pin, PUD_OFF) ; + } +} + + +/* + * doReset: + * Reset the GPIO pins - as much as we can do + ********************************************************************************* + */ + +static void doReset (char *progName) +{ + int model, rev, mem, maker, overVolted ; + int pin, endPin ; + + printf ("GPIO Reset is dangerous!\n") ; + printf (" - Do Not rely on this to do anything sensible!\n") ; + + if (wiringPiNodes != NULL) // External + { + doResetExternal () ; + return ; + } + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) + endPin = 16 ; + else if ((model == PI_MODEL_BP) || + (model == PI_MODEL_ODROIDC) || + (model == PI_MODEL_ODROIDC2) || + (model == PI_MODEL_ODROIDXU_34)) + endPin = 39 ; + else if (model == PI_MODEL_CM) + { + printf (" - Don't know how to reset a comput module:\n") ; + printf (" Write a shell-script to reset the pins to the state you need.\n") ; + return ; + } + else + { + printf ("Oops - unable to determine board type... model: %d\n", model) ; + return ; + } + + for (pin = 0 ; pin <= endPin ; ++pin) + { + if (wpiPinToGpio (pin) == -1) + continue ; + + digitalWrite (pin, LOW) ; + pinMode (pin, INPUT) ; + pullUpDnControl (pin, PUD_OFF) ; + } +} + + +/* + * doMode: + * gpio mode pin mode ... + ********************************************************************************* + */ + +void doMode (int argc, char *argv []) +{ + int pin ; + char *mode ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + mode = argv [3] ; + + /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; + else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; + else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; + else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; + else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; + else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; + else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; + else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; + else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; + else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; + else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; + +// Undocumented + + else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; + else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; + else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; + else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; + else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; + else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; + else + { + fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; + exit (1) ; + } +} + + +/* + * doPadDrive: + * gpio drive group value + ********************************************************************************* + */ + +static void doPadDrive (int argc, char *argv []) +{ + int group, val ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ; + exit (1) ; + } + + group = atoi (argv [2]) ; + val = atoi (argv [3]) ; + + if ((group < 0) || (group > 2)) + { + fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; + exit (1) ; + } + + if ((val < 0) || (val > 7)) + { + fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; + exit (1) ; + } + + setPadDrive (group, val) ; +} + + +/* + * doUsbP: + * Control USB Power - High (1.2A) or Low (600mA) + * gpio usbp high/low + ********************************************************************************* + */ + +static void doUsbP (int argc, char *argv []) +{ + int model, rev, mem, maker, overVolted ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; + exit (1) ; + } + +// Make sure we're on a B+ + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + if (model != PI_MODEL_BP) + { + fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ; + exit (1) ; + } + +// Need to force BCM_GPIO mode: + + wiringPiSetupGpio () ; + + if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) + { + digitalWrite (PI_USB_POWER_CONTROL, 1) ; + pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; + printf ("Switched to HIGH current USB (1.2A)\n") ; + return ; + } + + if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) + { + digitalWrite (PI_USB_POWER_CONTROL, 0) ; + pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; + printf ("Switched to LOW current USB (600mA)\n") ; + return ; + } + + fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; + exit (1) ; +} + + +/* + * doGbw: + * gpio gbw channel value + * Gertboard Write - To the Analog output + ********************************************************************************* + */ + +static void doGbw (int argc, char *argv []) +{ + int channel, value ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ; + exit (1) ; + } + + channel = atoi (argv [2]) ; + value = atoi (argv [3]) ; + + if ((channel < 0) || (channel > 1)) + { + fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; + exit (1) ; + } + + if ((value < 0) || (value > 255)) + { + fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; + exit (1) ; + } + + if (gertboardAnalogSetup (64) < 0) + { + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; + exit (1) ; + } + + analogWrite (64 + channel, value) ; +} + + +/* + * doGbr: + * gpio gbr channel + * From the analog input + ********************************************************************************* + */ + +static void doGbr (int argc, char *argv []) +{ + int channel ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ; + exit (1) ; + } + + channel = atoi (argv [2]) ; + + if ((channel < 0) || (channel > 1)) + { + fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; + exit (1) ; + } + + if (gertboardAnalogSetup (64) < 0) + { + fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; + exit (1) ; + } + + printf ("%d\n", analogRead (64 + channel)) ; +} + + +/* + * doWrite: + * gpio write pin value + ********************************************************************************* + */ + +static void doWrite (int argc, char *argv []) +{ + int pin, val ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) + val = 1 ; + else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) + val = 0 ; + else + val = atoi (argv [3]) ; + + /**/ if (val == 0) + digitalWrite (pin, LOW) ; + else + digitalWrite (pin, HIGH) ; +} + + +/* + * doAwriterite: + * gpio awrite pin value + ********************************************************************************* + */ + +static void doAwrite (int argc, char *argv []) +{ + int pin, val ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + val = atoi (argv [3]) ; + + analogWrite (pin, val) ; +} + + +/* + * doWriteByte: + * gpio write value + ********************************************************************************* + */ + +static void doWriteByte (int argc, char *argv []) +{ + int val ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; + exit (1) ; + } + + val = (int)strtol (argv [2], NULL, 0) ; + + digitalWriteByte (val) ; +} + + +/* + * doRead: + * Read a pin and return the value + ********************************************************************************* + */ + +void doRead (int argc, char *argv []) +{ + int pin, val ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + val = digitalRead (pin) ; + + printf ("%s\n", val == 0 ? "0" : "1") ; +} + + +/* + * doAread: + * Read an analog pin and return the value + ********************************************************************************* + */ + +void doAread (int argc, char *argv []) +{ + if (argc != 3) + { + fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; + exit (1) ; + } + + printf ("%d\n", analogRead (atoi (argv [2]))) ; +} + + +/* + * doToggle: + * Toggle an IO pin + ********************************************************************************* + */ + +void doToggle (int argc, char *argv []) +{ + int pin ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + digitalWrite (pin, !digitalRead (pin)) ; +} + + +/* + * doPwmTone: + * Output a tone in a PWM pin + ********************************************************************************* + */ + +void doPwmTone (int argc, char *argv []) +{ + int pin, freq ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s pwmTone <pin> <freq>\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + freq = atoi (argv [3]) ; + + pwmToneWrite (pin, freq) ; +} + + +/* + * doClock: + * Output a clock on a pin + ********************************************************************************* + */ + +void doClock (int argc, char *argv []) +{ + int pin, freq ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + freq = atoi (argv [3]) ; + + gpioClockSet (pin, freq) ; +} + + +/* + * doPwm: + * Output a PWM value on a pin + ********************************************************************************* + */ + +void doPwm (int argc, char *argv []) +{ + int pin, val ; + + if (argc != 4) + { + fprintf (stderr, "Usage: %s pwm <pin> <value>\n", argv [0]) ; + exit (1) ; + } + + pin = atoi (argv [2]) ; + + val = atoi (argv [3]) ; + + pwmWrite (pin, val) ; +} + + +/* + * doPwmMode: doPwmRange: doPwmClock: + * Change the PWM mode, range and clock divider values + ********************************************************************************* + */ + +static void doPwmMode (int mode) +{ + pwmSetMode (mode) ; +} + +static void doPwmRange (int argc, char *argv []) +{ + unsigned int range ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ; + exit (1) ; + } + + range = (unsigned int)strtoul (argv [2], NULL, 10) ; + + if (range == 0) + { + fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; + exit (1) ; + } + + pwmSetRange (range) ; +} + +static void doPwmClock (int argc, char *argv []) +{ + unsigned int clock ; + + if (argc != 3) + { + fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ; + exit (1) ; + } + + clock = (unsigned int)strtoul (argv [2], NULL, 10) ; + + if ((clock < 1) || (clock > 4095)) + { + fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; + exit (1) ; + } + + pwmSetClock (clock) ; +} + + +/* + * main: + * Start here + ********************************************************************************* + */ + +int main (int argc, char *argv []) +{ + int i ; + int model, rev, mem, maker, overVolted ; + + if (getenv ("WIRINGPI_DEBUG") != NULL) + { + printf ("gpio: wiringPi debug mode enabled\n") ; + wiringPiDebug = TRUE ; + } + + if (argc == 1) + { + fprintf (stderr, "%s\n", usage) ; + return 1 ; + } + +// Help + + if (strcasecmp (argv [1], "-h") == 0) + { + printf ("%s: %s\n", argv [0], usage) ; + return 0 ; + } + +// Sort of a special: + + if (strcmp (argv [1], "-R") == 0) + { + printf ("%d\n", piBoardRev ()) ; + return 0 ; + } + +// Version & Warranty + + if (strcmp (argv [1], "-V") == 0) + { + printf ("%d\n", piBoardRev ()) ; + return 0 ; + } + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + piModel = model; + + if (strcmp (argv [1], "-v") == 0) + { + printf ("gpio version: %s\n", VERSION) ; + printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; + printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; + printf ("For details type: %s -warranty\n", argv [0]) ; + printf ("\n") ; + if (model == PI_MODEL_UNKNOWN) + { + printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ; + printf (" projects@drogon.net\n") ; + printf ("with a copy of your /proc/cpuinfo if possible\n") ; + } + else if ( model == PI_MODEL_ODROIDC || + model == PI_MODEL_ODROIDXU_34 || + model == PI_MODEL_ODROIDC2 ) + { + printf ("Hardkernel ODROID Details:\n") ; + printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s\n", + piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker]) ; + } + else + { + printf ("Raspberry Pi Details:\n") ; + printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", + piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ; + } + return 0 ; + } + + if (strcasecmp (argv [1], "-warranty") == 0) + { + printf ("gpio version: %s\n", VERSION) ; + printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ; + printf ("\n") ; + printf (" This program is free software; you can redistribute it and/or modify\n") ; + printf (" it under the terms of the GNU Leser General Public License as published\n") ; + printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; + printf (" (at your option) any later version.\n") ; + printf ("\n") ; + printf (" This program is distributed in the hope that it will be useful,\n") ; + printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; + printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; + printf (" GNU Lesser General Public License for more details.\n") ; + printf ("\n") ; + printf (" You should have received a copy of the GNU Lesser General Public License\n") ; + printf (" along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ; + printf ("\n") ; + return 0 ; + } + + if (geteuid () != 0) + { + fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; + return 1 ; + } + +// Initial test for /sys/class/gpio operations: + + /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } + else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } + +// Check for load command: + + if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } + +// Gertboard commands + + if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } + if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } + +// Check for -g argument + + /**/ if (strcasecmp (argv [1], "-g") == 0) + { + wiringPiSetupGpio () ; + + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = WPI_MODE_GPIO ; + } + +// Check for -1 argument + + else if (strcasecmp (argv [1], "-1") == 0) + { + wiringPiSetupPhys () ; + + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = WPI_MODE_PHYS ; + } + +// Check for -p argument for PiFace + + else if (strcasecmp (argv [1], "-p") == 0) + { + piFaceSetup (200) ; + + for (i = 2 ; i < argc ; ++i) + argv [i - 1] = argv [i] ; + --argc ; + wpMode = WPI_MODE_PIFACE ; + } + +// Default to wiringPi mode + + else + { + wiringPiSetup () ; + wpMode = WPI_MODE_PINS ; + } + +// Check for -x argument to load in a new extension + + if (strcasecmp (argv [1], "-x") == 0) + { + if (argc < 3) + { + fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ; + exit (EXIT_FAILURE) ; + } + + if (!doExtension (argv [0], argv [2])) // Prints its own error messages + exit (EXIT_FAILURE) ; + + for (i = 3 ; i < argc ; ++i) + argv [i - 2] = argv [i] ; + argc -= 2 ; + } + + if (argc <= 1) + { + fprintf (stderr, "%s: no command given\n", argv [0]) ; + exit (EXIT_FAILURE) ; + } + +// Core wiringPi functions + + /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; + else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; + else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; + else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; + else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; + else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; + +// GPIO Nicies + + else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; + +// Pi Specifics + + else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; + else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; + else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ; + else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ; + else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ; + else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; + else if (strcasecmp (argv [1], "usbp" ) == 0) doUsbP (argc, argv) ; + else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; + else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; + else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; + else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; + else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; + else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; + else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; + else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; + else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; + else + { + fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; + exit (EXIT_FAILURE) ; + } + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.o b/modules/catkin_ws/src/wiringPi/gpio/gpio.o new file mode 100644 index 0000000000000000000000000000000000000000..4246715057cf41d1fd0910f7952b41567237be7a GIT binary patch literal 40688 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 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/gpio/pins.c b/modules/catkin_ws/src/wiringPi/gpio/pins.c new file mode 100644 index 00000000..19fcc1af --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/pins.c @@ -0,0 +1,33 @@ +/* + * pins.c: + * Just display a handy Pi pinnout diagram. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> + +void doPins (void) +{ + printf ("The pins command has been deprecated - sorry. Please use the\n") ; + printf (" gpio readall\n") ; + printf ("command to get a list of the pinnouts for your Pi.\n") ; +} + diff --git a/modules/catkin_ws/src/wiringPi/gpio/pins.o b/modules/catkin_ws/src/wiringPi/gpio/pins.o new file mode 100644 index 0000000000000000000000000000000000000000..eb996a8ebdbd77ef4c51baa9c9c36981c01d65ff GIT binary patch literal 1936 zcmbVM&2G~`5S}zZ1B5n396&{4#Q}jtR!-GMEe8~-Kzl$CA$kO~Nj5*KV@LK{Gzh_= z65`lL;7z#j0Ni;2KwP*Zl^JKJaW~GTBdurVoB3wfvtxgJ{Pf8}p#UrecnDLEQGoBo zsohA;1}sAvb`SrQzLNiw9*(tp_^tGdaDbP6Ek=VN7VU62R6$4dRV-Rs2cn}#k!~xa zJEAJ$Fp9=fG<~gNEfQR&uZhnz6N;WTLJ5Bm8xeLXPKARoF|p`|kr;<bB$@*WLi9$1 zP()gFl<x!VY;QjhclTOJU=pz**QHmjC#hHaP^(LCU2ff*;9||I)xEm61#pcvM=88} z0fmD~VYR$iI>H7Kelv{#+#&sFsq$*6WRY1#Jv|41k7pwQ#oUe)o@si9Sj0+sQiSt) zFjl!R2Vb0nUz~$qnuE{2Hz8Lu@0Iolv1MG9yec#tvJIWEi3W`DHq$JABifm53h+r5 z&@SWpcRUfQPeSqRTk}1-`8U$+Nj}wYSpT-wZobIi6gv?akB3IJK*lDT=ssJK_LVgH zz<}&1qd>Oe7-STZL+LfSdD^W(nl6*TAM9&?43frQ2Us8ojg~vl_NuW_?R}(CZQXy< zjnq(|9OmqXKq}2@ws%ymK@SwZ$B8$4m#Y|{>1=R<)n9D0j;wzLHSNQbbKT-ppKy2b zyEg7B%FW7sbg1T8`8DKH%{5$E>04(qmD32HpU=_2P#*t>rSN=m1?I7SZuxHie>1_+ z%wzbq<$DZR&HN1qXFltm<vVF`ixZrH3%|GgQ{M(+!X~=s;{I{jw`k<ek7qBG=Y-~m zzH#O=zJi#0_XxqR1wWCK5%>J$yJx5LrcK<mdI_=1xZM5e&zZOXXIqs2LztF|yZ?W; CSET9y literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/gpio/pintest b/modules/catkin_ws/src/wiringPi/gpio/pintest new file mode 100755 index 00000000..83ca12a5 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/pintest @@ -0,0 +1,193 @@ +#!/bin/bash +# +# pintest +# Test the Pi's GPIO port +# Copyright (c) 2013 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + + +# logErr pin, expected got +################################################################################ + +logErr () +{ + if [ $errs = 0 ]; then + echo "" + fi + echo " --> Pin $1 failure. Expected $2, got $3" + let errs+=1 +} + + +# printErrorCount +################################################################################ + +printErrCount() +{ + if [ $errs = 0 ]; then + echo "No faults detected." + elif [ $errs = 1 ]; then + echo "One fault detected." + else + echo "$errs faults detected" + fi +} + + +# testPins start end +################################################################################ + +testPins() +{ + start=$1 + end=$2 + errs=0 + + printf "%30s %2d:%2d: " "$3" $1 $2 + +# Set range to inputs + + for i in `seq $start $end`; do + gpio mode $i in + done + +# Enable internal pull-ups and expect to read high + + for i in `seq $start $end`; do + gpio mode $i up + if [ `gpio read $i` = 0 ]; then + logErr $i 1 0 + fi + done + +# Enable internal pull-downs and expect to read low + + for i in `seq $start $end`; do + gpio mode $i down + if [ `gpio read $i` = 1 ]; then + echo "Pin $i failure - expected 0, got 1" + let errs+=1 + fi + done + +# Remove the internal pull up/downs + + for i in `seq $start $end`; do + gpio mode $i tri + done + + if [ $errs = 0 ]; then + echo " OK" + else + printErrCount + fi + + let totErrs+=errs +} + + +intro() +{ + revision=`gpio -V` + cat <<EOF +PinTest +======= + +This is a simple utility to test the GPIO pins on your revision $revision +Raspberry Pi. + +NOTE: All GPIO peripherals must be removed to perform this test. This + includes serial, I2C and SPI connections. You may get incorrect results + if something is connected and it interferes with the test. + +This test can only test the input side of things. It uses the internal +pull-up and pull-down resistors to simulate inputs. It does not test +the output drivers. + +You will need to reboot your Pi after this test if you wish to use the +serial port as it will be left in GPIO mode rather than serial mode. + +Please make sure everything is removed and press the ENTER key to continue, +EOF + + echo -n "or Control-C to abort... " + read a +} + + +# Start here +################################################################################ + +intro +gpio unexportall +gpio reset + + errs=0 +totErrs=0 + +echo "" + +# Main pins + +testPins 0 7 "The main 8 GPIO pins" + +# P5 pins, if a rev 2: + +if [ $revision = 2 ]; then + testPins 17 20 "The 4 pins on the P5 connector" +fi + +# SPI + +testPins 10 14 "The 5 SPI pins" + +# Serial + +testPins 15 16 "The serial pins" + +# I2C - Needs somewhat different testing +# due to the on-board pull-up's + +echo -n " The I2C pins 8: 9: " +errs=0 +gpio mode 8 in +gpio mode 9 in + +if [ `gpio read 8` = 0 ]; then + echo "Pin 8 failure - expected 1, got 0" + let errs+=1 +fi + +if [ `gpio read 9` = 0 ]; then + echo "Pin 9 failure - expected 1, got 0" + let errs+=1 +fi + +if [ $errs = 0 ]; then + echo " OK" +else + printErrCount +fi + +echo "" +if [ $totErrs != 0 ]; then + echo "" + echo "Faults detected! Output of 'readall':" + gpio readall +fi diff --git a/modules/catkin_ws/src/wiringPi/gpio/readall.c b/modules/catkin_ws/src/wiringPi/gpio/readall.c new file mode 100755 index 00000000..f05b2982 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/readall.c @@ -0,0 +1,629 @@ +/* + * readall.c: + * The readall functions - getting a bit big, so split them out. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <ctype.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <wiringPi.h> + +extern int wpMode ; + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + +/* + * doReadallExternal: + * A relatively crude way to read the pins on an external device. + * We don't know the input/output mode of pins, but we can tell + * if it's an analog pin or a digital one... + ********************************************************************************* + */ + +static void doReadallExternal (void) +{ + int pin ; + + printf ("+------+---------+--------+\n") ; + printf ("| Pin | Digital | Analog |\n") ; + printf ("+------+---------+--------+\n") ; + + for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) + printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; + + printf ("+------+---------+--------+\n") ; +} + + +/* + * doReadall: + * Read all the GPIO pins + * We also want to use this to read the state of pins on an externally + * connected device, so we need to do some fiddling with the internal + * wiringPi node structures - since the gpio command can only use + * one external device at a time, we'll use that to our advantage... + ********************************************************************************* + */ + +static char *alts [] = +{ + "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" +} ; + +static int physToWpi [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + 8, -1, + 9, -1, + 7, 15, + -1, 16, + 0, 1, + 2, -1, + 3, 4, + -1, 5, + 12, -1, + 13, 6, + 14, 10, + -1, 11, // 25, 26 + 30, 31, // Actually I2C, but not used + 21, -1, + 22, 26, + 23, -1, + 24, 27, + 25, 28, + -1, 29, + -1, -1, + -1, -1, + -1, -1, + -1, -1, + -1, -1, + 17, 18, + 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1 +} ; + +static char *physNames [64] = +{ + NULL, + + " 3.3v", "5v ", + " SDA.1", "5V ", + " SCL.1", "0v ", + "GPIO. 7", "TxD ", + " 0v", "RxD ", + "GPIO. 0", "GPIO. 1", + "GPIO. 2", "0v ", + "GPIO. 3", "GPIO. 4", + " 3.3v", "GPIO. 5", + " MOSI", "0v ", + " MISO", "GPIO. 6", + " SCLK", "CE0 ", + " 0v", "CE1 ", + " SDA.0", "SCL.0 ", + "GPIO.21", "0v ", + "GPIO.22", "GPIO.26", + "GPIO.23", "0v ", + "GPIO.24", "GPIO.27", + "GPIO.25", "GPIO.28", + " 0v", "GPIO.29", + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + "GPIO.17", "GPIO.18", + "GPIO.19", "GPIO.20", + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, +} ; + +static char *physNamesOdroidc [64] = +{ + NULL, + + " 3.3v", "5v ", + " SDA.1", "5V ", + " SCL.1", "0v ", + "GPIO. 83", "TxD1 ", + " 0v", "RxD1 ", + "GPIO. 88", "GPIO. 87", + "GPIO.116", "0v ", + "GPIO.115", "GPIO.104", + " 3.3v", "GPIO.102", + " MOSI", "0v ", + " MISO", "GPIO.103", + " SCLK", "CE0 ", + " 0v", "GPIO.118", + " SDA.2", "SCL.2 ", + "GPIO.101", "0v ", + "GPIO.100", "GPIO. 99", + "GPIO.108", "0v ", + "GPIO.97 ", "GPIO. 98", + " AIN.1", "1v8 ", + " 0v", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +static char *physNamesOdroidc2_Rev1_1 [64] = +{ + NULL, + + " 3.3v", "5v ", + " SDA.1", "5V ", + " SCL.1", "0v ", + "GPIO.249", "TxD1 ", + " 0v", "RxD1 ", + "GPIO.247", "GPIO.238", + "GPIO.239", "0v ", + "GPIO.237", "GPIO.236", + " 3.3v", "GPIO.233", + "GPIO.235", "0v ", + "GPIO.232", "GPIO.231", + "GPIO.230", "GPIO.229", + " 0v", "GPIO.225", + " SDA.2", "SCL.2 ", + "GPIO.228", "0v ", + "GPIO.219", "GPIO.224", + "GPIO.234", "0v ", + "GPIO.214", "GPIO.218", + " AIN.1", "1v8 ", + " 0v", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +static char *physNamesOdroidc2_Rev1_0 [64] = +{ + NULL, + + " 3.3v", "5v ", + " SDA.1", "5V ", + " SCL.1", "0v ", + "GPIO.214", "--------", + " 0v", "--------", + "GPIO.219", "GPIO.218", + "GPIO.247", "0v ", + "--------", "GPIO.235", + " 3.3v", "GPIO.233", + "GPIO.238", "0v ", + "GPIO.237", "GPIO.234", + "GPIO.236", "GPIO.248", + " 0v", "GPIO.249", + " SDA.2", "SCL.2 ", + "GPIO.232", "0v ", + "GPIO.231", "GPIO.230", + "GPIO.239", "0v ", + "GPIO.228", "GPIO.229", + " AIN.1", "1v8 ", + " 0v", "AIN.0 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +static char *physNamesOdroidXU [64] = +{ + NULL, + + " 3.3v", "5v ", + "I2C1.SDA", "5V ", + "I2C1.SCL", "0v ", + "GPIO. 18", "UART0.TX", + " 0v", "UART0.RX", + "GPIO.174", "GPIO.173", + "GPIO. 21", "0v ", + "GPIO. 22", "GPIO. 19", + " 3.3v", "GPIO. 23", + " MOSI", "0v ", + " MISO", "GPIO. 24", + " SCLK", "CE0 ", + " 0v", "GPIO. 25", + "I2C5.SDA", "I2C5.SCL", + "GPIO. 28", "0v ", + "GPIO. 30", "GPIO. 29", + "GPIO. 31", "0v ", + "POWER ON", "GPIO. 33", + " AIN.0", "1v8 ", + " 0v", "AIN.3 ", + + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL, +} ; + +/* + * readallPhys: + * Given a physical pin output the data on it and the next pin: + *| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM | + ********************************************************************************* + */ + +static void readallPhys (int physPin) +{ + int pin ; + + if (physPinToGpio (physPin) == -1) + printf (" | | ") ; + else + printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; + + printf (" | %s", physNames [physPin]) ; + + if (physToWpi [physPin] == -1) + printf (" | | ") ; + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + printf (" | %4s", alts [getAlt (pin)]) ; + printf (" | %d", digitalRead (pin)) ; + } + +// Pin numbers: + + printf (" | %2d", physPin) ; + ++physPin ; + printf (" || %-2d", physPin) ; + +// Same, reversed + + if (physToWpi [physPin] == -1) + printf (" | | ") ; + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + printf (" | %d", digitalRead (pin)) ; + printf (" | %-4s", alts [getAlt (pin)]) ; + } + + printf (" | %-5s", physNames [physPin]) ; + + if (physToWpi [physPin] == -1) + printf (" | | ") ; + else + printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; + + printf (" |\n") ; +} + + +void cmReadall (void) +{ + int pin ; + + printf ("+-----+------+-------+ +-----+------+-------+\n") ; + printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; + printf ("+-----+------+-------+ +-----+------+-------+\n") ; + + for (pin = 0 ; pin < 28 ; ++pin) + { + printf ("| %3d ", pin) ; + printf ("| %-4s ", alts [getAlt (pin)]) ; + printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; + printf ("| ") ; + printf ("| %3d ", pin + 28) ; + printf ("| %-4s ", alts [getAlt (pin + 28)]) ; + printf ("| %s ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ; + printf ("|\n") ; + } + + printf ("+-----+------+-------+ +-----+------+-------+\n") ; +} + + +/* + * abReadall: + * Read all the pins on the model A or B. + ********************************************************************************* + */ + +void abReadall (int model, int rev) +{ + int pin ; + char *type ; + + if (model == PI_MODEL_A) + type = " A" ; + else + if (rev == PI_VERSION_2) + type = "B2" ; + else + type = "B1" ; + + printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; + printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; + printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; + for (pin = 1 ; pin <= 26 ; pin += 2) + readallPhys (pin) ; + + if (rev == PI_VERSION_2) // B version 2 + { + printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; + for (pin = 51 ; pin <= 54 ; pin += 2) + readallPhys (pin) ; + } + + printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; + printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; + printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; +} + + +/* + * piPlusReadall: + * Read all the pins on the model A+ or the B+ + ********************************************************************************* + */ + +void piPlusReadall (int model) +{ + int pin ; + + if (model == PI_MODEL_AP) + printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; + else + printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; + + printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; + printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; + for (pin = 1 ; pin <= 40 ; pin += 2) + readallPhys (pin) ; + printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; + printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; + + if (model == PI_MODEL_AP) + printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; + else + printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; +} + +static void readallPhysOdroidC (int physPin, int model, int rev) +{ + int pin ; + + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | "); + else if (physPinToGpio (physPin) != -1) + printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]); + else + printf (" | | %3d", physToWpi [physPin]); + + if (model == PI_MODEL_ODROIDC) + printf (" | %s", physNamesOdroidc [physPin]) ; + else { + if (rev == PI_VERSION_1) + printf (" | %s", physNamesOdroidc2_Rev1_0 [physPin]) ; + else + printf (" | %s", physNamesOdroidc2_Rev1_1 [physPin]) ; + } + + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | "); + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + if( physPinToGpio (physPin) == -1 ) { + printf (" | | ") ; + } + else { + printf (" | %4s", alts [getAlt (pin)]) ; + printf (" | %d", digitalRead (pin)) ; + } + } + +// Pin numbers: + + printf (" | %2d", physPin) ; + ++physPin ; + printf (" || %-2d", physPin) ; + +// Same, reversed + + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | "); + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + if (physPinToGpio (physPin) == -1) { + printf (" | | ") ; + } + else { + printf (" | %d", digitalRead (pin)) ; + printf (" | %-4s", alts [getAlt (pin)]) ; + } + } + + if (model == PI_MODEL_ODROIDC) + printf (" | %-6s", physNamesOdroidc [physPin]) ; + else { + if (rev == PI_VERSION_1) + printf (" | %-6s", physNamesOdroidc2_Rev1_0 [physPin]) ; + else + printf (" | %-6s", physNamesOdroidc2_Rev1_1 [physPin]) ; + } + + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | "); + else if (physPinToGpio (physPin) != -1) + printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)); + else + printf (" | %-3d | ", physToWpi [physPin]); + + printf (" |\n") ; +} + +void ReadallOdroidC (int model, int rev) +{ + int pin ; + + if(model == PI_MODEL_ODROIDC2) + printf (" +------+-----+----------+------+ Model ODROID-C2 +------+----------+-----+------+\n") ; + else + printf (" +------+-----+----------+------+- Model ODROID-C -+------+----------+-----+------+\n") ; + + printf (" | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |\n") ; + printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ; + for (pin = 1 ; pin <= 40 ; pin += 2) + readallPhysOdroidC (pin, model, rev) ; + printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ; +} + +static void readallPhysOdroidXU (int physPin) +{ + int pin ; + + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | ") ; + else if (physPinToGpio (physPin) != -1) + printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]); + else + printf (" | | %3d", physToWpi [physPin]); + + printf (" | %s", physNamesOdroidXU [physPin]) ; + + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | ") ; + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + printf (" | %4s", alts [getAlt (pin)]) ; + printf (" | %d", digitalRead (pin)) ; + } + +// Pin numbers: + + printf (" | %2d", physPin) ; + ++physPin ; + printf (" || %-2d", physPin) ; + +// Same, reversed + + if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) + printf (" | | ") ; + else + { + /**/ if (wpMode == WPI_MODE_GPIO) + pin = physPinToGpio (physPin) ; + else if (wpMode == WPI_MODE_PHYS) + pin = physPin ; + else + pin = physToWpi [physPin] ; + + printf (" | %d", digitalRead (pin)) ; + printf (" | %-4s", alts [getAlt (pin)]) ; + } + + printf (" | %-6s", physNamesOdroidXU [physPin]) ; + + if ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1)) + printf (" | | ") ; + else if (physPinToGpio (physPin) != -1) + printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)); + else + printf (" | %-3d | ", physToWpi [physPin]); + + printf (" |\n") ; +} + +void ReadallOdroidXU (void) +{ + int pin ; + + printf (" +------+-----+----------+------ Model ODROID-XU3/4 ------+----------+-----+------+\n") ; + printf (" | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO |\n") ; + printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ; + for (pin = 1 ; pin <= 40 ; pin += 2) + readallPhysOdroidXU (pin) ; + printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ; +} + +void doReadall (void) +{ + int model, rev, mem, maker, overVolted ; + + if (wiringPiNodes != NULL) // External readall + { + doReadallExternal () ; + return ; + } + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) + abReadall (model, rev) ; + else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP)) + piPlusReadall (model) ; + else if (model == PI_MODEL_CM) + cmReadall () ; + else if (model == PI_MODEL_ODROIDC || model == PI_MODEL_ODROIDC2) + ReadallOdroidC (model, rev); + else if (model == PI_MODEL_ODROIDXU_34) + ReadallOdroidXU(); + else + printf ("Oops - unable to determine board type... model: %d\n", model) ; +} diff --git a/modules/catkin_ws/src/wiringPi/gpio/readall.o b/modules/catkin_ws/src/wiringPi/gpio/readall.o new file mode 100644 index 0000000000000000000000000000000000000000..857e25e18132f7e867ea0a3d927d5de9b0080521 GIT binary patch literal 23736 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 Gt^Wq}9u0{A literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/gpio/test.sh b/modules/catkin_ws/src/wiringPi/gpio/test.sh new file mode 100755 index 00000000..a7c2bb22 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/gpio/test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# test.sh: +# Simple test: Assumes LEDs on Pins 0-7 and lights them +# in-turn. +################################################################################# +# This file is part of wiringPi: +# Wiring Compatable library for the Raspberry Pi +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + +# Simple test - assumes LEDs on Pins 0-7. + +for i in `seq 0 7`; +do + gpio mode $i out +done + +while true; +do + for i in `seq 0 7`; + do + gpio write $i 1 + sleep 0.1 + done + + for i in `seq 0 7`; + do + gpio write $i 0 + sleep 0.1 + done +done diff --git a/modules/catkin_ws/src/wiringPi/pins/Makefile b/modules/catkin_ws/src/wiringPi/pins/Makefile new file mode 100644 index 00000000..fd34ee93 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/pins/Makefile @@ -0,0 +1,18 @@ + +SRC = pins.tex + + +all: ${SRC} + @echo Generating DVI + @latex pins.tex + +pins.dvi: pins.tex + @latex pins.tex + +pdf: pins.dvi + @dvipdf pins.dvi + + +.PHONY: clean +clean: + @rm -f *.dvi *.aux *.log *.ps *.toc *.bak *~ diff --git a/modules/catkin_ws/src/wiringPi/pins/pins.pdf b/modules/catkin_ws/src/wiringPi/pins/pins.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd9629d62044179a5532a68a0eb0dbd7b3ac2dd1 GIT binary patch literal 9833 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 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/pins/pins.tex b/modules/catkin_ws/src/wiringPi/pins/pins.tex new file mode 100644 index 00000000..c3753e9e --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/pins/pins.tex @@ -0,0 +1,116 @@ +\documentclass[12pt,a4paper]{article} +\parskip 1ex +\parindent 0em +\thispagestyle{empty} +\pagestyle{plain} +\pagenumbering{arabic} +\setlength{\topmargin}{0pt} +\setlength{\headheight}{0pt} +\setlength{\headsep}{0pt} +\setlength{\topskip}{0pt} +\setlength{\textheight}{240mm} +\setlength{\footskip}{5ex} +\setlength{\oddsidemargin}{0pt} +\setlength{\evensidemargin}{0pt} +\setlength{\textwidth}{160mm} +\usepackage[dvips]{graphics,color} +\usepackage{helvet} +\renewcommand{\familydefault}{\sfdefault} +\begin{document} +\begin{sffamily} +\definecolor{rtb-black}{rgb} {0.0, 0.0, 0.0} +\definecolor{rtb-navy}{rgb} {0.0, 0.0, 0.5} +\definecolor{rtb-green}{rgb} {0.0, 0.5, 0.0} +\definecolor{rtb-teal}{rgb} {0.0, 0.5, 0.5} +\definecolor{rtb-maroon}{rgb} {0.5, 0.0, 0.0} +\definecolor{rtb-purple}{rgb} {0.5, 0.0, 0.5} +\definecolor{rtb-olive}{rgb} {0.5, 0.5, 0.0} +\definecolor{rtb-silver}{rgb} {0.7, 0.7, 0.7} +\definecolor{rtb-grey}{rgb} {0.5, 0.5, 0.5} +\definecolor{rtb-blue}{rgb} {0.0, 0.0, 1.0} +\definecolor{rtb-lime}{rgb} {0.0, 1.0, 0.0} +\definecolor{rtb-aqua}{rgb} {0.0, 1.0, 1.0} +\definecolor{rtb-red}{rgb} {1.0, 0.0, 0.0} +\definecolor{rtb-fuchsia}{rgb}{1.0, 0.0, 1.0} +\definecolor{rtb-yellow}{rgb} {1.0, 1.0, 0.0} +\definecolor{rtb-white}{rgb} {1.0, 1.0, 1.0} + +\begin{center} +\bfseries{WiringPi: GPIO Pin Numbering Tables}\\ +\tt{http://wiringpi.com/} +\end{center} + +\begin{center} +\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} +\hline +\multicolumn{8}{|c|}{\bfseries{P1: The Main GPIO connector}}\\ +\hline +\hline +WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ +\hline +\hline + & & \textcolor{rtb-red}{3.3v} & \raggedleft{1} & 2 & \textcolor{rtb-maroon}{5v} & & \\ +\hline +8 & Rv1:0 - Rv2:2 & \textcolor{rtb-aqua}{SDA} & \raggedleft{3} & 4 & \textcolor{rtb-maroon}{5v} & & \\ +\hline +9 & Rv1:1 - Rv2:3 & \textcolor{rtb-aqua}{SCL} & \raggedleft{5} & 6 & \textcolor{rtb-black}{0v} & & \\ +\hline +7 & 4 & \textcolor{rtb-green}{GPIO7} & \raggedleft{7} & 8 & \textcolor{rtb-yellow}{TxD} & 14 & 15\\ +\hline + & & \textcolor{rtb-black}{0v} & \raggedleft{9} & 10 & \textcolor{rtb-yellow}{RxD} & 15 & 16\\ +\hline +0 & 17 & \textcolor{rtb-green}{GPIO0} & \raggedleft{11} & 12 & \textcolor{rtb-green}{GPIO1} & 18 & 1\\ +\hline +2 & Rv1:21 - Rv2:27 & \textcolor{rtb-green}{GPIO2} & \raggedleft{13} & 14 & \textcolor{rtb-black}{0v} & & \\ +\hline +3 & 22 & \textcolor{rtb-green}{GPIO3} & \raggedleft{15} & 16 & \textcolor{rtb-green}{GPIO4} & 23 & 4\\ +\hline + & & \textcolor{rtb-red}{3.3v} & \raggedleft{17} & 18 & \textcolor{rtb-green}{GPIO5} & 24 & 5\\ +\hline +12 & 10 & \textcolor{rtb-teal}{MOSI} & \raggedleft{19} & 20 & \textcolor{rtb-black}{0v} & & \\ +\hline +13 & 9 & \textcolor{rtb-teal}{MISO} & \raggedleft{21} & 22 & \textcolor{rtb-green}{GPIO6} & 25 & 6\\ +\hline +14 & 11 & \textcolor{rtb-teal}{SCLK} & \raggedleft{23} & 24 & \textcolor{rtb-teal}{CE0} & 8 & 10\\ +\hline + & & \textcolor{rtb-black}{0v} & \raggedleft{25} & 26 & \textcolor{rtb-teal}{CE1} & 7 & 11\\ +\hline +\hline +WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ +\hline +\end{tabular} +\end{center} + +Note the differences between Revision 1 and Revision 2 Raspberry +Pi's. The Revision 2 is readily identifiable by the presence of the 2 +mounting holes. + +The revision 2 Raspberry Pi has an additional GPIO connector, P5, which is next to the main P1 GPIO +connector: + +\begin{center} +\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} +\hline +\multicolumn{8}{|c|}{\bfseries{P5: Secondary GPIO connector (Rev. 2 Pi only)}}\\ +\hline +\hline +WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ +\hline +\hline + & & \textcolor{rtb-maroon}{5v} & \raggedleft{1} & 2 & \textcolor{rtb-red}{3.3v} & & \\ +\hline +17 & 28 & \textcolor{rtb-green}{GPIO8} & \raggedleft{3} & 4 & \textcolor{rtb-green}{GPIO9} & 29 & 18 \\ +\hline +19 & 30 & \textcolor{rtb-green}{GPIO10} & \raggedleft{5} & 6 & \textcolor{rtb-green}{GPIO11} & 31 & 20 \\ +\hline + & & \textcolor{rtb-black}{0v} & \raggedleft{7} & 8 & \textcolor{rtb-black}{0v} & & \\ +\hline +\hline +WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ +\hline +\end{tabular} +\end{center} + + +\end{sffamily} +\end{document} diff --git a/modules/catkin_ws/src/wiringPi/postinstall-pak b/modules/catkin_ws/src/wiringPi/postinstall-pak new file mode 100644 index 00000000..469eb470 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/postinstall-pak @@ -0,0 +1,7 @@ +#!/bin/bash +echo +echo "WiringPi for C1 is now installed" +echo "Please check the wiki: http://odroid.com/dokuwiki/doku.php?id=en:odroid-c1" +echo "For extra references:" +echo "Github: https://github.com/hardkernel/wiringPi" +echo "Examples folder is copied to /usr/share/wiringPi/examples" diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/Makefile b/modules/catkin_ws/src/wiringPi/wiringPi/Makefile new file mode 100644 index 00000000..4e3342e0 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/Makefile @@ -0,0 +1,193 @@ +# ; +# Makefile: +# wiringPi - Wiring Compatable library for the Raspberry Pi +# +# Copyright (c) 2012 Gordon Henderson +################################################################################# +# This file is part of wiringPi: +# https://projects.drogon.net/raspberry-pi/wiringpi/ +# +# wiringPi is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# wiringPi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with wiringPi. If not, see <http://www.gnu.org/licenses/>. +################################################################################# + +DYN_VERS_MAJ=2 +DYN_VERS_MIN=0 + +VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN) +DESTDIR=/usr +PREFIX=/local + +STATIC=libwiringPi.a +DYNAMIC=libwiringPi.so.$(VERSION) + +#DEBUG = -g -O0 +DEBUG = -O2 +CC = gcc +INCLUDE = -I. +DEFS = -D_GNU_SOURCE +CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC + +LIBS = + +# Should not alter anything below this line +############################################################################### + +SRC = wiringPi.c \ + wiringSerial.c wiringShift.c \ + piHiPri.c piThread.c \ + wiringPiSPI.c wiringPiI2C.c \ + softPwm.c softTone.c \ + mcp23008.c mcp23016.c mcp23017.c \ + mcp23s08.c mcp23s17.c \ + sr595.c \ + pcf8574.c pcf8591.c \ + mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ + max31855.c max5322.c \ + sn3218.c \ + drcSerial.c + +OBJ = $(SRC:.c=.o) + +all: $(DYNAMIC) + +static: $(STATIC) + +$(STATIC): $(OBJ) + @echo "[Link (Static)]" + @ar rcs $(STATIC) $(OBJ) + @ranlib $(STATIC) +# @size $(STATIC) + +$(DYNAMIC): $(OBJ) + @echo "[Link (Dynamic)]" + @$(CC) -shared -Wl,-soname,libwiringPi.so -o libwiringPi.so.$(VERSION) -lpthread $(OBJ) + +.c.o: + @echo [Compile] $< + @$(CC) -c $(CFLAGS) $< -o $@ + +.PHONY: clean +clean: + @echo "[Clean]" + @rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* + +.PHONY: tags +tags: $(SRC) + @echo [ctags] + @ctags $(SRC) + + +.PHONY: install-headers +install-headers: + @echo "[Install Headers]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/include + @install -m 0644 wiringPi.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 wiringSerial.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 wiringShift.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 softPwm.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 softTone.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 wiringPiSPI.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 wiringPiI2C.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 drcSerial.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp23008.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp23016.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp23017.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp23s08.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp23s17.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 max31855.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 max5322.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp3002.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp3004.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp4802.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 mcp3422.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 sr595.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 pcf8574.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 pcf8591.h $(DESTDIR)$(PREFIX)/include + @install -m 0644 sn3218.h $(DESTDIR)$(PREFIX)/include + +.PHONY: install +install: $(DYNAMIC) install-headers + @echo "[Install Dynamic Lib]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib + @install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) + @ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so + @ldconfig + +.PHONY: install-static +install-static: $(STATIC) install-headers + @echo "[Install Static Lib]" + @install -m 0755 -d $(DESTDIR)$(PREFIX)/lib + @install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib + +.PHONY: uninstall +uninstall: + @echo "[UnInstall]" + @rm -f $(DESTDIR)$(PREFIX)/include/wiringPi.h + @rm -f $(DESTDIR)$(PREFIX)/include/wiringSerial.h + @rm -f $(DESTDIR)$(PREFIX)/include/wiringShift.h + @rm -f $(DESTDIR)$(PREFIX)/include/softPwm.h + @rm -f $(DESTDIR)$(PREFIX)/include/softTone.h + @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h + @rm -f $(DESTDIR)$(PREFIX)/include/wiringPiI2C.h + @rm -f $(DESTDIR)$(PREFIX)/include/drcSerial.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp23008.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp23016.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp23017.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp23s08.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp23s17.h + @rm -f $(DESTDIR)$(PREFIX)/include/max31855.h + @rm -f $(DESTDIR)$(PREFIX)/include/max5322.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp3002.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp3004.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp4802.h + @rm -f $(DESTDIR)$(PREFIX)/include/mcp3422.h + @rm -f $(DESTDIR)$(PREFIX)/include/sr595.h + @rm -f $(DESTDIR)$(PREFIX)/include/pcf8574.h + @rm -f $(DESTDIR)$(PREFIX)/include/pcf8591.h + @rm -f $(DESTDIR)$(PREFIX)/include/sn3218.h + @rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPi.* + @ldconfig + + +.PHONY: depend +depend: + makedepend -Y $(SRC) $(SRC_I2C) + +# DO NOT DELETE + +wiringPi.o: softPwm.h softTone.h wiringPi.h +wiringSerial.o: wiringSerial.h +wiringShift.o: wiringPi.h wiringShift.h +piHiPri.o: wiringPi.h +piThread.o: wiringPi.h +wiringPiSPI.o: wiringPi.h wiringPiSPI.h +wiringPiI2C.o: wiringPi.h wiringPiI2C.h +softPwm.o: wiringPi.h softPwm.h +softTone.o: wiringPi.h softTone.h +mcp23008.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23008.h +mcp23016.o: wiringPi.h wiringPiI2C.h mcp23016.h mcp23016reg.h +mcp23017.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23017.h +mcp23s08.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s08.h +mcp23s17.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s17.h +sr595.o: wiringPi.h sr595.h +pcf8574.o: wiringPi.h wiringPiI2C.h pcf8574.h +pcf8591.o: wiringPi.h wiringPiI2C.h pcf8591.h +mcp3002.o: wiringPi.h wiringPiSPI.h mcp3002.h +mcp3004.o: wiringPi.h wiringPiSPI.h mcp3004.h +mcp4802.o: wiringPi.h wiringPiSPI.h mcp4802.h +mcp3422.o: wiringPi.h wiringPiI2C.h mcp3422.h +max31855.o: wiringPi.h wiringPiSPI.h max31855.h +max5322.o: wiringPi.h wiringPiSPI.h max5322.h +sn3218.o: wiringPi.h wiringPiI2C.h sn3218.h +drcSerial.o: wiringPi.h wiringSerial.h drcSerial.h diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c new file mode 100644 index 00000000..6491a98c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c @@ -0,0 +1,201 @@ +/* + * drcSerial.c: + * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <time.h> +#include <string.h> +#include <errno.h> + +#include "wiringPi.h" +#include "wiringSerial.h" + +#include "drcSerial.h" + +#ifndef TRUE +# define TRUE (1==1) +# define FALSE (1==2) +#endif + + +/* + * myPinMode: + * Change the pin mode on the remote DRC device + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + /**/ if (mode == OUTPUT) + serialPutchar (node->fd, 'o') ; // Input + else if (mode == PWM_OUTPUT) + serialPutchar (node->fd, 'p') ; // PWM + else + serialPutchar (node->fd, 'i') ; // Default to input + + serialPutchar (node->fd, pin - node->pinBase) ; +} + + +/* + * myPullUpDnControl: + * ATmegas only have pull-up's on of off. No pull-downs. + ********************************************************************************* + */ + +static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) +{ + +// Force pin into input mode + + serialPutchar (node->fd, 'i' ) ; + serialPutchar (node->fd, pin - node->pinBase) ; + + /**/ if (mode == PUD_UP) + { + serialPutchar (node->fd, '1') ; + serialPutchar (node->fd, pin - node->pinBase) ; + } + else if (mode == PUD_OFF) + { + serialPutchar (node->fd, '0') ; + serialPutchar (node->fd, pin - node->pinBase) ; + } +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + serialPutchar (node->fd, value == 0 ? '0' : '1') ; + serialPutchar (node->fd, pin - node->pinBase) ; +} + + +/* + * myPwmWrite: + ********************************************************************************* + */ + +static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + serialPutchar (node->fd, 'v') ; + serialPutchar (node->fd, pin - node->pinBase) ; + serialPutchar (node->fd, value & 0xFF) ; +} + + +/* + * myAnalogRead: + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) +{ + int vHi, vLo ; + + serialPutchar (node->fd, 'a') ; + serialPutchar (node->fd, pin - node->pinBase) ; + vHi = serialGetchar (node->fd) ; + vLo = serialGetchar (node->fd) ; + + return (vHi << 8) | vLo ; +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + serialPutchar (node->fd, 'r') ; // Send read command + serialPutchar (node->fd, pin - node->pinBase) ; + return (serialGetchar (node->fd) == '0') ? 0 : 1 ; +} + + +/* + * drcSetup: + * Create a new instance of an DRC GPIO interface. + * Could be a variable nunber of pins here - we might not know in advance + * if it's an ATmega with 14 pins, or something with less or more! + ********************************************************************************* + */ + +int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) +{ + int fd ; + int ok, tries ; + time_t then ; + struct wiringPiNodeStruct *node ; + + if ((fd = serialOpen (device, baud)) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to open DRC device (%s): %s", device, strerror (errno)) ; + + delay (10) ; // May need longer if it's an Uno that reboots on the open... + +// Flush any pending input + + while (serialDataAvail (fd)) + (void)serialGetchar (fd) ; + + ok = FALSE ; + for (tries = 1 ; (tries < 5) && (!ok) ; ++tries) + { + serialPutchar (fd, '@') ; // Ping + then = time (NULL) + 2 ; + while (time (NULL) < then) + if (serialDataAvail (fd)) + { + if (serialGetchar (fd) == '@') + { + ok = TRUE ; + break ; + } + } + } + + if (!ok) + { + serialClose (fd) ; + return wiringPiFailure (WPI_FATAL, "Unable to communicate with DRC serial device") ; + } + + node = wiringPiNewNode (pinBase, numPins) ; + + node->fd = fd ; + node->pinMode = myPinMode ; + node->pullUpDnControl = myPullUpDnControl ; + node->analogRead = myAnalogRead ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->pwmWrite = myPwmWrite ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h new file mode 100644 index 00000000..29e988e1 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h @@ -0,0 +1,33 @@ +/* + * drcSerial.h: + * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o new file mode 100644 index 0000000000000000000000000000000000000000..ba441cc869b08506fea8d047bfda37048a161705 GIT binary patch literal 4480 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 Rx$)bWA%72o85R5Z{{d00S1bSk literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0 b/modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0 new file mode 100755 index 0000000000000000000000000000000000000000..801a295cad6d5acc33144088a4343f6b3b5d6281 GIT binary patch literal 72448 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 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c new file mode 100644 index 00000000..21858391 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c @@ -0,0 +1,81 @@ +/* + * max31855.c: + * Extend wiringPi with the max31855 SPI Analog to Digital convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "max31855.h" + +/* + * myAnalogRead: + * Return the analog value of the given pin + * Note: The chip really only has one read "channel", but we're faking it + * here so we can read the error registers. Channel 0 will be the data + * channel, and 1 is the error register code. + * Note: Temperature returned is temp in C * 4, so divide result by 4 + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) +{ + unsigned int spiData ; + int temp ; + int chan = pin - node->pinBase ; + + wiringPiSPIDataRW (node->fd, (unsigned char *)&spiData, 4) ; + + if (chan == 0) // Read temp in C + { + spiData >>= 18 ; + temp = spiData & 0x3FFF ; // Bottom 13 bits + if ((spiData & 0x2000) != 0) // Negative + temp = -temp ; + return temp ; + } + else // Return error bits + return spiData & 0x7 ; +} + + +/* + * max31855Setup: + * Create a new wiringPi device node for an max31855 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int max31855Setup (const int pinBase, int spiChannel) +{ + struct wiringPiNodeStruct *node ; + + if (wiringPiSPISetup (spiChannel, 5000000) < 0) // 5MHz - prob 4 on the Pi + return -1 ; + + node = wiringPiNewNode (pinBase, 2) ; + + node->fd = spiChannel ; + node->analogRead = myAnalogRead ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h new file mode 100644 index 00000000..385c4bd3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h @@ -0,0 +1,33 @@ +/* + * max31855.c: + * Extend wiringPi with the MAX31855 SPI Thermocouple driver + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int max31855Setup (int pinBase, int spiChannel) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.o b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.o new file mode 100644 index 0000000000000000000000000000000000000000..6fec57b600b24b76b0ccf117f6f43a1abebd0616 GIT binary patch literal 2016 zcmbW0?@Lo*6vxlp%A46VNmwX&Uzix^bxSw27qRKoD-M-SsR+AXx2q2K!{!}oFSN3P zF$C!^@MZr&(F-y1j|d{_rC=Zt<eOrhbN4*+y4^wb9e3wEpXZ$O{N5T4jnvp|z-5Cw zaMt1!V9#;p`wiC*SD+4NBDo*$s88Ph=F0cvw*+}dZ+FDxyyHeE;asp?@Ejab%E0G* zu-&1zZhx(n^PzSjCim7GLD^<``_T1Z_QS&N`=h3xhob)F^yBd-BdMV+2(TbEv^}R1 z#(25k`~L9|<i6mTf)VuMV7+6%2D@`7MqA!#jur}q+&w|gP05}EEH7aBhBkPMxNv*| zqeDZt#m<@eY)a3HUa3!Vcl)wN%d_e6N$x&r;AWAFx7;3|+vgrI#=mC#1K1vi!M5IL zYpJglc5%Zxk+-rwm2AM-__8M8bZy(mo$k##rwc*ADGXgM#>y;q^nC23Q;e5lgBV*) zbVd&NUa;!7Tb>|*9e-A`V<juu;X(zjM^a;|Z>*I?*`c-~o`4;MD*R#vzmBA_f&%nZ z;ejeVjJyfwxx#80`;7h^epdA#RpF3S*LywvUau5|<VGN+Cen*xO^tyv8k!sogp|pV zk;w40G94HU4J)t~&%{%UQ}M{uSWwl~@Lf=pRb7oPE77H8WkHQ6N(CdDo?S5~oCg!y z+C)00;j|3V{UXsx(Y5$R_ZT%x5JjBMhVy3xQN*42asG-Rig*KloQvp_=n>J!6=DwO zd_O^2-AL-{JX$?dv`gH}XbDx)wRIh&7;XYc^Q)_104bYF#Fw?i21wC#GO497B$d`R zX>?+y+t??NjBIU5S;(l#((?Iq{@IF{L2sq}rumVP-V{ygzx-~rU=Qt;zZ6k)UbCk( z$2gq{jl*xci}4P|%U|9p>n}G{!>lfBP|g3%_h7Eo`u}!(Kg)NcHH+ta%@BP)e{RQ2 z%pBUq1I*AO_90{DJ4q>SmS4J$1W|ndi!Ffr=vbYfKoG^(MdwGkJfEN6Rb=IRj|lo% q{t`7zDqj}0%jZtvdo1t?v-EcB@GBqx5;CjtMFyW@zgetY3H<>TgyD$* literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c new file mode 100644 index 00000000..b7cd6a94 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c @@ -0,0 +1,84 @@ +/* + * max5322.c: + * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "max5322.h" + +/* + * myAnalogWrite: + * Write analog value on the given pin + ********************************************************************************* + */ + +static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + unsigned char spiData [2] ; + unsigned char chanBits, dataBits ; + int chan = pin - node->pinBase ; + + if (chan == 0) + chanBits = 0b01000000 ; + else + chanBits = 0b01010000 ; + + chanBits |= ((value >> 12) & 0x0F) ; + dataBits = ((value ) & 0xFF) ; + + spiData [0] = chanBits ; + spiData [1] = dataBits ; + + wiringPiSPIDataRW (node->fd, spiData, 2) ; +} + +/* + * max5322Setup: + * Create a new wiringPi device node for an max5322 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int max5322Setup (const int pinBase, int spiChannel) +{ + struct wiringPiNodeStruct *node ; + unsigned char spiData [2] ; + + if (wiringPiSPISetup (spiChannel, 8000000) < 0) // 10MHz Max + return -1 ; + + node = wiringPiNewNode (pinBase, 2) ; + + node->fd = spiChannel ; + node->analogWrite = myAnalogWrite ; + +// Enable both DACs + + spiData [0] = 0b11100000 ; + spiData [1] = 0 ; + + wiringPiSPIDataRW (node->fd, spiData, 2) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h new file mode 100644 index 00000000..a217cf88 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h @@ -0,0 +1,33 @@ +/* + * max5322.h: + * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int max5322Setup (int pinBase, int spiChannel) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.o b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.o new file mode 100644 index 0000000000000000000000000000000000000000..157c4dea98aa1d1606cb7005b31605e3dd56c326 GIT binary patch literal 2088 zcmbW1OG_J36vxjbvBs$50~aY4nnhYH)M?@)t)-MiqmCdkXvEsmj$<56Fb_#4_*hh_ zZE*+%>8G(>NQy;V_8aJ;6rqJuy6K`NJ!djkr;`Z9Kir&qfA>7@V{SHw$46`&2TUA1 zg!2)j0H==geo*fQp&48tZhv#XBd{PA9XGnLBWhu<(_b36yBEb#anrdI^Kzp0rDga? z`}E$1?8C37?UR;<qaBC$6o()dF=9dNt;84V#O;sn1AS(3cX~?usr}i9_6^XEshG8n z?)R#+7TKrN+V@JvH_h>KxvV{MVqv|ec6{jYo`{+lJq&v}(7pU6u^7`UcjzlGv{B_J zPY+tI!ybm0zaHy;Fgi4J-_tccU&yEhPruM7___lHedK@c4+y?KVc=GUdwP8SfG^-1 zpnZ`#Dh9ZXN#NF6xz46~=Pn+w8~HV3?itxI@3F;Pyff4YT{ygF%)KNV;#*(aLcDw1 zKEeBJvWs^k3GvQwqv2I;=nft5qg*`$V6S<@#O<}*k(w^w<Y9+8)2Py=71>Pr^}QKh zcBrrNCtwHX1^h}Czlx-_iUQoZfQK&NlgQg~opWeO`Z=SOu+_@Hash|5yw=~_(<8(o zy&lTQsqE5BE~zRYjgC(YhQ_6dk&&t4m=p^Qjt@()n#?6LOVQ+1bSx~Z^5hIiQeKtg z%TheCEG^2(6iYazsD%}?|GyxjtVXg63IuUoB)TCw```54q8<}O5pTlA_zQw4;ygCS z-x5R-Z^6d+9zm2f|A|hk^Lq?VkC7VF1Ea(E9GejG>uFV<2O+QKDmKA-IVB|vs<Nhn zuz-gJ!hAjtIuHt(RB~BKt%DHHrqfCWT{2l!5k@1^-THZgphqhSX)!0K6;|!i)`OAs zrmSCN5E<!n#hm?GzoAZ?p)(Agc~m+j<H_wBobHh7uopr96QrBih+AJM{+HF172ifL z%6Zv%KgLo{>;C_@e$a^bp*4%e_nRU1+4`9sGcmL4EORi!8ou;DM6Tv<l0xQ;_&FMw z#Ll0gS?tuhzbHWz+ZWv*#j<#Ie{IODXO9TBjQ9i%OtNmP*4oLvWH@damfpGxo3(xe QvRd_n2He7Vv#j<10$Gyxi~s-t literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c new file mode 100644 index 00000000..d21d2378 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c @@ -0,0 +1,149 @@ +/* + * mcp23008.c: + * Extend wiringPi with the MCP 23008 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" +#include "mcp23x0817.h" + +#include "mcp23008.h" + + +/* + * myPinMode: + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + reg = MCP23x08_IODIR ; + mask = 1 << (pin - node->pinBase) ; + old = wiringPiI2CReadReg8 (node->fd, reg) ; + + if (mode == OUTPUT) + old &= (~mask) ; + else + old |= mask ; + + wiringPiI2CWriteReg8 (node->fd, reg, old) ; +} + + +/* + * myPullUpDnControl: + ********************************************************************************* + */ + +static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + reg = MCP23x08_GPPU ; + mask = 1 << (pin - node->pinBase) ; + + old = wiringPiI2CReadReg8 (node->fd, reg) ; + + if (mode == PUD_UP) + old |= mask ; + else + old &= (~mask) ; + + wiringPiI2CWriteReg8 (node->fd, reg, old) ; +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + bit = 1 << ((pin - node->pinBase) & 7) ; + + old = node->data2 ; + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWriteReg8 (node->fd, MCP23x08_GPIO, old) ; + node->data2 = old ; +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value ; + + mask = 1 << ((pin - node->pinBase) & 7) ; + value = wiringPiI2CReadReg8 (node->fd, MCP23x08_GPIO) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * mcp23008Setup: + * Create a new instance of an MCP23008 I2C GPIO interface. We know it + * has 8 pins, so all we need to know here is the I2C address and the + * user-defined pin base. + ********************************************************************************* + */ + +int mcp23008Setup (const int pinBase, const int i2cAddress) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + wiringPiI2CWriteReg8 (fd, MCP23x08_IOCON, IOCON_INIT) ; + + node = wiringPiNewNode (pinBase, 8) ; + + node->fd = fd ; + node->pinMode = myPinMode ; + node->pullUpDnControl = myPullUpDnControl ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = wiringPiI2CReadReg8 (fd, MCP23x08_OLAT) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h new file mode 100644 index 00000000..e9299a8c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h @@ -0,0 +1,33 @@ +/* + * 23008.h: + * Extend wiringPi with the MCP 23008 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp23008Setup (const int pinBase, const int i2cAddress) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o new file mode 100644 index 0000000000000000000000000000000000000000..03a0289efb5e21db0906e1cbe9ec48814c15d247 GIT binary patch literal 2744 zcmbW2Z)jUp6u@tiu1&h_C60oD2}^NEN8Kaoy4pFAyryYWh;3;aRO;5H&08Cqf21!g z_0KlQHn?O$5d=T!2fzD85K$<lS+NL0wF-59aN?Kw2c=)u54Og0?z`9Ay(Azz@ZLH1 zch5QZymRk+??yN}Vz=3d5F2@k)JK96QtGJNL1qTYanecRvCq&wLjR7G|8VxcK=;Z& zckDc<Omxvr*VnhdEw=A(cW=?n%9~F5+nNhpA7V6J>WY-_IcF|a-KT~LxvIKP-9k=c zbg$Q4x#9c*voe3o_X`WUU3I^=?*4Rrrds#crs-Zh*6SXl2doeXU2BI>`u)xWS~b`D zL94uV+Qj?c(672TT)X8%`^+Wnb@%Z0uefSsz6d=ORRkVs^gCVxz3<x4$_F;%>6yyg z&cGwcVI~mu@9!|)U8VPN0dsP-o<AO=hjbr%Wj@k6t(LBQ?t>cEj=+t6X_oxgniEE* z{i-uUHzV&HNz`gJ`qNq`Oay+6(6A5K;Xkz+m_1-_n5G}h1=Acf<HM}gbQhXUMnj<& zeLeBHV%8}7&a3^Z|Lj1KjRMyL1FFAYy>Q0lzCM3oz(3%>0Ly`NnTpunm?E~4$9D2q zhjSJ7=rr(W_?(7XQ#^O<n&K@xqKYrCcwww5PU3|r*k~rt;T?F{o`e}fdf>VO7s?3U zh7`|Tdr0x#acGLK+*V{+hL~?ZOy5NxkZHVGe3PAucSP}k^Z3!I6o+-*Lw}I#c&pbL zQGE8C;tiRF;#?EK<Jd;_YE7nyqv;z%fIFJG18r-;@d!LF$6#oe^0OWTJIVPZcV|5X z`wZtdIcNO@`y%JtoU`6>+d-t4n=@1ng1gfw4$|HL!$3R@l#rPgJl}%f0)7IX*N+Vc zVS5GoUAUU%|EL8gnfZL*Ilq5UohO-<;nYIPNTgpWqzt`2oYE6X7)=(_>3DuP8_H#k zLN1LYm3=vv)XD5<bYe)0&Q6Ss#KP0F)7nrpJWH;n3aRYEWNNH0#1c;F3xhJmw2X-o zV!Bbx%N~z|asApjuEyk?sn`ioz&?PN9%WJDZi#=`g8$xvU*vto6Zn*rXG-Gox|bz> zLh}DW;&MG3(z<dUhvYAFUn|b@*g@kZB*G2BC;2#O;Wzns)xx*=c+0}Yc_ZrbO2$ac zfi?=JUKCbAPbXAEFBwElCX578=a!cV18OmwPA%!_6{61PG8sJ!F4>%+tE1!bv&%+e zeu=0oT3?*KT1aI0X7d`JMEM{HTW5U}gTPQe=6y9sjqeVAKky6$g#*{C{1fEl@kfE9 zDZT{w9Y?|M4RY%j?oZ3Q=!;^-&jZ7pPZ}TKIjztCf7cK4ct2=aMErRff-UM7dQ4)n z>$CD<l_o@-K$m&E)xC#<hr*F-(SLzo1Ebmgz0Vs`;*Pj~7%Sq%{^7fC?LCHg_^)6Q p2a;Ip$Fa3`bocP2TRZ^&U&rCHuI~cYZ2et)D3DJ~_21pP{=aUHoc{m- literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c new file mode 100644 index 00000000..e5cc6328 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c @@ -0,0 +1,164 @@ +/* + * mcp23016.c: + * Extend wiringPi with the MCP 23016 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" +#include "mcp23016.h" + +#include "mcp23016reg.h" + + +/* + * myPinMode: + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + reg = MCP23016_IODIR0 ; + else + { + reg = MCP23016_IODIR1 ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + old = wiringPiI2CReadReg8 (node->fd, reg) ; + + if (mode == OUTPUT) + old &= (~mask) ; + else + old |= mask ; + + wiringPiI2CWriteReg8 (node->fd, reg, old) ; +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + pin -= node->pinBase ; // Pin now 0-15 + + bit = 1 << (pin & 7) ; + + if (pin < 8) // Bank A + { + old = node->data2 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ; + node->data2 = old ; + } + else // Bank B + { + old = node->data3 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ; + node->data3 = old ; + } +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value, gpio ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + gpio = MCP23016_GP0 ; + else + { + gpio = MCP23016_GP1 ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + value = wiringPiI2CReadReg8 (node->fd, gpio) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * mcp23016Setup: + * Create a new instance of an MCP23016 I2C GPIO interface. We know it + * has 16 pins, so all we need to know here is the I2C address and the + * user-defined pin base. + ********************************************************************************* + */ + +int mcp23016Setup (const int pinBase, const int i2cAddress) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ; + wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ; + + node = wiringPiNewNode (pinBase, 16) ; + + node->fd = fd ; + node->pinMode = myPinMode ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ; + node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h new file mode 100644 index 00000000..f9b5cc54 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h @@ -0,0 +1,33 @@ +/* + * mcp23016.h: + * Extend wiringPi with the MCP 23016 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp23016Setup (const int pinBase, const int i2cAddress) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o new file mode 100644 index 0000000000000000000000000000000000000000..712d58f4359e6b6a3863b67140672363c694a1d4 GIT binary patch literal 2656 zcmbVNUr1Y57(Yq0x!U%|4Ict6<aU%{alK2db#@P%*CZMtRWXKHtjnU_YA}fsZ>Vle zg*yueD|8Qo!JhWEhmH9(%34I~WP2GDWw3RFZYz{+-54^c8=ZCEckelRdXvDm4^F=C z{Lb(DbG~!W$$T{4;dZ$Q7Z-Vn9LzXMh~ho4+bpw<93{0RnYfPh7=08of0Y_vpxfpT z-mUM=$KLsqOFi{;qvp%SO`~h+4T=5|diWE1(uw+*`I$60wC)R#r5?Y{DIVInec}tc zVKG-RCL{Y9`I0XXA;cy<_}CYC3uBQ4{i87udT2iK&PnDyujRNjFWJ7|e2Q_leq6le zduPq}$=cxhH7%+2)9qv;Mt3#(m3H$G5Uk35=3m~q8Yo`7iCbNIQ@Vl95qf{?o*nH@ z%`MH`bs5KD4Qqm>!6EIUHuN*_h%c~!YG>=jI=%DYJ6>NhL3im6X0U=RuF>_G$<XF% zEpX}Q78cs1cUKR?+)nfRY8|&@bb}5^vE}NHy}dmkxnUtjqY5BZfPfhUbM~=iw%YD@ zX|#UT!y|;grBSPa^lRuh=?sToR2q`Q#k^5e&Z^C7@N`SjnuX><Eo!h?J$K5+m8M{* zCD;-?2a!<fZADzK_Yv1jo$J^UuXGI>)C~A>wl;%Wlk2XyHQ8@^;<A#hmHhx{vJ^Qy zwr_XBX8l0zXMWE!KhvF)C9qpzOtH0b)a`QJvb$aOU-g7#<w}(%H<;DEa&Wp<ZivVV zBm+XbEX5)2NuYnoe3wxl)Dx2x_nhnxTlFwXiNZ6lBHMc<3jlb^-VDUC-=*S#Nae&s zs!QM_fVhSDRxbfN#_$EuC|0jPpMrt>6$C-7KG`NzBV1O7q4E&yZmD<(-hwCP3{3Gm zbV?Th<?vT4;03^+hB_5&EQoa`pci12i}Q8`oa9EPn$EyCsg97`Y$P+5G1A#r3K>H` znD*)EQJD2+^5-W<b&~3g_q1#AR8L1oBHEwo*V^OJ6uF!!Wb$LZnXaa=<=&@{wTd7H zu`r%6p&P|1k?|zZtzYiOY)tt1;K?6_@i*L4l#6WLiN7o0vcSJz0dHh|#5mYL9{*(l z7xSL4fL{>sr-V3H1zfD>y$X1>fQxw*h>3zv77i{0%;5L}n;Q;%h0VF<eEuB~b$T{u zq=!Kp1zV4EtDtAos-e#qL>)~VX`&8KPZJAJi}`G3LeI_;b!0M^)AK;dPa3+~*_}K+ zZKOvgh-!K3<Ecx9bZ-AxSvCJ%Dd2)Fa^A2uz)(J7{j+DKcLMJ}o^=~1Fx|_Z5Q+KY z{|B1<hWi=sS%y1bsNWoU8QqG(ZPd@fz?lEnKLoy*%DMl4o4<|u2SJO%{m+UZ*nC@D z<9o$zk@}4IQ3?xAF1~AsIq3}yxGngi$@|aY3t*HxzX8^e*BBAc4}G~mKR>*i&fcTT rb>=^g6G5Eym#ZD=f3o^lm;?U*;Be-z0jym94{%c;@7rqs*O~tx{5hE4 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h new file mode 100644 index 00000000..9aea92d5 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h @@ -0,0 +1,48 @@ +/* + * mcp23016: + * Copyright (c) 2012-2013 Gordon Henderson + * + * Header file for code using the MCP23016 GPIO expander + * chip. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +// MCP23016 Registers + +#define MCP23016_GP0 0x00 +#define MCP23016_GP1 0x01 +#define MCP23016_OLAT0 0x02 +#define MCP23016_OLAT1 0x03 +#define MCP23016_IPOL0 0x04 +#define MCP23016_IPOL1 0x05 +#define MCP23016_IODIR0 0x06 +#define MCP23016_IODIR1 0x07 +#define MCP23016_INTCAP0 0x08 +#define MCP23016_INTCAP1 0x09 +#define MCP23016_IOCON0 0x0A +#define MCP23016_IOCON1 0x0B + +// Bits in the IOCON register + +#define IOCON_IARES 0x01 + +// Default initialisation mode + +#define IOCON_INIT 0 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c new file mode 100644 index 00000000..51741954 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c @@ -0,0 +1,195 @@ +/* + * mcp23017.c: + * Extend wiringPi with the MCP 23017 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" +#include "mcp23x0817.h" + +#include "mcp23017.h" + + +/* + * myPinMode: + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + reg = MCP23x17_IODIRA ; + else + { + reg = MCP23x17_IODIRB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + old = wiringPiI2CReadReg8 (node->fd, reg) ; + + if (mode == OUTPUT) + old &= (~mask) ; + else + old |= mask ; + + wiringPiI2CWriteReg8 (node->fd, reg, old) ; +} + + +/* + * myPullUpDnControl: + ********************************************************************************* + */ + +static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + reg = MCP23x17_GPPUA ; + else + { + reg = MCP23x17_GPPUB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + old = wiringPiI2CReadReg8 (node->fd, reg) ; + + if (mode == PUD_UP) + old |= mask ; + else + old &= (~mask) ; + + wiringPiI2CWriteReg8 (node->fd, reg, old) ; +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + pin -= node->pinBase ; // Pin now 0-15 + + bit = 1 << (pin & 7) ; + + if (pin < 8) // Bank A + { + old = node->data2 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOA, old) ; + node->data2 = old ; + } + else // Bank B + { + old = node->data3 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOB, old) ; + node->data3 = old ; + } +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value, gpio ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + gpio = MCP23x17_GPIOA ; + else + { + gpio = MCP23x17_GPIOB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + value = wiringPiI2CReadReg8 (node->fd, gpio) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * mcp23017Setup: + * Create a new instance of an MCP23017 I2C GPIO interface. We know it + * has 16 pins, so all we need to know here is the I2C address and the + * user-defined pin base. + ********************************************************************************* + */ + +int mcp23017Setup (const int pinBase, const int i2cAddress) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + wiringPiI2CWriteReg8 (fd, MCP23x17_IOCON, IOCON_INIT) ; + + node = wiringPiNewNode (pinBase, 16) ; + + node->fd = fd ; + node->pinMode = myPinMode ; + node->pullUpDnControl = myPullUpDnControl ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATA) ; + node->data3 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATB) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h new file mode 100644 index 00000000..79b4d7b3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h @@ -0,0 +1,33 @@ +/* + * 23017.h: + * Extend wiringPi with the MCP 23017 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp23017Setup (const int pinBase, const int i2cAddress) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o new file mode 100644 index 0000000000000000000000000000000000000000..cbb25e9859541b9a4374838761ba80ec9160cb91 GIT binary patch literal 2928 zcmbVOZ%A8L6u(Kdd0PA8oP&S^Bgn9HK3<%)c7x&5L?hVhjA0$tNz|yp{E_%Vb$_%h zTDW9F8SK-(jO|NdgAEE}bZZcuOa|M!g~8f=Xt$PO*Rdh{AYyHH&VBcp=QDxQ125;? z-~F9G_n!Oi%YwJ3(`vC0T`c5fk{{_PA+nIS+nCu#j*)T_@PCPPAKmq({uWN0qFbro z?b$o2NA`vKbZ<3XFZ+J!XSF;1ra=G7Q~`4no#|AyFZGQuIJB1Tb!wdCk?k9G8+2V` zKAmSeIdj}m>mfuVJ^0K~yNH2^pZ<5EmIY4j+UJGTU3&(7(+h%@=;k#nFZ;*Rs^k3? z#}_MuYmVABGA`-<N<bM<u2%pj;P0jnX;xbX)K9nO%U~_a^<yxpq~EF+*h)S0pX?pF zu0_AkaDcXdqTki6mTjhXtq#u(tzzZ8GISq&$@t}i`RG=_?{(kv(LII!!tyy%J9aJG z*H~`)ZQ(1_9{OkYu9oRm*{YJ-v#7N&hv8vra44T)e?8mTx;1+1!A*UA0YBZN+n9vK zSz4iMv+-*#2%ag2ANs8p{@+X`jF|1C>-3!9TP}Sim&?)HnQEBuQLhV-A0Op%U^alc zsF^aDJ9`Xm)gs-d-s;RVdNB8I)XN%3e}!g~u8xiuT@8VeWK2!EPD;&^+}M(2Blo<! zMUtDP)5kU3)g-%H<QDlfL_)zTP%Lls6U%I+rKZ9zT!uYr2JBfjL&z*@MXbDJRYYgX z)+4&&<)RY+MHG~y6Z>}8Q9_(R9pHXV+%ILF76q^|<}{xhL)|V`E?e70=exEp(RHar z5gSsa-J)#uhz*M9f@DBw7ll@!Ug3U|2mLzs{mzK;Ou5+LG5GaDJ@vr9$9<Pk=hxvA zUDkQg*}>MqDTfpumlCp-J2U}+t>7DtxUCQ!(2^o}=^-579IGKd>j7Xj9KQ$}h3zru z<M1GV1vCoVU(heXgSd<f0b%>6nNW|NTL+bmV7Cs7jT|`ydI7;BZk9m+3gOuQLii%! zRZ!=LyiV3Dz}_pu|F{TFqNCGIFUamw(kO|}dBPK6H5hp{5mrO_VSgw%2BW@YBodhR z#5&?JH4%>>5{{jTkA=u^S5I%d(lgxK+3EKV3=b&nJ>Fq*A)E-uCi=qNO&u&?e`uoB z2x3@<=_U9>YI54hI0&2#T{w%`nCN}P6C%R%5H1On^V&2!IY#^g1MV>JcZ%Snd|xrX zk^hMSf65SN)qorG{$RkX4EzeKme?G>rU>pb#4*NyrwH!S!oyj{^PHD+Cj25Ft0sJf zk3Tix`g^fy!u4}Vq?x&>8XN(wCNw>%TZvF4D5;@Yl}KYjHAtk9nHj<WDH)4|r$UiA zB8|qQ(NGL1vA7zNy3Pg~XVl>66p@&BXmWTw5sdOfz-xFC<pL+%I`bRa1{g}CanoRI zeh2Yh!QQpOV-%SO)cXZjD$Aqa5P09CJO>ZvH{X0wQ(okv@HT4$_<bH8jQOPgZtyL% z{>RPV#{Ff`M$!FG8bPr2`gPrHz>L(79&`P#bAL1a3I_x|5f85Kzn<$gFbegrk6-cn z_XGQfzPi8OKYaJidk+xV;Qo_1Fo>xfwjbu&k^VUky1^aryM}-K%=yazE0lkhe;TjC Jyiv^g{|DGc-yHw| literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c new file mode 100644 index 00000000..d0acb5ee --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c @@ -0,0 +1,189 @@ +/* + * mcp23s08.c: + * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdint.h> + +#include "wiringPi.h" +#include "wiringPiSPI.h" +#include "mcp23x0817.h" + +#include "mcp23s08.h" + +#define MCP_SPEED 4000000 + + + +/* + * writeByte: + * Write a byte to a register on the MCP23s08 on the SPI bus. + ********************************************************************************* + */ + +static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) +{ + uint8_t spiData [4] ; + + spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; + spiData [1] = reg ; + spiData [2] = data ; + + wiringPiSPIDataRW (spiPort, spiData, 3) ; +} + +/* + * readByte: + * Read a byte from a register on the MCP23s08 on the SPI bus. + ********************************************************************************* + */ + +static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) +{ + uint8_t spiData [4] ; + + spiData [0] = CMD_READ | ((devId & 7) << 1) ; + spiData [1] = reg ; + + wiringPiSPIDataRW (spiPort, spiData, 3) ; + + return spiData [2] ; +} + + +/* + * myPinMode: + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + reg = MCP23x08_IODIR ; + mask = 1 << (pin - node->pinBase) ; + old = readByte (node->data0, node->data1, reg) ; + + if (mode == OUTPUT) + old &= (~mask) ; + else + old |= mask ; + + writeByte (node->data0, node->data1, reg, old) ; +} + + +/* + * myPullUpDnControl: + ********************************************************************************* + */ + +static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + reg = MCP23x08_GPPU ; + mask = 1 << (pin - node->pinBase) ; + + old = readByte (node->data0, node->data1, reg) ; + + if (mode == PUD_UP) + old |= mask ; + else + old &= (~mask) ; + + writeByte (node->data0, node->data1, reg, old) ; +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + bit = 1 << ((pin - node->pinBase) & 7) ; + + old = node->data2 ; + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + writeByte (node->data0, node->data1, MCP23x08_GPIO, old) ; + node->data2 = old ; +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value ; + + mask = 1 << ((pin - node->pinBase) & 7) ; + value = readByte (node->data0, node->data1, MCP23x08_GPIO) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * mcp23s08Setup: + * Create a new instance of an MCP23s08 SPI GPIO interface. We know it + * has 8 pins, so all we need to know here is the SPI address and the + * user-defined pin base. + ********************************************************************************* + */ + +int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) +{ + int x ; + struct wiringPiNodeStruct *node ; + + if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0) + return x ; + + writeByte (spiPort, devId, MCP23x08_IOCON, IOCON_INIT) ; + + node = wiringPiNewNode (pinBase, 8) ; + + node->data0 = spiPort ; + node->data1 = devId ; + node->pinMode = myPinMode ; + node->pullUpDnControl = myPullUpDnControl ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = readByte (spiPort, devId, MCP23x08_OLAT) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h new file mode 100644 index 00000000..ebf93d19 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h @@ -0,0 +1,33 @@ +/* + * 23s08.h: + * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o new file mode 100644 index 0000000000000000000000000000000000000000..4e653c774677624b93b18b0b30c2efeb17712570 GIT binary patch literal 3360 zcmbVPZ%kWN6u*51N}+qNE_@)_65f((x@>zX`-4oQ>1!Y3p&j6$5`$YUP)0*ru)I2O zx{-8Sxan|yG5W>tGjTC~X^dtI*_<IJOP1jhzlqT)VPYg9lE@~Wd*8kAc(lvnA-#Wo z_x#Q|_ndQI!ugiSF~Q+LTpZ|Sw7KIbLi6s;b&xKDXa}l6(JmdY>G?nE_dP$L7b>3h z!<mjXUv=ZmSHuop&j0M1n=f?K;oI&z7w_e&R`2ea#kUJ#uT(ti(eZCzJ3;L`&F63j zr&2y4KkstP<Y$9Z6}|=HM=yY}0sW9^8V}dyTzdZ7`rebb=y4Zb{)YI05WM@OLXXED zMWNLTPN;pU_z!gk5rLPvUx*)-`;m&8Pq_G_^wEr7=%ya)=w)(la0ju@^qLN(1`VM> zMQXS}qC;v_?Z(R_3y<*}wN8^E*~6g8V1ZQ4&8v`sR<L^B!|uB^4h=6B-uJBD<Ak78 zT;Fq3b1&rA1WCJFXz@;U`vmhcPs~@Y)=ZZArpgjlHvTmg|8Sk8@(H(KF|)8x8-6hN zpyUPcqWh+rf8;PapwNZ0o(TSPBVtku1T1o?CzLw3+Y<U9&-dzmytwD)!_R2(r3R$- zsIQY6sCXsXbpyFyLU>KXzpMB@se`==lyz}Nn)(>-so|v-skmZh@qr62rQub_5(%#o z20_LP`8%qm74c6us)0w1X!tFUhKHcHZt2sN#edh=&9qS?Iu6T#&OcsXhov8uQF9r9 z<@b*$+8mtP?<2ly%&U<0!{NF{Xuk+;Kabgd(q<OaQ)<j?Lev@#zaaageYuR0laDBe zmB4|f9NjgZYiv>ihn1syO<X=0Xlx2J1&%`GAa&-19Pge$j&ZMJm&aB8AynND_-=MK zNoG~_UJ_KXKJRQ51Hwp+SPzIQR;#s0hGU)RfV@oxILQmIin7pKBYHKe(+qHmoPm5v zhLGr;7D8hEWoKBFFIA|bKVR7{28Am%qF)td@B|v64enLK0l7|wQrvFfUa)arsYMY` z|CMk+{w4!(uMoc<I76a5T@e!fmn$_faH&caoAa*M#7<$hMr>Ba07L{Dpt%tTp_dc# zP%6;!dZ}|~$uB5EPWUS&POwx;oTzde>;Xiu*q>w?yBN;*v@U?{WjLqMS^)MU!)M4v zKxm%LB}D0BtF4n0Rc{40^sBbvEr58pp$PSs!P8~%bAa!J;3oys7_BKRFPG8(v<!~Y z{i6pDjRl&Oew3cjlBbhKJk^s;8i~#Ai9~z=cAdFYDmtoV!Xp_YJCY(uGIM-nAc117 zk&ciWiFF)1*45G->sCXNmKZvd%qBCZJCj|VZCc!jpXfoc*q9OTACC184aWxKNie~j zcO{J6sFko4XiuDJCw@Rqk^zKth6q3SXi#~NfFJ~y;K%XX1O&0`FPZQ*{o}0ecKzux z_%#b|^((Tv*zM?L@CgfUwey7qe+FXa_gb*v);z3O@SPTYjXg1YJXs5F^((Xd5Od5V zMaXxA2*)Ss4xv#tbDY1c&uut=R|__r_c2n&CelW{4`w54&O>~aO{C(Akr+3SG5`&Q zl)kYsL;)q2NhOC9sR^X?kEGLy45(yAjD*tK9z8&N4k?tK7>W&M<7wJTEQ0?x$v`8e zx4-ZpU_{=rebVf2o_v=`ErRf~$|vj-GsOC;77odhe_`sG@^cKgxj{uc!1S3pwnJz? ztcXp!`qT0ofm`bSPs<N7egI~xaQ+c12x}fcpW7^$RrR6$LhO+9xb7*&xArzU`-|}d zHUiH-=f44qQuRaZ|ABF)Na{zpoX_h=-g2o>#~FW!@%dy6hvvf`JJFRZO~x!EcwoB& Wes=%FO)38itf8-&W;RB<|Nj90%v+=Y literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c new file mode 100644 index 00000000..c2d1be3a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c @@ -0,0 +1,236 @@ +/* + * mcp23s17.c: + * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdint.h> + +#include "wiringPi.h" +#include "wiringPiSPI.h" +#include "mcp23x0817.h" + +#include "mcp23s17.h" + +#define MCP_SPEED 4000000 + + + +/* + * writeByte: + * Write a byte to a register on the MCP23s17 on the SPI bus. + ********************************************************************************* + */ + +static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) +{ + uint8_t spiData [4] ; + + spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; + spiData [1] = reg ; + spiData [2] = data ; + + wiringPiSPIDataRW (spiPort, spiData, 3) ; +} + +/* + * readByte: + * Read a byte from a register on the MCP23s17 on the SPI bus. + ********************************************************************************* + */ + +static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) +{ + uint8_t spiData [4] ; + + spiData [0] = CMD_READ | ((devId & 7) << 1) ; + spiData [1] = reg ; + + wiringPiSPIDataRW (spiPort, spiData, 3) ; + + return spiData [2] ; +} + + +/* + * myPinMode: + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + reg = MCP23x17_IODIRA ; + else + { + reg = MCP23x17_IODIRB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + old = readByte (node->data0, node->data1, reg) ; + + if (mode == OUTPUT) + old &= (~mask) ; + else + old |= mask ; + + writeByte (node->data0, node->data1, reg, old) ; +} + + +/* + * myPullUpDnControl: + ********************************************************************************* + */ + +static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int mask, old, reg ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + reg = MCP23x17_GPPUA ; + else + { + reg = MCP23x17_GPPUB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + old = readByte (node->data0, node->data1, reg) ; + + if (mode == PUD_UP) + old |= mask ; + else + old &= (~mask) ; + + writeByte (node->data0, node->data1, reg, old) ; +} + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + pin -= node->pinBase ; // Pin now 0-15 + + bit = 1 << (pin & 7) ; + + if (pin < 8) // Bank A + { + old = node->data2 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + writeByte (node->data0, node->data1, MCP23x17_GPIOA, old) ; + node->data2 = old ; + } + else // Bank B + { + old = node->data3 ; + + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + writeByte (node->data0, node->data1, MCP23x17_GPIOB, old) ; + node->data3 = old ; + } +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value, gpio ; + + pin -= node->pinBase ; + + if (pin < 8) // Bank A + gpio = MCP23x17_GPIOA ; + else + { + gpio = MCP23x17_GPIOB ; + pin &= 0x07 ; + } + + mask = 1 << pin ; + value = readByte (node->data0, node->data1, gpio) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * mcp23s17Setup: + * Create a new instance of an MCP23s17 SPI GPIO interface. We know it + * has 16 pins, so all we need to know here is the SPI address and the + * user-defined pin base. + ********************************************************************************* + */ + +int mcp23s17Setup (const int pinBase, const int spiPort, const int devId) +{ + int x ; + struct wiringPiNodeStruct *node ; + + if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0) + return x ; + + writeByte (spiPort, devId, MCP23x17_IOCON, IOCON_INIT | IOCON_HAEN) ; + writeByte (spiPort, devId, MCP23x17_IOCONB, IOCON_INIT | IOCON_HAEN) ; + + node = wiringPiNewNode (pinBase, 16) ; + + node->data0 = spiPort ; + node->data1 = devId ; + node->pinMode = myPinMode ; + node->pullUpDnControl = myPullUpDnControl ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = readByte (spiPort, devId, MCP23x17_OLATA) ; + node->data3 = readByte (spiPort, devId, MCP23x17_OLATB) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h new file mode 100644 index 00000000..3b2a8088 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h @@ -0,0 +1,33 @@ +/* + * 23s17.h: + * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp23s17Setup (int pinBase, int spiPort, int devId) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o new file mode 100644 index 0000000000000000000000000000000000000000..e780bad13ace885dd39f68bd355f999fd2e43140 GIT binary patch literal 3656 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 Z`&tW+-hU-v#r)6kPvzIl*wRby|3Bh!zytsQ literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h new file mode 100644 index 00000000..c4e6b272 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h @@ -0,0 +1,73 @@ +/* + * mcp23x17: + * Copyright (c) 2012-2013 Gordon Henderson + * + * Header file for code using the MCP23x17 GPIO expander chip. + * This comes in 2 flavours: MCP23017 which has an I2C interface, + * an the MXP23S17 which has an SPI interface. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +// MCP23x17 Registers + +#define IODIRA 0x00 +#define IPOLA 0x02 +#define GPINTENA 0x04 +#define DEFVALA 0x06 +#define INTCONA 0x08 +#define IOCON 0x0A +#define GPPUA 0x0C +#define INTFA 0x0E +#define INTCAPA 0x10 +#define GPIOA 0x12 +#define OLATA 0x14 + +#define IODIRB 0x01 +#define IPOLB 0x03 +#define GPINTENB 0x05 +#define DEFVALB 0x07 +#define INTCONB 0x09 +#define IOCONB 0x0B +#define GPPUB 0x0D +#define INTFB 0x0F +#define INTCAPB 0x11 +#define GPIOB 0x13 +#define OLATB 0x15 + +// Bits in the IOCON register + +#define IOCON_UNUSED 0x01 +#define IOCON_INTPOL 0x02 +#define IOCON_ODR 0x04 +#define IOCON_HAEN 0x08 +#define IOCON_DISSLW 0x10 +#define IOCON_SEQOP 0x20 +#define IOCON_MIRROR 0x40 +#define IOCON_BANK_MODE 0x80 + +// Default initialisation mode + +#define IOCON_INIT (IOCON_SEQOP) + +// SPI Command codes + +#define CMD_WRITE 0x40 +#define CMD_READ 0x41 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h new file mode 100644 index 00000000..58bc0382 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h @@ -0,0 +1,87 @@ +/* + * mcp23xxx: + * Copyright (c) 2012-2013 Gordon Henderson + * + * Header file for code using the MCP23x08 and 17 GPIO expander + * chips. + * This comes in 2 flavours: MCP230xx (08/17) which has an I2C + * interface, and the MXP23Sxx (08/17) which has an SPI interface. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +// MCP23x08 Registers + +#define MCP23x08_IODIR 0x00 +#define MCP23x08_IPOL 0x01 +#define MCP23x08_GPINTEN 0x02 +#define MCP23x08_DEFVAL 0x03 +#define MCP23x08_INTCON 0x04 +#define MCP23x08_IOCON 0x05 +#define MCP23x08_GPPU 0x06 +#define MCP23x08_INTF 0x07 +#define MCP23x08_INTCAP 0x08 +#define MCP23x08_GPIO 0x09 +#define MCP23x08_OLAT 0x0A + +// MCP23x17 Registers + +#define MCP23x17_IODIRA 0x00 +#define MCP23x17_IPOLA 0x02 +#define MCP23x17_GPINTENA 0x04 +#define MCP23x17_DEFVALA 0x06 +#define MCP23x17_INTCONA 0x08 +#define MCP23x17_IOCON 0x0A +#define MCP23x17_GPPUA 0x0C +#define MCP23x17_INTFA 0x0E +#define MCP23x17_INTCAPA 0x10 +#define MCP23x17_GPIOA 0x12 +#define MCP23x17_OLATA 0x14 + +#define MCP23x17_IODIRB 0x01 +#define MCP23x17_IPOLB 0x03 +#define MCP23x17_GPINTENB 0x05 +#define MCP23x17_DEFVALB 0x07 +#define MCP23x17_INTCONB 0x09 +#define MCP23x17_IOCONB 0x0B +#define MCP23x17_GPPUB 0x0D +#define MCP23x17_INTFB 0x0F +#define MCP23x17_INTCAPB 0x11 +#define MCP23x17_GPIOB 0x13 +#define MCP23x17_OLATB 0x15 + +// Bits in the IOCON register + +#define IOCON_UNUSED 0x01 +#define IOCON_INTPOL 0x02 +#define IOCON_ODR 0x04 +#define IOCON_HAEN 0x08 +#define IOCON_DISSLW 0x10 +#define IOCON_SEQOP 0x20 +#define IOCON_MIRROR 0x40 +#define IOCON_BANK_MODE 0x80 + +// Default initialisation mode + +#define IOCON_INIT (IOCON_SEQOP) + +// SPI Command codes + +#define CMD_WRITE 0x40 +#define CMD_READ 0x41 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c new file mode 100644 index 00000000..5d449401 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c @@ -0,0 +1,76 @@ +/* + * mcp3002.c: + * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "mcp3002.h" + +/* + * myAnalogRead: + * Return the analog value of the given pin + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) +{ + unsigned char spiData [2] ; + unsigned char chanBits ; + int chan = pin - node->pinBase ; + + if (chan == 0) + chanBits = 0b11010000 ; + else + chanBits = 0b11110000 ; + + spiData [0] = chanBits ; + spiData [1] = 0 ; + + wiringPiSPIDataRW (node->fd, spiData, 2) ; + + return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ; +} + + +/* + * mcp3002Setup: + * Create a new wiringPi device node for an mcp3002 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int mcp3002Setup (const int pinBase, int spiChannel) +{ + struct wiringPiNodeStruct *node ; + + if (wiringPiSPISetup (spiChannel, 1000000) < 0) + return -1 ; + + node = wiringPiNewNode (pinBase, 2) ; + + node->fd = spiChannel ; + node->analogRead = myAnalogRead ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h new file mode 100644 index 00000000..0cd727f3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h @@ -0,0 +1,33 @@ +/* + * mcp3002.c: + * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp3002Setup (int pinBase, int spiChannel) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o new file mode 100644 index 0000000000000000000000000000000000000000..919732166877cd1b9538a16117cef0725ee7c597 GIT binary patch literal 1992 zcmbuA?@Lor7{{OeFt5|L6$JwW_hO2HUhe!cGa@$K+!cnJQ!1ja*X`<t`ytyMYA-U9 z!Xbh5$C&s+ETh-bKTxkCD$wXfZ;JIiclYRRyMw4NoIU4!&htFy+~=Ib)+4botHlCL z7Ptv#BSrx>?PvX<)(ygWaDce+)w6d}sZ^5Umc6qZXT);Y$N3M2hql(a-6Nb4%OBr{ zeHL&<Uhi4aVbkvWL>XK=Gd_!J$L>4&{OUuqYv*0dQD?=53ASQBE-Ci6Y3WK$;>H`# zVKt%yX5;1W<zM^35f_x-<Kmn)@$_J|YoBtLkF~M*{Bi<UF5ltA@|5U5z!coQ`-iR$ z*hO6VatzVY(d*vs+4)jVEqMp|0bb}0l(domkw3r-1N`vSD);sY{(uk=hH1}mN&5w` zJe&s0s@u}u*34~V!92*X=yO@JVW-!ca5%Y8D|F-Vnm!jL8*;jzSwl|GhHcX6O*@<( z1R*CEZq=Pk44sJ`zEw=7z-D@4fE=r7A{%BhlMR~cFm1_d$gh2y?q!4KI)4H-;2Q9A zb)4$vuA=~a10HO^Zy~>k`&>p#(&~)%0XDPz`34-aiRFGl=;ITRT?^&pOnz}%k&_@r zW0NDHm^3*y7LUwGGog`KM1qxcA)Q;CO2?<h!?G$*-v&u4s&ZmUN~D&g1v#Bz`QnON zS~mLs2_}@4iF{H47{Yy#=!B^DKk2@r(gab&+psbIgdmEz6C2|%2%?C)urcn%K8YR+ zHKrSShjCU%;EQWnRh~zy7OFPIdIcpT^Qy9{0-waM2Y$X-1P$<|TqeDwWY&OB<g-~N zhc3Cis_@Z?*<P(cz-!S;N?It$S^V(-lo#Xajnv+-ATrX+syY3wy%X&?L$wN?dQ>~x z`V*SdIh_fu!)`d;Us4w~;<YdC2ThuYe2wbC0p<MHct6IPegEICAJpRov_`S`K_kRI z+ds4824-~aVGc%U;!E$8T#a{<LIgd2js^y?`ZIJFJ7(v1q8F5X7o8u)vUqlW7m(G~ u9uascDJoSpr@ytIWwv*6rvC=gW8Ko*bzrMqzXh4u`feSr<GfL|>;DF}so|dh literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c new file mode 100644 index 00000000..82c73dd2 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c @@ -0,0 +1,76 @@ +/* + * mcp3004.c: + * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor + * Copyright (c) 2012-2013 Gordon Henderson + * + * Thanks also to "ShorTie" on IRC for some remote debugging help! + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "mcp3004.h" + +/* + * myAnalogRead: + * Return the analog value of the given pin + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) +{ + unsigned char spiData [3] ; + unsigned char chanBits ; + int chan = pin - node->pinBase ; + + chanBits = 0b10000000 | (chan << 4) ; + + spiData [0] = 1 ; // Start bit + spiData [1] = chanBits ; + spiData [2] = 0 ; + + wiringPiSPIDataRW (node->fd, spiData, 3) ; + + return ((spiData [1] << 8) | spiData [2]) & 0x3FF ; +} + + +/* + * mcp3004Setup: + * Create a new wiringPi device node for an mcp3004 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int mcp3004Setup (const int pinBase, int spiChannel) +{ + struct wiringPiNodeStruct *node ; + + if (wiringPiSPISetup (spiChannel, 1000000) < 0) + return -1 ; + + node = wiringPiNewNode (pinBase, 8) ; + + node->fd = spiChannel ; + node->analogRead = myAnalogRead ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h new file mode 100644 index 00000000..a07c0bf0 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h @@ -0,0 +1,33 @@ +/* + * mcp3004.c: + * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp3004Setup (int pinBase, int spiChannel) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o new file mode 100644 index 0000000000000000000000000000000000000000..862b16fce398efd8c0a551889d5f44c4e5c80ee7 GIT binary patch literal 1992 zcmbuA-%k@k5Xa}*B4@$28cmvDLLUmj2$xo%iZSL21&*Wvq!2Mik869S4gEpdYXBdF zST!`ng!s>3d>|zl9{m@5GbWm#@xd2Oow?q^*&d0}Z?ZSLpPkvgo!QH6jz=eK90yDs z+=bH-qX65E)4r&8MYsS?kSbri*Kh7@@^9@(j~ssPDB`z4QrdC!^dXU|5kDWS9ei|D z-fxN9nxB)ZA3xCo?!AbgOC8kso;rp~J5fKMlm<KXsB)WBdFMTB_;rhr65QR-DF_x~ z)$i3``{Jk@svmH3UiW!XTkqZHak_e}kEK^v67_n$y2wk_St(e<)%b^x4&B}G266rK zF-(q)-S+h@#LIcD>>Cz_gup<ktdD|EgCQX>B#c~ZaNmtUFcb&{M)dtJ>rVjg$sBO& z9<Hmio!`ZTd68c==Hg@{E}w1D>Egp3(1*iY#@r;?u*>t(7It|n_8FHi<8*lugk5~3 z!*H@NR1*h$t6NNg-LhhUoNCf4JFa9UJG8Z6dL^4_ef?~PmmS(${0Z2BO3^AioNIxU zH%|)%5YFJ@8T=mdOZc9vXi0jW(LTmzwSM6Y4!OkYU;xXXfZRqnuVf3$bE=XAc``aP z8ji{{6BDuVd3ioO8XcEmEmO?omuEAv*{O)4DRcKhmP?wFSdkOy6*;A3vTVJWs+CvG z{(pjLb#1zkQ~^TxUL>jz<^Ct#R}`ItM7$Fl<If19h`X>c{+b|)xEmYeKJ1fhM$-rQ zxMOq}XL$snw2{-4I9jdPuxZvSs#!(Q)O8JnB%U6Gc&P+B5X$*%W<||zfRHHUa%vu3 z@&!#5CZ`t$^aO#RN2_T$RaA0#@c)z#<LMh|zF{IV(q6-yJe%)C7tT<w#1oH3XV>_I zmJCicp?%m5r~6Cl#YVjOi~B*779wA>`f)&O{%d>?W3A5rxBH7md;qOkEPmJwvCrP0 z*(nn<yY@2&Gqmuf`%SKN|I7*)@k?fieU^WQA7IC-eqW7*vU5@WD3-;u`dviUoO?vz rqeW5ahB<jQAIs|9$(jBQq%FhJx9h~#y#IM*R{MJlxQX*-HShl$<Ehy3 literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c new file mode 100644 index 00000000..831aece3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c @@ -0,0 +1,110 @@ +/* + * mcp3422.c: + * Extend wiringPi with the MCP3422 I2C ADC chip + * Also works for the MCP3423 and MCP3224 (4 channel) chips + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdio.h> +#include <unistd.h> +#include <stdint.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/spi/spidev.h> + +#include <wiringPi.h> +#include <wiringPiI2C.h> + +#include "mcp3422.h" + + +/* + * myAnalogRead: + * Read a channel from the device + ********************************************************************************* + */ + +int myAnalogRead (struct wiringPiNodeStruct *node, int chan) +{ + unsigned char config ; + unsigned char buffer [4] ; + int value = 0 ; + +// One-shot mode, trigger plus the other configs. + + config = 0x80 | ((chan - node->pinBase) << 5) | (node->data0 << 2) | (node->data1) ; + + wiringPiI2CWrite (node->fd, config) ; + + switch (node->data0) // Sample rate + { + case MCP3422_SR_3_75: // 18 bits + delay (270) ; + read (node->fd, buffer, 4) ; + value = ((buffer [0] & 3) << 16) | (buffer [1] << 8) | buffer [0] ; + break ; + + case MCP3422_SR_15: // 16 bits + delay ( 70) ; + read (node->fd, buffer, 3) ; + value = (buffer [0] << 8) | buffer [1] ; + break ; + + case MCP3422_SR_60: // 14 bits + delay ( 17) ; + read (node->fd, buffer, 3) ; + value = ((buffer [0] & 0x3F) << 8) | buffer [1] ; + break ; + + case MCP3422_SR_240: // 12 bits + delay ( 5) ; + read (node->fd, buffer, 3) ; + value = ((buffer [0] & 0x0F) << 8) | buffer [0] ; + break ; + } + + return value ; +} + + +/* + * mcp3422Setup: + * Create a new wiringPi device node for the mcp3422 + ********************************************************************************* + */ + +int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + node = wiringPiNewNode (pinBase, 4) ; + + node->data0 = sampleRate ; + node->data1 = gain ; + node->analogRead = myAnalogRead ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h new file mode 100644 index 00000000..bb4692d8 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h @@ -0,0 +1,43 @@ +/* + * mcp3422.c: + * Extend wiringPi with the MCP3422 I2C ADC chip + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#define MCP3422_SR_3_75 0 +#define MCP3422_SR_15 1 +#define MCP3422_SR_60 2 +#define MCP3422_SR_240 3 + +#define MCP3422_GAIN_1 0 +#define MCP3422_GAIN_2 1 +#define MCP3422_GAIN_4 2 +#define MCP3422_GAIN_8 3 + + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o new file mode 100644 index 0000000000000000000000000000000000000000..3ceba46e47d31d53e620b957e5b7fa9d88411dc3 GIT binary patch literal 2472 zcmbW1?`zve7{||+yDF(GX(Jnf4x$%c$;vA1G|ko(7Aa0*wU{(C3G2u<q1bY5VmrZ+ z*LZ<-Ozl8;g}&ThFzCC!a$tkSrezHJCU5q(_*J{oF}62bV1?{?WL<JoWZ3o<r@Q;y zJ<mP&^X5!;HX4Z#st9?H9M&i$r1;WdS@nu4IY|b|g6{sMJHJTknYZ(LGxo+PwCV12 zf={)@Rwmwga;(#h4rZk0P2TzO^MM~!vGvE#Xx~i7oxO;7>k*X2FYdtK*^Aoq&K_6a z+BpW*Uau|wTMjC^`^2k@t)Yaw>vY9Vmmk>Go7n`P*U!bhVa40`u&47-T7FOvM{Yrd zke!#|*T+>XA+{D15vM!pd3%0e93iRp^LyfmN_GTTg#)`7I5`Xf?6!vzPM7O+rGedN zpX~4NAC5Q6j0YxO^u5rxV~Iki&5PUZXK66;;9YHTNpoK;xPQ7oxsN<_yS*uYj{{D- zPd%VFUxgZRi*fgwq`UKas=fS?_TdAPNvGeHN0(OWRl6>qSH_j(*@?PWOMRA_P?F=y zg*SU#9!sVsk`u`bWC&e>BA;F*kxeObDt?^53saSWy^al_Njw0WAUV;DAV=>E3X&%9 zmrsyUz$zrvMf^<((pOPU82*x*7Gx*3E)0X!l)z(KAEE0Q`F%gEnF~F6gmCbMi33kz z;s~CfqvFW%qYwy3!XxGgbLf4`6Og~c#ObXSuwh7&--peVK76tdpXtLd_u<RHF&-5c z7Ub;<<V8qf@ih8yQpv5K8y_1}a-`DGs%ClZ`c=!!6C;zoGNomWE3>l;GmFNeHkF+* z$c<91RJ}f5x-^!4zgDs>lDEocgVa0=W5YIct46N4Y81>;nR;HZ?D{%u`A;xs-I!a; zTM(Y7^L~yyjBEY^ZVU?Ni$WfUMENR05b~3dDE|f_DA>Q%!$<l*W;pBrSBA6xU-Q>J z=>Igs+5Q(9E`U!O=N!Xv-zYa2j!zlo1)rY*Ho$Nh%BZNHybAoL{Q~9mybxuhQL)Vx z$n9D$FVa#CHdV2$O`9lr(>95+vavxtpwz47(yCQ%5GA)(saRF$QeCqxB{R2l*4uuf zc-B_YDAdf#!M4(H{&Oya1x`75BUNCiEq^_FwWDYM6g1!-skDQie~l3Ij&F}=4U6<e zz<Z544GDShCHgKfF7`zQ@ms*q=l``&`96d5|F`3-zI_sMR@9!}H`+$yr}-slpk>+z z^WVZ?NZ*frhUbqJwa5306<vSIK7c~l{_XltJ)IZsAKFrTx_@|gf@=@x;6Me(4^9i~ g!PwFKnh)>$2KZ*+eGHC|ENpz<KYuQ?vkH#?H)vL78~^|S literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c new file mode 100644 index 00000000..5c5c17af --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c @@ -0,0 +1,76 @@ +/* + * mcp4802.c: + * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiSPI.h> + +#include "mcp4802.h" + +/* + * myAnalogWrite: + * Write analog value on the given pin + ********************************************************************************* + */ + +static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + unsigned char spiData [2] ; + unsigned char chanBits, dataBits ; + int chan = pin - node->pinBase ; + + if (chan == 0) + chanBits = 0x30 ; + else + chanBits = 0xB0 ; + + chanBits |= ((value >> 4) & 0x0F) ; + dataBits = ((value << 4) & 0xF0) ; + + spiData [0] = chanBits ; + spiData [1] = dataBits ; + + wiringPiSPIDataRW (node->fd, spiData, 2) ; +} + +/* + * mcp4802Setup: + * Create a new wiringPi device node for an mcp4802 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int mcp4802Setup (const int pinBase, int spiChannel) +{ + struct wiringPiNodeStruct *node ; + + if (wiringPiSPISetup (spiChannel, 1000000) < 0) + return -1 ; + + node = wiringPiNewNode (pinBase, 2) ; + + node->fd = spiChannel ; + node->analogWrite = myAnalogWrite ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h new file mode 100644 index 00000000..effa0246 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h @@ -0,0 +1,33 @@ +/* + * mcp4802.c: + * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int mcp4802Setup (int pinBase, int spiChannel) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o new file mode 100644 index 0000000000000000000000000000000000000000..4da7eca49478f60c72d4e855cd3b2ef2bd882936 GIT binary patch literal 1992 zcmbW2-Afcv6u{4ZnCnNgTNG><xDOTvI?bAH8WB6X>I$ObDi&emxQ_1Pe#knD+CxfK zxJV%VCB0=mh++>u_8$~IL{MPSLp>DRIkWfbZJmYiz|1-KchASY_srd0?H%lMIvl{o z0e9ed#3{gr``8X!W*E*wEkxJ9`d=#uW}=(!E6r#`3y~&IaJTE`_RC_ixVh?y7Cw1< z4+`)0KDzgQxi`j|9B-WHxBkIfbFkrV`b^oPn;0|`y-`Y$uZpg}_3v9V-o^;Ptn6)k zLVhqFEBq+@*$H=hq3|Aydn~7?yUSO1C~4ual<xV(I2JG5#o{9)!Cg$}xj(t@ZG>&a z#V?1@-_vs|&^$h!&zSi@hukhJt)aX%3O)*kWTjp1x>n+WHYFHRLQ0oa|AO@fa6B9Z z$Fk4SP+#rY!UOXozs%-z(h(`(oT!yNY8^D=u#?U8lU60)Gp8!~*ImO>AXzK<5vY<U zQpcQZ6!pXn--|X=;Ii!)Aa~ihBNdt{c(|ZS7?n&~l2gcU?TvZ4p!$SA0T*~G@G~d) zB_zHR6ySOVu2$fq$j{?C7g#RqoYB@Q_>-SqT}a0l+B=mtIS%O+HKV7pa}&9wX@J&0 zINYrcYQuefvEDIlOzj@*)nF-^OJ?RqlChD2h;Hhm6QF5}rXHWy;)!`}R!^pQ!kA&^ z7exPm!H}^ul$|l4hpnGFL}&k-zE_k<f!7QCvA`vPzYw@r-~q<zve3ijHZwTq=LquR zO4`(?QJcAvPH-z{q;%OdmQ9dnaPuHfFD`-w<a{QToHtS{Ajh-mw2?uVOx85y{-N<! z>wG}AqK$+$o72+<U&g6*03+#+lz(AiWF)Uj>gZkG`v#n$GY=nml#DHQg{By%o=_eB zh10z!xrz_*@*DS)CT)a#MQOnS<veYC5M%B3|G)LaEM7q^3Xks)A=-TXTn`9LbZy}d zBDC>+z?k?=Qi#Ihr)VGuKYxzyp<&m*Z|p$%zNmi`%j0?f&LJy5dqfamKa~j@2vWW+ i8ket~-08o8WQ}RMyS4a~*RMflSKr6r8qSMSUjHwV<lTD! literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c new file mode 100644 index 00000000..c172d1cb --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c @@ -0,0 +1,126 @@ +/* + * pcf8574.c: + * Extend wiringPi with the PCF8574 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" + +#include "pcf8574.h" + + +/* + * myPinMode: + * The PCF8574 is an odd chip - the pins are effectively bi-directional, + * however the pins should be drven high when used as an input pin... + * So, we're effectively copying digitalWrite... + ********************************************************************************* + */ + +static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) +{ + int bit, old ; + + bit = 1 << ((pin - node->pinBase) & 7) ; + + old = node->data2 ; + if (mode == OUTPUT) + old &= (~bit) ; // Write bit to 0 + else + old |= bit ; // Write bit to 1 + + wiringPiI2CWrite (node->fd, old) ; + node->data2 = old ; +} + + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int bit, old ; + + bit = 1 << ((pin - node->pinBase) & 7) ; + + old = node->data2 ; + if (value == LOW) + old &= (~bit) ; + else + old |= bit ; + + wiringPiI2CWrite (node->fd, old) ; + node->data2 = old ; +} + + +/* + * myDigitalRead: + ********************************************************************************* + */ + +static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) +{ + int mask, value ; + + mask = 1 << ((pin - node->pinBase) & 7) ; + value = wiringPiI2CRead (node->fd) ; + + if ((value & mask) == 0) + return LOW ; + else + return HIGH ; +} + + +/* + * pcf8574Setup: + * Create a new instance of a PCF8574 I2C GPIO interface. We know it + * has 8 pins, so all we need to know here is the I2C address and the + * user-defined pin base. + ********************************************************************************* + */ + +int pcf8574Setup (const int pinBase, const int i2cAddress) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + node = wiringPiNewNode (pinBase, 8) ; + + node->fd = fd ; + node->pinMode = myPinMode ; + node->digitalRead = myDigitalRead ; + node->digitalWrite = myDigitalWrite ; + node->data2 = wiringPiI2CRead (fd) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h new file mode 100644 index 00000000..8e2d8181 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h @@ -0,0 +1,33 @@ +/* + * pcf8574.h: + * Extend wiringPi with the PCF8574 I2C GPIO expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int pcf8574Setup (const int pinBase, const int i2cAddress) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o new file mode 100644 index 0000000000000000000000000000000000000000..2b38c7fddfd72d2818ed5bf99a9bde2e5e408518 GIT binary patch literal 2344 zcmbtU|4UO*6u;a2GEFxte=tmZLWE&HHqogOwW)K@SW}!MLu^ic>O(ijd`m6JXjwcg zkRYo6!k_vjkb&7R{Z<fxL_`omQTT%xeZkIo@7{bqpAmK7zI)E+e9k%do_p_`^9S3l z77JlwA!o>r#ZW@lb9Z#Fs(MK=DJ0>V#wW;Mn6oPznRodw->;*0e#Ln|>wKK;TX9yl z5i-I%D{rb%k+7hA7c!shHH`~_Qe|TqgE8)dvRSY?|012Y^{VQbvbk{8u6$NgDdVL= z=Bd4}A5wYApW`#%EOLce=m@K?W&gOw>_}Moschkbv~_2dm6@~3mt{LFODo@N7nD`u zZtjik?QP|)dreUM9GEsRL3M#zt*K2K->)uLc?}CDf!5YjTy<nHosiR917FX(YCUPy za$j?Mcvn5&d_u#yI+xqy^0=DSE)h~nXUmmtVwowilo#dO7ok^WfFGs4Dx7_el8iO# z!1W%3(S#VtY5aiimeuDd%h&=AF6k%(+Xu{Qa1EdzM8MB3-gqG+o;#rByn`H&e*Elk z1qWvhIm%kKr06pdJl-6#v2EfaHq)C%0JoXZ0nOP5*IiD^fTa_wF2C9<z>ZMdMR{tU zK*ydSKS^=5FI2aYe5&o9Y{b4B_|4DTgVzC4vIo`rZ-)2o!<PU*1nbPwT<V#Cei?>Y zp4<E2BsnzF)X-SZ50Ut6n=~rPv59UmHoRk9NJ+8?W|x#WKRGOtXdu|x;tNJQ+uOtb zo@kG+CFqZmX(=ToM!Terx>hw@XKM*)ov<jUlX~`UAS6zQun0L!_k|~24C4p9EtE?- z+@ZrC?Sntp;n)|J=Zy|OsKbl#qJkLfaw>{<LmSl8-WSEt=c0~bIx~Kf+KUD}OKrkW z&Bo=}Ak1<~o5z@z5+`E3EY8S;ACAc}!VgYO5f$Lmi3w?3oR}s2&}2L=CV-Ndltn%e ziquZYv7vFotI^_EbR-pvLu3C_IEcp<8E>{1Fq8_~Kh4^E7t6tcz4bBzofi=VVg12( zi>cVl!v7u0aTtgj{|x<xy2wQ_!Y2X4oc|i{ra6uK|J(Xr8qe+tn5wY&1_scXt)I;u zfHPfBy=MlRaPj>h74M~99@6+FJqSAMKZ7rVVs?HU{q+t|BAy?{vUqlW_|}ZQ$B^qZ mehdwr7`J7%cBBh*LrXNE2rwMR`UQZQ)&EMt2jJI>vHmaICNfa~ literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c new file mode 100644 index 00000000..0c860564 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c @@ -0,0 +1,90 @@ +/* + * pcf8591.c: + * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip + * The chip has 1 8-bit DAC and 4 x 8-bit ADCs + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <unistd.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" + +#include "pcf8591.h" + + +/* + * myAnalogWrite: + ********************************************************************************* + */ + +static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + unsigned char b [2] ; + b [0] = 0x40 ; + b [1] = value & 0xFF ; + write (node->fd, b, 2) ; +} + + +/* + * myAnalogRead: + ********************************************************************************* + */ + +static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) +{ + int x ; + + wiringPiI2CWrite (node->fd, 0x40 | ((pin - node->pinBase) & 3)) ; + + x = wiringPiI2CRead (node->fd) ; // Throw away the first read + x = wiringPiI2CRead (node->fd) ; + + return x ; +} + + +/* + * pcf8591Setup: + * Create a new instance of a PCF8591 I2C GPIO interface. We know it + * has 4 pins, (4 analog inputs and 1 analog output which we'll shadow + * input 0) so all we need to know here is the I2C address and the + * user-defined pin base. + ********************************************************************************* + */ + +int pcf8591Setup (const int pinBase, const int i2cAddress) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) + return fd ; + + node = wiringPiNewNode (pinBase, 4) ; + + node->fd = fd ; + node->analogRead = myAnalogRead ; + node->analogWrite = myAnalogWrite ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h new file mode 100644 index 00000000..6b44ccf9 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h @@ -0,0 +1,33 @@ +/* + * pcf8591.h: + * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int pcf8591Setup (const int pinBase, const int i2cAddress) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o new file mode 100644 index 0000000000000000000000000000000000000000..4db158b8eb13716dd11f97f03004c54782ac3890 GIT binary patch literal 2240 zcmbW1-%Aux6vxm0FgMfDq+r9Keb6$>Vb|1DB6j^bf~dJlhSW6fj_%_Au-(~QE7I7C zhDDIxd+EtPA$kbGik_m!pm!+<qNg4z?3|f<b)4OW>cE|I?&o~(?|Wx;aCFG&Z~!+4 zT!#G`rvPhJ`*F|+gHQ)GAQirPi>sa|Q_T)Z-+Af8R8%UuTUs%Y^nqqiVC${BIry2H zNJXqir3+>@S0xo*d$*0uyjXwgAxR*7?xLjs#2yPfuEKk>UGc8RP@$jwLZXd*{d8FW zt^dGTn36|Z`gZ=zD>sVtZ|0!u$2WI(cct~ZE9mqYPvDcJPe_t3P2l(*{p0NQZ5ZzF z@Ab7#&*f5Dð+i2k;&oKXwh4|IwC4zcH~$$jnqK$pME-$V02J7zj?+?fPNzQNH{ zTkYAv4fG;E$#O&F2L#`}8o?7fV&=M8u7!L^Xec;k!GmElmMLOrgY?1NV`oV47F?3x zyDfP8g@%x!q-3el*}38SZfOR<RrX|wyUNLt(ms}&3oMs`rEyu{wDfPR8QBTOCz#Gy zFN<AJ&7y<O1+){T=7K{d@HCQ!5(;ps0`IH9!xeb60@si?;(FK6lNo1){sES9^Lbi< z!%}3vyR#=CMj*KoN-2r-!qrS%Q}=3<suBfxcyzokG%Ak|4TT4%<f%~K=%5VChESHX zni5%*Be6w!UWq4QIi8897AE2&?fqs~7GU(oh77A(Zpo@X2*%Xqv2;|$d6Tu8&bSe^ z82`e@L`M5bMmMDn3+Fd6CL=Cj;XFnVjd(p4&Wi-mh#$qm`7?rO#2c}2ev2TQy&s=J z=`NauRgL>VG3Wd~&M*PzYpf1pb|tAPbLh2<>0>;~s0l^X)Vu~_RM8X==dxKafS5}q z;)`lx1;j`?nN(9KNu@Pa93Go)GmZ&FqqQ27=QB!@?=Bzo-@Ol;(3`ivj36?yH>TVB z+V5r)W@rzCdkQmXC5X0ZI-vJW<M5YB|2Hyvf5h#7kSc;@%#P2ahWh;9_5o~5ecIRm zx8ny{dp~-s@%Eioh%ui(_ahc&mG*Lh6_(N7V2tjc)q<>j-U>11`_J(;49cC~2X=lE z6VmxnTi%|ZAH6mE-cu8A6@39>rrZ14mqm5^+)4a`3EweK{|r6{%JcCLV_a_hH3pxP J*kbna{{Rmr11<mn literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c new file mode 100644 index 00000000..d2f3b4e9 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c @@ -0,0 +1,51 @@ +/* + * piHiPri: + * Simple way to get your program running at high priority + * with realtime schedulling. + * + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <sched.h> +#include <string.h> + +#include "wiringPi.h" + + +/* + * piHiPri: + * Attempt to set a high priority schedulling for the running program + ********************************************************************************* + */ + +int piHiPri (const int pri) +{ + struct sched_param sched ; + + memset (&sched, 0, sizeof(sched)) ; + + if (pri > sched_get_priority_max (SCHED_RR)) + sched.sched_priority = sched_get_priority_max (SCHED_RR) ; + else + sched.sched_priority = pri ; + + return sched_setscheduler (0, SCHED_RR, &sched) ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o new file mode 100644 index 0000000000000000000000000000000000000000..15cfa994b10b34524c1dc75a381724f3a3d0852b GIT binary patch literal 1792 zcmbW0&1(};5WpuN+E~*VKMqO@?jcGF?IY1P&>m#dnq<Xbi)}#>TsO(qEcs~J-9Rd$ zhnzw${vrMiT2RnG!J~RA=*6=_oq79SyKXiho$@*}znOU-vy<1QYB?H-fRqT_ffG+s zfP>hHt#VU^DVT(f;qUiR^tHjybVJ*Z-^h|Pyqihn4?e{+lzB-1mcG248_s0%N80fF zJ1XE*+plI44efT4m-Vh`gOBMaA1+*1fp5xlhVjgg&)kB_>guwR-KzDvZckZc3oJKZ z=y5OqDqmo^1-3NnaphJnU&s}5OLR8L6;DCr#Y2en(~;@qMB)uTlx{d9Vr|mJRC*A- zpHiab$yB<SN|ervXt<(Y#o^acSTq*eNq`vsg-Hx|3X>R|3B$O{#2B6!!_SUzdfg@8 zJ$Vn1UB;Cj$p)Am!__f-V+@B~OS9H(i`AtCdZoIyQmpE0<?=>pQ{ODER7*NI^`_a- zpPR0}Yg;?E<?iVnqc5;yx;)-%n>OgW;~MprUT?PaZNu_j!Y2^#K%J$x{yFkw8Eq2c zNnDaYC5RHtZ+e*XDYRw2A~=mStz%)%UdJ_Rz#P~1bW>Wk**2JK_FZ5N!!>}_90xdH zy>8oTne9Db^_@<~>|#oH$2D2y!PY!~9WY*PHuY`W=$OaHoz_sWkY+eI87eXoIS-yU zIup|vpkApmLFlid8P9}Iy{B{JWL_2grr^O}#9I*$D%!&@bLh~Xr>)OpZP@$&_k2~< z=TQ4a)-U=Y+VcKV-}5nl>NmgRvt^w`G_S<|nLYFmMS?1{RI>lle~d=h_fthf<#(d* zN42tE@{7oVy+;I(1Z<Myli>Zs?oR1hk+?2&64^Oi!SjiQo!=J?X<*zh!SnwDm1?RT literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c new file mode 100644 index 00000000..b0499be4 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c @@ -0,0 +1,63 @@ +/* + * piThread.c: + * Provide a simplified interface to pthreads + * + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <pthread.h> +#include "wiringPi.h" + +static pthread_mutex_t piMutexes [4] ; + + + +/* + * piThreadCreate: + * Create and start a thread + ********************************************************************************* + */ + +int piThreadCreate (void *(*fn)(void *)) +{ + pthread_t myThread ; + + return pthread_create (&myThread, NULL, fn, NULL) ; +} + +/* + * piLock: piUnlock: + * Activate/Deactivate a mutex. + * We're keeping things simple here and only tracking 4 mutexes which + * is more than enough for out entry-level pthread programming + ********************************************************************************* + */ + +void piLock (int key) +{ + pthread_mutex_lock (&piMutexes [key]) ; +} + +void piUnlock (int key) +{ + pthread_mutex_unlock (&piMutexes [key]) ; +} + diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piThread.o b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.o new file mode 100644 index 0000000000000000000000000000000000000000..ab3aaf50b793ce169fc02b6124f8032089b3d19a GIT binary patch literal 2080 zcmbVM&rcIk5T0d0Dgs4Almruc0E3Bab`=^?H04)WO%)@MXiQwT?KW-t1JdqB@PG%r z5JE!YKfs^h&7)29;>|z7o0@p>pfSb-XWqWoK3|rL)9ijT-+VJ~JMZnjSj?n5G!2Al za2wi@U;#dLw*3@yQ_u%JVDEk#viE*lAFQAD-sil%-#IppX?t&BG-frwkka1IjK=cz zwO*D9y6oNeL+@B7J_2^`*goiDvV+05_QA}@uM`yGBQFV0%Cj81EzQs0NQ|##gPI>C zri@9$oJa;NvUaSbVNM#;mqR{r)wGgk(wwHcLEb@o{t&dS0d2UqJ9dbFd<glAJa>z5 zp+C{+>5t8x0T{sWI?r9;NPRL2$HPdV*>=MB<EW$_Ie7pbe^I7mrzq2b4fLN>FGiZA zKa#RKbW2g&)gjgnBu|G^QWU!95za}^&t`|*7+y3t)ovmY#os-Fe}X*qPa%?t`Df9O z>JuPO`gKGyq2ED2N)MZ*)neUq^F|Kcdx7t5d5so1j~U+sXDPEhH=A*m)9IDPRcCc} zF0<&srq2qU92Yqa-_4bsT(RsF+)@RbWHxf;maIy>oeHB$YqikfEy7$7lI*!h*qzP{ z0PW$Q<Ivb4#+dj%iBF?X)`1u0guXx|n#!+)G}Fe>7y5?8pOyFo=cx}}!e+Q5_!N&H zDEvB)!Dwt(eK(8f*F!7{ukKY`1Bc{;k#~I;jBKL;j4*ICrLtGq1|zpot$H<-)HZz2 zSh~M9!Nv{-tM-acq3%{avD$xQ0xRjARZn~hIkIOVwC?KJ8paImL#m|+og@BAA95Z) zFKiw0#?g0(>=ItIzWN1tL&*put!!5?pq^@dlZ%cx3P=ctqlFmt|C@?VgzEY!Ob}-Z z0mmlCDTNpH0`Fj6__Fke97w*Zeah?Qvr6(`yk?!F05N|NKSn2N|4bs$>=1zVk7`A| y*gtxA)Y((X7OyW-Aes976sylp@<&|wnj?K1dhk-$KaE_}`Y}$v!n|zi`hNl6aM!5- literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c new file mode 100644 index 00000000..7ceb156b --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c @@ -0,0 +1,75 @@ +/* + * sn3218.c: + * Extend wiringPi with the SN3218 I2C LEd Driver + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <wiringPi.h> +#include <wiringPiI2C.h> + +#include "sn3218.h" + +/* + * myAnalogWrite: + * Write analog value on the given pin + ********************************************************************************* + */ + +static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + int fd = node->fd ; + int chan = 0x01 + (pin - node->pinBase) ; + + wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ; // Value + wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update +} + +/* + * sn3218Setup: + * Create a new wiringPi device node for an sn3218 on the Pi's + * SPI interface. + ********************************************************************************* + */ + +int sn3218Setup (const int pinBase) +{ + int fd ; + struct wiringPiNodeStruct *node ; + + if ((fd = wiringPiI2CSetup (0x54)) < 0) + return fd ; + +// Setup the chip - initialise all 18 LEDs to off + +//wiringPiI2CWriteReg8 (fd, 0x17, 0) ; // Reset + wiringPiI2CWriteReg8 (fd, 0x00, 1) ; // Not Shutdown + wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ; // Enable LEDs 0- 5 + wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ; // Enable LEDs 6-11 + wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ; // Enable LEDs 12-17 + wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update + + node = wiringPiNewNode (pinBase, 18) ; + + node->fd = fd ; + node->analogWrite = myAnalogWrite ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h new file mode 100644 index 00000000..580d5f96 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h @@ -0,0 +1,33 @@ +/* + * sn3218.c: + * Extend wiringPi with the SN3218 I2C LED driver board. + * Copyright (c) 2012-2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int sn3218Setup (int pinBase) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o new file mode 100644 index 0000000000000000000000000000000000000000..a2c6d32712410e33e2ca161db6ed802beab9d138 GIT binary patch literal 2080 zcmbW1&rcIU6vtn?C>5ct_#-43X*?K=GU+1JVhpx4K#2_y3jPRcDP^Gz{XyDoC>-=q zG1;hzi5GAF7aoW~6O7(Dk$AwPCML#<Cro{BJ5!eJHZgpg*?I3X@6GS&li|pS-DU$J z8w|pMCn&(TrUN^mn*nHp7KmQC?s~WLJmx5WwrP9csYTn9cec)<G5dpDS62WQnXBt5 zIWQB|{(hK7BV7LJ(8D)AYTKpdO&V1GqkZ9BY~DhD>ok52fiq@s_5kov_4uuJ<k~OY z4!>->Q>j$6dk*<)SPM^v%by(D?(D;D7!8GPc)Dlii&?ek>1Tb++v6+hp8Qz$F>fCm zxLoC)Ua#!)`n&_!tuC4f$+kWPwvyY{+1l)Qg=^?Qc3y7*xJY%-=`PzJI2~wqWAPJ1 zy`T@aJ+lX$9cAgZ(_>$Ec7&YnpdL!CmZEKHg5MRZM#=Kz03`fbNy472B*C#d+=9ez z=wDwOkCLFdE}nn{wCZ|EaJ&xEzPalt0BgWQ$lGx~UY?`xC)yJY;^!K0C}gko%6^uB z%vvxTPv@5I=2NNyvC+uHP%sjk7#WEUPsgT%Ly_Satfum*?9yavtT&{GO({!$-a}MT ziz~)}!(d!l9nUQ&;KF&3Xy;F2*~gnn8YGA!-iAf+DS{|-e4>i$xY~ekG~llr@V5r; zL|e?~f`J?7@8R5zH5H+o+z?!x7qG%wMvc#7t>&wBQdoH<9cQXiQh_bR)i|*ELIHHZ zirI8(SxK(}OXM;cC5s{1oT{+V@tK~28c!?()3cRiY%w3tC}J8%u05DZZ_a#U1IS44 zt5xl5zQdi^LT4AKMO2Ly{v>xfr@f?c#EYT#K)Qs5xcLR|Q=^3_)~KuKP@hN5moe9B z{r@|DfallF9et9>@2|SGub986$FN1%wIDQPD`*k>h%@7zq<;K7e~ui3#QqC(9}TPX z3ll_%b<z1zuE-bXcM6$#?-4<X=O@WA$h<7_&2y*lH#{)O>sDm+A8j801Tw4f1zf>) Iqs-&~1Jir?X8-^I literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c new file mode 100644 index 00000000..3c79ba7b --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c @@ -0,0 +1,167 @@ +/* + * softPwm.c: + * Provide 2 channels of software driven PWM. + * Copyright (c) 2012-2014 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "softPwm.h" + +// MAX_PINS: +// This is more than the number of Pi pins because we can actually softPwm +// pins that are on GPIO expanders. It's not that efficient and more than 1 or +// 2 pins on e.g. (SPI) mcp23s17 won't really be that effective, however... + +#define MAX_PINS 1024 + +// The PWM Frequency is derived from the "pulse time" below. Essentially, +// the frequency is a function of the range and this pulse time. +// The total period will be range * pulse time in µS, so a pulse time +// of 100 and a range of 100 gives a period of 100 * 100 = 10,000 µS +// which is a frequency of 100Hz. +// +// It's possible to get a higher frequency by lowering the pulse time, +// however CPU uage will skyrocket as wiringPi uses a hard-loop to time +// periods under 100µS - this is because the Linux timer calls are just +// accurate at all, and have an overhead. +// +// Another way to increase the frequency is to reduce the range - however +// that reduces the overall output accuracy... + +#define PULSE_TIME 100 + +static int marks [MAX_PINS] ; +static int range [MAX_PINS] ; +static pthread_t threads [MAX_PINS] ; + +int newPin = -1 ; + + +/* + * softPwmThread: + * Thread to do the actual PWM output + ********************************************************************************* + */ + +static PI_THREAD (softPwmThread) +{ + int pin, mark, space ; + struct sched_param param ; + + param.sched_priority = sched_get_priority_max (SCHED_RR) ; + pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; + + pin = newPin ; + newPin = -1 ; + + piHiPri (90) ; + + for (;;) + { + mark = marks [pin] ; + space = range [pin] - mark ; + + if (mark != 0) + digitalWrite (pin, HIGH) ; + delayMicroseconds (mark * 100) ; + + if (space != 0) + digitalWrite (pin, LOW) ; + delayMicroseconds (space * 100) ; + } + + return NULL ; +} + + +/* + * softPwmWrite: + * Write a PWM value to the given pin + ********************************************************************************* + */ + +void softPwmWrite (int pin, int value) +{ + pin &= (MAX_PINS - 1) ; + + /**/ if (value < 0) + value = 0 ; + else if (value > range [pin]) + value = range [pin] ; + + marks [pin] = value ; +} + + +/* + * softPwmCreate: + * Create a new softPWM thread. + ********************************************************************************* + */ + +int softPwmCreate (int pin, int initialValue, int pwmRange) +{ + int res ; + pthread_t myThread ; + + if (range [pin] != 0) // Already running on this pin + return -1 ; + + if (range <= 0) + return -1 ; + + pinMode (pin, OUTPUT) ; + digitalWrite (pin, LOW) ; + + marks [pin] = initialValue ; + range [pin] = pwmRange ; + + newPin = pin ; + res = pthread_create (&myThread, NULL, softPwmThread, NULL) ; + + while (newPin != -1) + delay (1) ; + + threads [pin] = myThread ; + + return res ; +} + + +/* + * softPwmStop: + * Stop an existing softPWM thread + ********************************************************************************* + */ + +void softPwmStop (int pin) +{ + if (range [pin] != 0) + { + pthread_cancel (threads [pin]) ; + pthread_join (threads [pin], NULL) ; + range [pin] = 0 ; + digitalWrite (pin, LOW) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h new file mode 100644 index 00000000..0351da5d --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h @@ -0,0 +1,35 @@ +/* + * softPwm.h: + * Provide 2 channels of software driven PWM. + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int softPwmCreate (int pin, int value, int range) ; +extern void softPwmWrite (int pin, int value) ; +extern void softPwmStop (int pin) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o new file mode 100644 index 0000000000000000000000000000000000000000..f461408e648898946498f0eaf4c0523e9488d203 GIT binary patch literal 3704 zcmbW4O>7fK6oALE18#s#fFNk0%1R9=w6L{lh=59!*AB@NOi7yr)E00TdmS79%3h14 z>aWrutsGNM6^9BT(V|M_)Kg9n2@36@RSrdJRUuG&Fja~QYLyGL?t8N{@nmIR`jXw5 z_sx56-n^OJO+MHk9%ym72p1Q5h14}p3E8u%-Ve}jfUF^HL_Mk=xz++e9aBfcmEAZr zHWIGv#Ev%g$EKK8_H6Az#p>_&`seQBfaU3?t!Djt6`eKfmaUgtaroMsa0^G}Tcid; zM-Exlg^lf9B=t{>>eIiJe5uEFKUCgvIaEIO1=+qZ{lL6)74z@6Y`?m_IqzTObm2yO z*T*;$`KVfR6EeLxu}!PcxwUAm?3vwrv;FWxMy%f1>v3++n12!Ma6mnR3m*$dt0P+F zS&Rsa?r<(TSoU0+o@<}}6vkBx(x}oTRqHlg3?^2ky#Z^-C9Q17Vfj=xod360^M40Z zTGauo_hP^G9JQT#xn_N1Zh+MKp=7vdj!TcUa%VS7b;#<xXWiGz;cjnCducV@i_%7I z>PE*~$JJx%arMM?sOv0Ndf{gpA$~5d@b%i;x)m2THljuUgw=V~vggY5T&WXcc<mVV z`mmk19v>*b`@l|!_WX-9w0g^P1!JMBb=P+GFaC~*(9O1c!hJ9l+9&snoh)U|lDu2# zReU@9N>uZ|@9$H5y~^J0HkWt#{C&PY-(K|YWFcJdyiQyb9j?u*S9;GujeNkju(4Te zgHp#QEkSA1S@)nMS3E(fXQow?d}mgu(w?c62c=;`I=~DXDgmL5vHp+PLY%W0r{WGu z@{C87dd{@=OTMWU2c<yE<u=I&M3rQ)0L!4{?O#PSaQl+QIK^UAFvg5qljJiPW2$vf z@`c-|tIA!6R;8q#kR&ew7Nb#v$HGG%)f$bt8$RiTxZ$UfxFJ#_aTEIFEE~etMT-!h z)*9H;aJeuJZUhPz7o-a=%4O6*7{`-GIfZbOc?a`cSyzOfn|KAS-gT1|b%pitJ;kP4 zHWq5a@y*o8e!K~P5BOT4p1gt|H?f~-!Y?%8UjbhS6`F$<B|z_lV7-y!FA6=Q(B6cr zQT{(P;dh$w-<t5hf#baQ*u3;y1H(KT&D-9DlVUDz4xi2_QQjL(6bwB^GI}9ZBn3S? zZV;2AB8d!!4+qt7<nX}2$o|pDs2U9KkC0+CVZ<Wih8f8hlDR_CoQ!1j36i(HB1Iz| z7Zj74=k<b~Az9<}a578sNi8{CNRpV5)+Y}oqlH}2h~~1fB8er(lct_N3PBB?-!dfx zxx!FBnLU(?LCfZh+L#6;kx0?hqp3(Vk&49iWSR#WF?0F4hn|fZ=_U144)Q|bwZyL{ zo~b7<BDJ3{Y?nAbSRlLXhT2Nde}eCOkbMGg7x<9CaV~EE8spDHyH?;a#xa+50yhP| zUf>@#;hzb-Q?UPB;9{Jw1uoiu&$zP=cb%No?XM<WV&~WyM`aw>yAdv4pMwGy^Etw} zvu?+o@mW5ng*cmp_-6%<?@~VR1!o+4du#K8{WF4n)oIVp$$DHU$kKXQoG!+3z4-m) z^S&T({IiAg0fCEkkiiB8hnWf0N9n!J=a`;waQ;4{e?`C;kHg<LL@7>YO#LLZX2EU~ zyjOtdSTT(WlPEFW)QNJkSR@oErEEHxGSZVoiRLmHBMT<koM|Y7ua51cPbpETw~>g% z;SFK1tp0x^gDY-<^NSP!hB71;2Xy|t(?Pgxh70#10GBAU?2|al{P8=C^YAYso+XrR za3Obo>1UW9#umk??|?y!>GZ$I^A3pKgviTP;s?Fa`j`A2_Gl|g02E|C5kjB)(|<&S zG49XX12D$>f*HBZ^A}+Q+Y^jA&3|Ixp~IiopW`>6(`f(lZMMbR%n<hveYrp1KYaH( vYmYAT%s+vOAkMX-?#vy{zhyz^+2CqmYv6Lu{}ixB^Pgu2dW&O1hf4kf><nBf literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c new file mode 100644 index 00000000..9de9f4fa --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c @@ -0,0 +1,211 @@ +/* + * softServo.c: + * Provide N channels of software driven PWM suitable for RC + * servo motors. + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +//#include <stdio.h> +#include <string.h> +#include <time.h> +#include <sys/time.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "softServo.h" + +// RC Servo motors are a bit of an oddity - designed in the days when +// radio control was experimental and people were tryin to make +// things as simple as possible as it was all very expensive... +// +// So... To drive an RC Servo motor, you need to send it a modified PWM +// signal - it needs anything from 1ms to 2ms - with 1ms meaning +// to move the server fully left, and 2ms meaning to move it fully +// right. Then you need a long gap before sending the next pulse. +// The reason for this is that you send a multiplexed stream of these +// pulses up the radio signal into the reciever which de-multiplexes +// them into the signals for each individual servo. Typically there +// might be 8 channels, so you need at least 8 "slots" of 2mS pulses +// meaning the entire frame must fit into a 16mS slot - which would +// then be repeated... +// +// In practice we have a total slot width of about 20mS - so we're sending 50 +// updates per second to each servo. +// +// In this code, we don't need to be too fussy about the gap as we're not doing +// the multipexing, but it does need to be at least 10mS, and preferably 16 +// from what I've been able to determine. + +// WARNING: +// This code is really experimental. It was written in response to some people +// asking for a servo driver, however while it works, there is too much +// jitter to successfully drive a small servo - I have tried it with a micro +// servo and it worked, but the servo ran hot due to the jitter in the signal +// being sent to it. +// +// If you want servo control for the Pi, then use the servoblaster kernel +// module. + +#define MAX_SERVOS 8 + +static int pinMap [MAX_SERVOS] ; // Keep track of our pins +static int pulseWidth [MAX_SERVOS] ; // microseconds + + +/* + * softServoThread: + * Thread to do the actual Servo PWM output + ********************************************************************************* + */ + +static PI_THREAD (softServoThread) +{ + register int i, j, k, m, tmp ; + int lastDelay, pin, servo ; + + int myDelays [MAX_SERVOS] ; + int myPins [MAX_SERVOS] ; + + struct timeval tNow, tStart, tPeriod, tGap, tTotal ; + struct timespec tNs ; + + tTotal.tv_sec = 0 ; + tTotal.tv_usec = 8000 ; + + piHiPri (50) ; + + for (;;) + { + gettimeofday (&tStart, NULL) ; + + memcpy (myDelays, pulseWidth, sizeof (myDelays)) ; + memcpy (myPins, pinMap, sizeof (myPins)) ; + +// Sort the delays (& pins), shortest first + + for (m = MAX_SERVOS / 2 ; m > 0 ; m /= 2 ) + for (j = m ; j < MAX_SERVOS ; ++j) + for (i = j - m ; i >= 0 ; i -= m) + { + k = i + m ; + if (myDelays [k] >= myDelays [i]) + break ; + else // Swap + { + tmp = myDelays [i] ; myDelays [i] = myDelays [k] ; myDelays [k] = tmp ; + tmp = myPins [i] ; myPins [i] = myPins [k] ; myPins [k] = tmp ; + } + } + +// All on + + lastDelay = 0 ; + for (servo = 0 ; servo < MAX_SERVOS ; ++servo) + { + if ((pin = myPins [servo]) == -1) + continue ; + + digitalWrite (pin, HIGH) ; + myDelays [servo] = myDelays [servo] - lastDelay ; + lastDelay += myDelays [servo] ; + } + +// Now loop, turning them all off as required + + for (servo = 0 ; servo < MAX_SERVOS ; ++servo) + { + if ((pin = myPins [servo]) == -1) + continue ; + + delayMicroseconds (myDelays [servo]) ; + digitalWrite (pin, LOW) ; + } + +// Wait until the end of an 8mS time-slot + + gettimeofday (&tNow, NULL) ; + timersub (&tNow, &tStart, &tPeriod) ; + timersub (&tTotal, &tPeriod, &tGap) ; + tNs.tv_sec = tGap.tv_sec ; + tNs.tv_nsec = tGap.tv_usec * 1000 ; + nanosleep (&tNs, NULL) ; + } + + return NULL ; +} + + +/* + * softServoWrite: + * Write a Servo value to the given pin + ********************************************************************************* + */ + +void softServoWrite (int servoPin, int value) +{ + int servo ; + + servoPin &= 63 ; + + /**/ if (value < -250) + value = -250 ; + else if (value > 1250) + value = 1250 ; + + for (servo = 0 ; servo < MAX_SERVOS ; ++servo) + if (pinMap [servo] == servoPin) + pulseWidth [servo] = value + 1000 ; // uS +} + + +/* + * softServoSetup: + * Setup the software servo system + ********************************************************************************* + */ + +int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) +{ + int servo ; + + if (p0 != -1) { pinMode (p0, OUTPUT) ; digitalWrite (p0, LOW) ; } + if (p1 != -1) { pinMode (p1, OUTPUT) ; digitalWrite (p1, LOW) ; } + if (p2 != -1) { pinMode (p2, OUTPUT) ; digitalWrite (p2, LOW) ; } + if (p3 != -1) { pinMode (p3, OUTPUT) ; digitalWrite (p3, LOW) ; } + if (p4 != -1) { pinMode (p4, OUTPUT) ; digitalWrite (p4, LOW) ; } + if (p5 != -1) { pinMode (p5, OUTPUT) ; digitalWrite (p5, LOW) ; } + if (p6 != -1) { pinMode (p6, OUTPUT) ; digitalWrite (p6, LOW) ; } + if (p7 != -1) { pinMode (p7, OUTPUT) ; digitalWrite (p7, LOW) ; } + + pinMap [0] = p0 ; + pinMap [1] = p1 ; + pinMap [2] = p2 ; + pinMap [3] = p3 ; + pinMap [4] = p4 ; + pinMap [5] = p5 ; + pinMap [6] = p6 ; + pinMap [7] = p7 ; + + for (servo = 0 ; servo < MAX_SERVOS ; ++servo) + pulseWidth [servo] = 1500 ; // Mid point + + return piThreadCreate (softServoThread) ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h new file mode 100644 index 00000000..794cf552 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h @@ -0,0 +1,35 @@ +/* + * softServo.h: + * Provide N channels of software driven PWM suitable for RC + * servo motors. + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern void softServoWrite (int pin, int value) ; +extern int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c new file mode 100644 index 00000000..e2fb7371 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c @@ -0,0 +1,150 @@ +/* + * softTone.c: + * For that authentic retro sound... + * Er... A little experiment to produce tones out of a Pi using + * one (or 2) GPIO pins and a piezeo "speaker" element. + * (Or a high impedance speaker, but don'y blame me if you blow-up + * the GPIO pins!) + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <pthread.h> + +#include "wiringPi.h" +#include "softTone.h" + +#define MAX_PINS 64 + +#define PULSE_TIME 100 + +static int freqs [MAX_PINS] ; +static pthread_t threads [MAX_PINS] ; + +static int newPin = -1 ; + + +/* + * softToneThread: + * Thread to do the actual PWM output + ********************************************************************************* + */ + +static PI_THREAD (softToneThread) +{ + int pin, freq, halfPeriod ; + struct sched_param param ; + + param.sched_priority = sched_get_priority_max (SCHED_RR) ; + pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; + + pin = newPin ; + newPin = -1 ; + + piHiPri (50) ; + + for (;;) + { + freq = freqs [pin] ; + if (freq == 0) + delay (1) ; + else + { + halfPeriod = 500000 / freq ; + + digitalWrite (pin, HIGH) ; + delayMicroseconds (halfPeriod) ; + + digitalWrite (pin, LOW) ; + delayMicroseconds (halfPeriod) ; + } + } + + return NULL ; +} + + +/* + * softToneWrite: + * Write a frequency value to the given pin + ********************************************************************************* + */ + +void softToneWrite (int pin, int freq) +{ + pin &= 63 ; + + /**/ if (freq < 0) + freq = 0 ; + else if (freq > 5000) // Max 5KHz + freq = 5000 ; + + freqs [pin] = freq ; +} + + +/* + * softToneCreate: + * Create a new tone thread. + ********************************************************************************* + */ + +int softToneCreate (int pin) +{ + int res ; + pthread_t myThread ; + + pinMode (pin, OUTPUT) ; + digitalWrite (pin, LOW) ; + + if (threads [pin] != 0) + return -1 ; + + freqs [pin] = 0 ; + + newPin = pin ; + res = pthread_create (&myThread, NULL, softToneThread, NULL) ; + + while (newPin != -1) + delay (1) ; + + threads [pin] = myThread ; + + return res ; +} + + +/* + * softToneStop: + * Stop an existing softTone thread + ********************************************************************************* + */ + +void softToneStop (int pin) +{ + if (threads [pin] != 0) + { + pthread_cancel (threads [pin]) ; + pthread_join (threads [pin], NULL) ; + threads [pin] = 0 ; + digitalWrite (pin, LOW) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h new file mode 100644 index 00000000..a93c5af3 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h @@ -0,0 +1,39 @@ +/* + * softTone.c: + * For that authentic retro sound... + * Er... A little experiment to produce tones out of a Pi using + * one (or 2) GPIO pins and a piezeo "speaker" element. + * (Or a high impedance speaker, but don'y blame me if you blow-up + * the GPIO pins!) + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int softToneCreate (int pin) ; +extern void softToneStop (int pin) ; +extern void softToneWrite (int pin, int freq) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.o b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.o new file mode 100644 index 0000000000000000000000000000000000000000..5bbf1c7fbb3051776cc147c16ef3962ba19bb443 GIT binary patch literal 3496 zcmbW4Z%iCT6u{qc*FvFP5UZjz;f&N^Qr5dlF*Q~1fWktrh481w*t$LL_Ig*2JG|SA zU`(w!Y1mMj#`r<w2kkdwqS2TrMpH;ILH+0lV`5^pNrOfz=m#Xh6yKYjIi|~9VtizF z=KbcqH#2W$c8^z%hC0h!E)e2^r(jDH6d+!?)ef*`0QNv71WyKs=E@KR2Zus4hp1;D z_@(!1IcWLiny5DI+24drvpO0p{PVw3zvXFUwPxM8MxL6r$n;R8nY!l=;$v|KH8)Z0 zF6&lx!v#X^)B8T0{4rNMN0VfIHZlLWM#NfSti$^Gt-m*{MQeen){1}4Zd_;8@1Mu2 z8(yPu@apZUy8&kDQQf<mUwV3$=;T_pwyMprNmwnj3o%vL<1)3#$^aiMG_#+~OD@&F z#wXOBKe7z7w4Pi)kE_kxGk1G))BlZsO|zCPw)REOdlZjNGXEqsH?0Np-s%R}S}*6h zTbSF%Zp*W5{h&<`HdaKn$M&*Z=XPoNuWFt<9Xw^P9=-3J{|p-|6j>VRneMm=+T?t$ zf|;YGwIQ~nXZq!v!1LC#h;}5_b^jWf{zeKd2fEtZpYS#f4d+s3&U;90QGLy=Ii~r~ z`&(6Ci+cDGn|lxX{H?xL-(m9IOAi#+Oa0&)uW{AyF0Z(PJ9q%uKGp;98P#n{&E>K- zrEbRErFbuSf=biH9h&0H@9a?m*j<AqgoWf`y8<89XL$P)sxii;vY=9T(cPhV^PYai zS9YaR@gfN-HEl{ounJnx><#Y2;%)gHBcEfH!nmU<Dw^EBSVf1?1AlH7>vI>qVE}IY zD<*D?R7~8!4(J_SyHP8X;<FqgtH<J^ICSGkXo4sYVsT01ijkTa7aA(U51Vc%$LDr& zL&bK8#0@*QaoQu=JEwFaD8^5h;O9#43nlne34XZ*f4c<#0C_EDZXRnAarVBzHt|(P z0oeJ&_P1Dyt?RoI{Ff5^FXR;eBffv)?9)Lj7GFWTVjQyRm^qkE8ET}^9E@j-a1>%0 z<Ap4wj2HV7DKHt!g5DMCZ3~9<-p<Z}ql5Zjuq|{{hioKnMD??VsgGq6=}f|$&_~1L zFlKw{StA*f6qA{cg)`w%7)xl0zDxq5Mlw7B(Ztz=8BRWf5eyq0Ped~5tPx44qS?X( z?S3)ycAPDmk0nya(^0JXpb;DEde#g_M)XL0M303N$wH6;Gd;Ft98N`yWI;Wb#w9bU zwkvk*=@$IM^Zh92#1!K65=41i;^ZrMm&9ow1V6z!T`Rivf<Nov>vs6fVa{pXyCnPb z60eo`>k`LrTOs~ciPJk+jQhUCW&4jMF5CaaIn7_rkN7E3;C%iM@cfbOeOSb}4@q1e zx0Ulk9Ip3BT+Z7`DNdaf|CGaigU=@=*~@t|OW407+21e4|5UPPdEoKCm+a}?E7p5M z;`E&pd|l#l9=vEnLV2Jfq>ncQpXYki!B@Hdrh|+32dLSJQ8PS@wVAQ&xM*eYZmOm+ zZh{&On_*Cgvsqw3&83ow5hFPPY9u{6YNXI4l{O8v>%>qqyLX^6ZzHb9@VXm(^#5OZ z(Unr<{E`Hak%;?gYun#>v<I|50b#)FI{qn};>oQ-PUDC#8J#5(dcPBQexZ+WKZ-4j zQ$K*66w~P+;Qr1IuN(~9ek?`TFZ><$WGhPm6=FUaVq1*Qez{A1!e7+g*eBYO8RY)s z_|J2Hr};PsU&}$UE%Glgy%&q^-@ChPi!<Di_K$ppzt}%|XF7AwT=@Srai(lNoNFcB iId`%S@SwB2lYW2g!QvdBrde$Kb^a5s-Z7v<g?|A86heIf literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c new file mode 100644 index 00000000..87210c28 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c @@ -0,0 +1,109 @@ +/* + * sr595.c: + * Extend wiringPi with the 74x595 shift register as a GPIO + * expander chip. + * Note that the code can cope with a number of 595's + * daisy-chained together - up to 4 for now as we're storing + * the output "register" in a single unsigned int. + * + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdint.h> + +#include "wiringPi.h" + +#include "sr595.h" + + +/* + * myDigitalWrite: + ********************************************************************************* + */ + +static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) +{ + unsigned int mask ; + int dataPin, clockPin, latchPin ; + int bit, bits, output ; + + pin -= node->pinBase ; // Normalise pin number + bits = node->pinMax - node->pinBase + 1 ; // ie. number of clock pulses + dataPin = node->data0 ; + clockPin = node->data1 ; + latchPin = node->data2 ; + output = node->data3 ; + + mask = 1 << pin ; + + if (value == LOW) + output &= (~mask) ; + else + output |= mask ; + + node->data3 = output ; + +// A low -> high latch transition copies the latch to the output pins + + digitalWrite (latchPin, LOW) ; delayMicroseconds (1) ; + for (bit = bits - 1 ; bit >= 0 ; --bit) + { + digitalWrite (dataPin, output & (1 << bit)) ; + + digitalWrite (clockPin, HIGH) ; delayMicroseconds (1) ; + digitalWrite (clockPin, LOW) ; delayMicroseconds (1) ; + } + digitalWrite (latchPin, HIGH) ; delayMicroseconds (1) ; +} + + +/* + * sr595Setup: + * Create a new instance of a 74x595 shift register GPIO expander. + ********************************************************************************* + */ + +int sr595Setup (const int pinBase, const int numPins, + const int dataPin, const int clockPin, const int latchPin) +{ + struct wiringPiNodeStruct *node ; + + node = wiringPiNewNode (pinBase, numPins) ; + + node->data0 = dataPin ; + node->data1 = clockPin ; + node->data2 = latchPin ; + node->data3 = 0 ; // Output register + node->digitalWrite = myDigitalWrite ; + +// Initialise the underlying hardware + + digitalWrite (dataPin, LOW) ; + digitalWrite (clockPin, LOW) ; + digitalWrite (latchPin, HIGH) ; + + pinMode (dataPin, OUTPUT) ; + pinMode (clockPin, OUTPUT) ; + pinMode (latchPin, OUTPUT) ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h new file mode 100644 index 00000000..4a26dc7c --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h @@ -0,0 +1,34 @@ +/* + * sr595.h: + * Extend wiringPi with the 74x595 shift registers. + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int sr595Setup (const int pinBase, const int numPins, + const int dataPin, const int clockPin, const int latchPin) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.o b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.o new file mode 100644 index 0000000000000000000000000000000000000000..c78ae47e4c011e43ccc8f804e6fb4f8cdecbcde7 GIT binary patch literal 2456 zcmbuAO>7%Q6vv<Kv~i2s8Wbc;MZ!IR5~*EzQ4=K~kjGgkMkHxO5*id*<Je2QN^D2= zT8TN(N>(aHZfTF4IdkN|r4STLT&NULE(jqwwM8I8FX;g!^WJ(!9<99+f@jUno8SE3 zo7wqTUrW!;1Oow(7J%2G*OC-q^<>Xax^5DlhSR_<v$y$Uw!)TImNL!X!>!>~cF1ha z#?01Eq*aNUt!pD=UymJpK}qlblICr8s=fDJJ^bX5@pk%L+c-A)M$F`$N0jv|lCit= zblZDB?q<%sU;^+TO#X+-pWJ`Y{4HRfd*JqdNjiSii*!BXxDPe|>eTPz7;b<o$~4<y zcd)f9>|J(+U1ix{F&W@{F#i1#zi0A;uJG1#u}-IB^7kUV80D)Y-y~xsH2K2}Uz{|K zT@^o)&d<FuP||DgBgI!lYsNm#-~eW)r(cPWuB_L~PCY)ZU(^#9ChBg>_|TZp6BqTV zu`Z9loG>O56NxFB#t1#o0w25uf!%1}Y-Bim2bTqx44!v;01l~6Y0=xklotCqWNPtS zLn&?a<_V@HZk%M=WOLZmlEKfk$r&xdw9%9nM<E8JwD5ThEr>k3BG1hr(_%L$Pje`^ zsl}#Ur4ad4v{OUyxHG6bH1Na$gzz`WLYQfgh2TUVK7}Nx<agIXs6sH@rza4Cun$)* zfl$y{hz?NeKKxZ5K9BraoTr?hyVl57ee^{i4z=p|)VQ99Qp2=2Y$vyMxoSHWWM}6t zrPy5d(#*_KdO5qyQgi7n6jVvU+R8QN?R>RTv+|X4q1Mf{WI6S1*s-g2d1KLDuyz(I z1q-(A@;udV;ylP`N1np+H{KPpHG*iwBUmJF5JdCp_qw=`-&VMq=M#mi<9@1eRsXrd zRsBy2*U*>q4AFr_^UgEk!(%@DMTMWid@{e`!(a2^-@3EuU(dMUL9D4rqw_%~xja{( z*BT`!w~n<_?bb!<Rq+7mj<xH6UdTB)(AR4<aDiSgZ`qsHRs-~WrBt%YC@EJQOP^g> zxlnU*`AyK>XseigznUvq-NFCIGmf#e6y6(`L`Ieo>(p)a-@&ukL3@{!0#PRkqFop9 zbQZ{!H=gb@*-Kc6d%r**dB!CznHQf&Mmhg$ydiRW-~Zo^pA_*4tW}fo<0?d7&R^DV zC`^^Qf6XcozKoMySJ5G+o=NK47s5N#P)x4BMDL(8X#e)bCtki6?H|R;c)5SiAoH$0 sBKT9p7pb9`cm9LsPVz<ZLf1tAePd2z@s3abJA=kQ6mT2+Rr8Mj57BIOX#fBK literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c new file mode 100755 index 00000000..6d1c1104 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c @@ -0,0 +1,3152 @@ +/* + * wiringPi: + * Arduino compatable (ish) Wiring library for the Raspberry Pi + * Copyright (c) 2012 Gordon Henderson + * Additional code for pwmSetClock by Chris Hall <chris@kchall.plus.com> + * + * Thanks to code samples from Gert Jan van Loo and the + * BCM2835 ARM Peripherals manual, however it's missing + * the clock section /grr/mutter/ + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +// Revisions: +// 19 Jul 2012: +// Moved to the LGPL +// Added an abstraction layer to the main routines to save a tiny +// bit of run-time and make the clode a little cleaner (if a little +// larger) +// Added waitForInterrupt code +// Added piHiPri code +// +// 9 Jul 2012: +// Added in support to use the /sys/class/gpio interface. +// 2 Jul 2012: +// Fixed a few more bugs to do with range-checking when in GPIO mode. +// 11 Jun 2012: +// Fixed some typos. +// Added c++ support for the .h file +// Added a new function to allow for using my "pin" numbers, or native +// GPIO pin numbers. +// Removed my busy-loop delay and replaced it with a call to delayMicroseconds +// +// 02 May 2012: +// Added in the 2 UART pins +// Change maxPins to numPins to more accurately reflect purpose + +#include <stdio.h> +#include <stdarg.h> +#include <stdint.h> +#include <stdlib.h> +#include <ctype.h> +#include <poll.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <time.h> +#include <fcntl.h> +#include <pthread.h> +#include <sys/time.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <sys/ioctl.h> +#include <sys/utsname.h> + +#include "softPwm.h" +#include "softTone.h" + +#include "wiringPi.h" + +#ifndef TRUE +#define TRUE (1==1) +#define FALSE (1==2) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +// Environment Variables + +#define ENV_DEBUG "WIRINGPI_DEBUG" +#define ENV_CODES "WIRINGPI_CODES" + + +// Mask for the bottom 64 pins which belong to the Raspberry Pi +// The others are available for the other devices + +#define PI_GPIO_MASK (0xFFFFFFC0) + +struct wiringPiNodeStruct *wiringPiNodes = NULL ; + +// BCM Magic + +#define BCM_PASSWORD 0x5A000000 + + +// The BCM2835 has 54 GPIO pins. +// BCM2835 data sheet, Page 90 onwards. +// There are 6 control registers, each control the functions of a block +// of 10 pins. +// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values +// +// 000 = GPIO Pin X is an input +// 001 = GPIO Pin X is an output +// 100 = GPIO Pin X takes alternate function 0 +// 101 = GPIO Pin X takes alternate function 1 +// 110 = GPIO Pin X takes alternate function 2 +// 111 = GPIO Pin X takes alternate function 3 +// 011 = GPIO Pin X takes alternate function 4 +// 010 = GPIO Pin X takes alternate function 5 +// +// So the 3 bits for port X are: +// X / 10 + ((X % 10) * 3) + +// Port function select bits + +#define FSEL_INPT 0b000 +#define FSEL_OUTP 0b001 +#define FSEL_ALT0 0b100 +#define FSEL_ALT1 0b101 +#define FSEL_ALT2 0b110 +#define FSEL_ALT3 0b111 +#define FSEL_ALT4 0b011 +#define FSEL_ALT5 0b010 + +// Access from ARM Running Linux +// Taken from Gert/Doms code. Some of this is not in the manual +// that I can find )-: + +#define BCM2708_PERI_BASE 0x20000000 +#define GPIO_PADS (BCM2708_PERI_BASE + 0x00100000) +#define CLOCK_BASE (BCM2708_PERI_BASE + 0x00101000) +#define GPIO_BASE (BCM2708_PERI_BASE + 0x00200000) +#define GPIO_TIMER (BCM2708_PERI_BASE + 0x0000B000) +#define GPIO_PWM (BCM2708_PERI_BASE + 0x0020C000) + +#define PAGE_SIZE (4*1024) +#define BLOCK_SIZE (4*1024) + +// PWM +// Word offsets into the PWM control region + +#define PWM_CONTROL 0 +#define PWM_STATUS 1 +#define PWM0_RANGE 4 +#define PWM0_DATA 5 +#define PWM1_RANGE 8 +#define PWM1_DATA 9 + +// Clock regsiter offsets + +#define PWMCLK_CNTL 40 +#define PWMCLK_DIV 41 + +#define PWM0_MS_MODE 0x0080 // Run in MS mode +#define PWM0_USEFIFO 0x0020 // Data from FIFO +#define PWM0_REVPOLAR 0x0010 // Reverse polarity +#define PWM0_OFFSTATE 0x0008 // Ouput Off state +#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty +#define PWM0_SERIAL 0x0002 // Run in serial mode +#define PWM0_ENABLE 0x0001 // Channel Enable + +#define PWM1_MS_MODE 0x8000 // Run in MS mode +#define PWM1_USEFIFO 0x2000 // Data from FIFO +#define PWM1_REVPOLAR 0x1000 // Reverse polarity +#define PWM1_OFFSTATE 0x0800 // Ouput Off state +#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty +#define PWM1_SERIAL 0x0200 // Run in serial mode +#define PWM1_ENABLE 0x0100 // Channel Enable + +// Timer +// Word offsets + +#define TIMER_LOAD (0x400 >> 2) +#define TIMER_VALUE (0x404 >> 2) +#define TIMER_CONTROL (0x408 >> 2) +#define TIMER_IRQ_CLR (0x40C >> 2) +#define TIMER_IRQ_RAW (0x410 >> 2) +#define TIMER_IRQ_MASK (0x414 >> 2) +#define TIMER_RELOAD (0x418 >> 2) +#define TIMER_PRE_DIV (0x41C >> 2) +#define TIMER_COUNTER (0x420 >> 2) + +// Locals to hold pointers to the hardware + +static volatile uint32_t *gpio, *gpio1; +static volatile uint32_t *pwm ; +static volatile uint32_t *clk ; +static volatile uint32_t *pads ; + +#ifdef USE_TIMER +static volatile uint32_t *timer ; +static volatile uint32_t *timerIrqRaw ; +#endif + + +// Data for use with the boardId functions. +// The order of entries here to correspond with the PI_MODEL_X +// and PI_VERSION_X defines in wiringPi.h +// Only intended for the gpio command - use at your own risk! + +const char *piModelNames [9] = +{ + "Unknown", + "Model A", + "Model B", + "Model B+", + "Compute Module", + "Model A+", + "ODROID-C1/C1+", + "ODROID-XU3/4", + "ODROID-C2", +} ; + +const char *piRevisionNames [5] = +{ + "Unknown", + "1", + "1.1", + "1.2", + "2", +} ; + +const char *piMakerNames [5] = +{ + "Unknown", + "Egoman", + "Sony", + "Qusda", + "Hardkernel", +} ; + + +// Time for easy calculations + +static uint64_t epochMilli, epochMicro ; + +// Misc + +static int wiringPiMode = WPI_MODE_UNINITIALISED ; +static volatile int pinPass = -1 ; +static pthread_mutex_t pinMutex ; + +// Debugging & Return codes + +int wiringPiDebug = FALSE ; +int wiringPiReturnCodes = FALSE ; + +// sysFds: +// Map a file descriptor from the /sys/class/gpio/gpioX/value + +static int sysFds [64] = +{ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +} ; + +// ISR Data + +static void (*isrFunctions [64])(void) ; + + +// Doing it the Arduino way with lookup tables... +// Yes, it's probably more innefficient than all the bit-twidling, but it +// does tend to make it all a bit clearer. At least to me! + +// pinToGpio: +// Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin +// Cope for 3 different board revisions here. + +static int *pinToGpio ; +static int pin_array_count; + +// Revision 1, 1.1: + +static int pinToGpioR1 [64] = +{ + 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 + 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9 + 8, 7, // SPI - CE1, CE0 wpi 10 - 11 + 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 + 14, 15, // UART - Tx, Rx wpi 15 - 16 + +// Padding: + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +} ; + +// Revision 2: + +static int pinToGpioR2 [64] = +{ + 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 + 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9 + 8, 7, // SPI - CE1, CE0 wpi 10 - 11 + 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 + 14, 15, // UART - Tx, Rx wpi 15 - 16 + 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20 + 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25 + 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29 + 0, 1, // B+ wpi 30, 31 + +// Padding: + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +} ; + + +// physToGpio: +// Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin +// Cope for 2 different board revisions here. +// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 + +static int *physToGpio ; + +static int physToGpioR1 [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + 0, -1, + 1, -1, + 4, 14, + -1, 15, + 17, 18, + 21, -1, + 22, 23, + -1, 24, + 10, -1, + 9, 25, + 11, 8, + -1, 7, // 25, 26 + + -1, -1, -1, -1, -1, // ... 31 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +} ; + +static int physToGpioR2 [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + 2, -1, + 3, -1, + 4, 14, + -1, 15, + 17, 18, + 27, -1, + 22, 23, + -1, 24, + 10, -1, + 9, 25, + 11, 8, + -1, 7, // 25, 26 + +// B+ + + 0, 1, + 5, -1, + 6, 12, + 13, -1, + 19, 16, + 26, 20, + -1, 21, + +// the P5 connector on the Rev 2 boards: + + -1, -1, + -1, -1, + -1, -1, + -1, -1, + -1, -1, + 28, 29, + 30, 31, + -1, -1, + -1, -1, + -1, -1, + -1, -1, +} ; + +// gpioToGPFSEL: +// Map a BCM_GPIO pin to it's Function Selection +// control port. (GPFSEL 0-5) +// Groups of 10 - 3 bits per Function - 30 bits per port + +static uint8_t gpioToGPFSEL [] = +{ + 0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5, +} ; + + +// gpioToShift +// Define the shift up for the 3 bits per pin in each GPFSEL port + +static uint8_t gpioToShift [] = +{ + 0,3,6,9,12,15,18,21,24,27, + 0,3,6,9,12,15,18,21,24,27, + 0,3,6,9,12,15,18,21,24,27, + 0,3,6,9,12,15,18,21,24,27, + 0,3,6,9,12,15,18,21,24,27, +} ; + + +// gpioToGPSET: +// (Word) offset to the GPIO Set registers for each GPIO pin + +static uint8_t gpioToGPSET [] = +{ + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +} ; + +// gpioToGPCLR: +// (Word) offset to the GPIO Clear registers for each GPIO pin + +static uint8_t gpioToGPCLR [] = +{ + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +} ; + + +// gpioToGPLEV: +// (Word) offset to the GPIO Input level registers for each GPIO pin + +static uint8_t gpioToGPLEV [] = +{ + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, +} ; + + +#ifdef notYetReady +// gpioToEDS +// (Word) offset to the Event Detect Status + +static uint8_t gpioToEDS [] = +{ + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, +} ; + +// gpioToREN +// (Word) offset to the Rising edge ENable register + +static uint8_t gpioToREN [] = +{ + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, + 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +} ; + +// gpioToFEN +// (Word) offset to the Falling edgde ENable register + +static uint8_t gpioToFEN [] = +{ + 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, + 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +} ; +#endif + + +// GPPUD: +// GPIO Pin pull up/down register + +#define GPPUD 37 + +// gpioToPUDCLK +// (Word) offset to the Pull Up Down Clock regsiter + +static uint8_t gpioToPUDCLK [] = +{ + 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, + 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, +} ; + + +// gpioToPwmALT +// the ALT value to put a GPIO pin into PWM mode + +static uint8_t gpioToPwmALT [] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 + 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 + 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 + FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 +} ; + + +// gpioToPwmPort +// The port value to put a GPIO pin into PWM mode + +static uint8_t gpioToPwmPort [] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 + 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 + 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 + PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 + +} ; + +// gpioToGpClkALT: +// ALT value to put a GPIO pin into GP Clock mode. +// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 +// for clocks 0 and 1 respectively, however I'll include the full +// list for completeness - maybe one day... + +#define GPIO_CLOCK_SOURCE 1 + +// gpioToGpClkALT0: + +static uint8_t gpioToGpClkALT0 [] = +{ + 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 + 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 + 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 + 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 + FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 + 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 + 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 + 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 +} ; + +// gpioToClk: +// (word) Offsets to the clock Control and Divisor register + +static uint8_t gpioToClkCon [] = +{ + -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +} ; + +static uint8_t gpioToClkDiv [] = +{ + -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 + -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 + 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 + -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 +} ; + +// +// For ODROID-C Board +// +#define ODROIDC_GPIO_MASK (0xFFFFFF80) + +#define ODROIDC_PERI_BASE 0xC1100000 +#define GPIO_REG_OFFSET 0x8000 +#define ODROID_GPIO_BASE (ODROIDC_PERI_BASE + GPIO_REG_OFFSET) + +#define GPIO_PIN_BASE 80 +#define GPIOY_PIN_START 80 +#define GPIOY_PIN_END 96 +#define GPIOX_PIN_START 97 +#define GPIOX_PIN_END 118 + +#define GPIOX_FSEL_REG_OFFSET 0x0C +#define GPIOX_OUTP_REG_OFFSET 0x0D +#define GPIOX_INP_REG_OFFSET 0x0E +#define GPIOX_PUPD_REG_OFFSET 0x3E +#define GPIOX_PUEN_REG_OFFSET 0x4C + +#define GPIOY_FSEL_REG_OFFSET 0x0F +#define GPIOY_OUTP_REG_OFFSET 0x10 +#define GPIOY_INP_REG_OFFSET 0x11 +#define GPIOY_PUPD_REG_OFFSET 0x3D +#define GPIOY_PUEN_REG_OFFSET 0x4B + +#define piAinNode0 "/sys/class/saradc/saradc_ch0" +#define piAinNode1 "/sys/class/saradc/saradc_ch1" + +static int adcFds [2] = { + -1, -1, +} ; + +// +// For ODROID-C2 Board +// +#define ODROIDC2_GPIO_MASK (0xFFFFFF00) +#define ODROIDC2_GPIO_BASE 0xC8834000 + +#define C2_GPIO_PIN_BASE 136 +#define C2_GPIOY_PIN_START (C2_GPIO_PIN_BASE + 75) +#define C2_GPIOY_PIN_END (C2_GPIO_PIN_BASE + 91) +#define C2_GPIOX_PIN_START (C2_GPIO_PIN_BASE + 92) +#define C2_GPIOX_PIN_END (C2_GPIO_PIN_BASE + 114) + +#define C2_GPIOX_FSEL_REG_OFFSET 0x118 +#define C2_GPIOX_OUTP_REG_OFFSET 0x119 +#define C2_GPIOX_INP_REG_OFFSET 0x11A +#define C2_GPIOX_PUPD_REG_OFFSET 0x13E +#define C2_GPIOX_PUEN_REG_OFFSET 0x14C + +#define C2_GPIOY_FSEL_REG_OFFSET 0x10F +#define C2_GPIOY_OUTP_REG_OFFSET 0x110 +#define C2_GPIOY_INP_REG_OFFSET 0x111 +#define C2_GPIOY_PUPD_REG_OFFSET 0x13B +#define C2_GPIOY_PUEN_REG_OFFSET 0x149 + +#define C2_piAinNode0 "/sys/class/saradc/ch0" +#define C2_piAinNode1 "/sys/class/saradc/ch1" + +// +// For ODROID-XU3/4 Board +// +#define ODROIDXU_GPIO_MASK (0xFFFFFF00) + +#define ODROIDXU_GPX_BASE 0x13400000 // GPX0,1,2,3 +#define ODROIDXU_GPA_BASE 0x14010000 // GPA0,1,2, GPB0,1,2,3,4 + +#define GPIO_X1_START 16 +#define GPIO_X1_CON_OFFSET 0x0C20 +#define GPIO_X1_DAT_OFFSET 0x0C24 +#define GPIO_X1_PUD_OFFSET 0x0C28 +#define GPIO_X1_END 23 + +#define GPIO_X2_START 24 +#define GPIO_X2_CON_OFFSET 0x0C40 +#define GPIO_X2_DAT_OFFSET 0x0C44 +#define GPIO_X2_PUD_OFFSET 0x0C48 +#define GPIO_X2_END 31 + +#define GPIO_X3_START 32 +#define GPIO_X3_CON_OFFSET 0x0C60 +#define GPIO_X3_DAT_OFFSET 0x0C64 +#define GPIO_X3_PUD_OFFSET 0x0C68 +#define GPIO_X3_END 39 + +#define GPIO_A0_START 171 +#define GPIO_A0_CON_OFFSET 0x0000 +#define GPIO_A0_DAT_OFFSET 0x0004 +#define GPIO_A0_PUD_OFFSET 0x0008 +#define GPIO_A0_END 178 + +#define GPIO_A2_START 185 +#define GPIO_A2_CON_OFFSET 0x0040 +#define GPIO_A2_DAT_OFFSET 0x0044 +#define GPIO_A2_PUD_OFFSET 0x0048 +#define GPIO_A2_END 192 + +#define GPIO_B3_START 207 +#define GPIO_B3_CON_OFFSET 0x00C0 +#define GPIO_B3_DAT_OFFSET 0x00C4 +#define GPIO_B3_PUD_OFFSET 0x00C8 +#define GPIO_B3_END 214 + +static char *piAinNode0_xu; +static char *piAinNode1_xu; + +static int piModel = PI_MODEL_UNKNOWN; + +static int sysFdData [64] = { + -1, -1, -1, -1, -1, -1, -1, -1, // 0...7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8...15 + -1, -1, -1, -1, -1, -1, -1, -1, // 16...23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24...31 + -1, -1, -1, -1, -1, -1, -1, -1, // 32...39 + -1, -1, -1, -1, -1, -1, -1, -1, // 40...47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48...55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56...63 +}; + +static int sysFdIrqType [64] = { + -1, -1, -1, -1, -1, -1, -1, -1, // 0...7 + -1, -1, -1, -1, -1, -1, -1, -1, // 8...15 + -1, -1, -1, -1, -1, -1, -1, -1, // 16...23 + -1, -1, -1, -1, -1, -1, -1, -1, // 24...31 + -1, -1, -1, -1, -1, -1, -1, -1, // 32...39 + -1, -1, -1, -1, -1, -1, -1, -1, // 40...47 + -1, -1, -1, -1, -1, -1, -1, -1, // 48...55 + -1, -1, -1, -1, -1, -1, -1, -1, // 56...63 +}; + +static int gpioToPin(int gpio) +{ + int pin; + + if (pinToGpio == NULL) { + (void)wiringPiFailure (WPI_FATAL, "%s: wiringPi is not initialized yet\n", __func__); + return -1; + } + + for (pin = 0; pin < pin_array_count; ++pin) { + if (pinToGpio[pin] == gpio) + return pin; + } + + (void)wiringPiFailure (WPI_FATAL, "%s: could not find the pin of %d gpio\n", __func__, gpio); + return -1; +} + +// +// sysfs FD offset +// +static int gpioFdOffsetXU34(int pin) +{ + int offset = -1; + + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: offset = (pin - GPIO_X1_START) + 0; break; + case GPIO_X2_START...GPIO_X2_END: offset = (pin - GPIO_X2_START) + 8; break; + case GPIO_X3_START...GPIO_X3_END: offset = (pin - GPIO_X3_START) + 16; break; + case GPIO_A0_START...GPIO_A0_END: offset = (pin - GPIO_A0_START) + 24; break; + case GPIO_A2_START...GPIO_A2_END: offset = (pin - GPIO_A2_START) + 32; break; + case GPIO_B3_START...GPIO_B3_END: offset = (pin - GPIO_B3_START) + 40; break; + default : offset = -1; break; + } + return offset; +} + +// +// offset to the GPIO Set regsiter +// +static int gpioToGPSETReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDXU_34) { + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: + return (GPIO_X1_DAT_OFFSET >> 2); + case GPIO_X2_START...GPIO_X2_END: + return (GPIO_X2_DAT_OFFSET >> 2); + case GPIO_X3_START...GPIO_X3_END: + return (GPIO_X3_DAT_OFFSET >> 2); + case GPIO_A0_START...GPIO_A0_END: + return (GPIO_A0_DAT_OFFSET >> 2); + case GPIO_A2_START...GPIO_A2_END: + return (GPIO_A2_DAT_OFFSET >> 2); + case GPIO_B3_START...GPIO_B3_END: + return (GPIO_B3_DAT_OFFSET >> 2); + default: + break; + } + } + else if (piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return C2_GPIOX_OUTP_REG_OFFSET; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return C2_GPIOY_OUTP_REG_OFFSET; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return GPIOX_OUTP_REG_OFFSET; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return GPIOY_OUTP_REG_OFFSET; + } + + return -1; +} + +// +// offset to the GPIO Input regsiter +// +static int gpioToGPLEVReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDXU_34) { + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: + return (GPIO_X1_DAT_OFFSET >> 2); + case GPIO_X2_START...GPIO_X2_END: + return (GPIO_X2_DAT_OFFSET >> 2); + case GPIO_X3_START...GPIO_X3_END: + return (GPIO_X3_DAT_OFFSET >> 2); + case GPIO_A0_START...GPIO_A0_END: + return (GPIO_A0_DAT_OFFSET >> 2); + case GPIO_A2_START...GPIO_A2_END: + return (GPIO_A2_DAT_OFFSET >> 2); + case GPIO_B3_START...GPIO_B3_END: + return (GPIO_B3_DAT_OFFSET >> 2); + default: + break; + } + } + else if (piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return C2_GPIOX_INP_REG_OFFSET; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return C2_GPIOY_INP_REG_OFFSET; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return GPIOX_INP_REG_OFFSET; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return GPIOY_INP_REG_OFFSET; + } + + return -1; +} + +// +// offset to the GPIO Pull up/down enable regsiter +// +static int gpioToPUENReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return C2_GPIOX_PUEN_REG_OFFSET; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return C2_GPIOY_PUEN_REG_OFFSET; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return GPIOX_PUEN_REG_OFFSET; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return GPIOY_PUEN_REG_OFFSET; + } + + return -1; +} + +// +// offset to the GPIO Pull up/down regsiter +// +static int gpioToPUPDReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDXU_34) { + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: + return (GPIO_X1_PUD_OFFSET >> 2); + case GPIO_X2_START...GPIO_X2_END: + return (GPIO_X2_PUD_OFFSET >> 2); + case GPIO_X3_START...GPIO_X3_END: + return (GPIO_X3_PUD_OFFSET >> 2); + case GPIO_A0_START...GPIO_A0_END: + return (GPIO_A0_PUD_OFFSET >> 2); + case GPIO_A2_START...GPIO_A2_END: + return (GPIO_A2_PUD_OFFSET >> 2); + case GPIO_B3_START...GPIO_B3_END: + return (GPIO_B3_PUD_OFFSET >> 2); + default: + break; + } + } + else if (piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return C2_GPIOX_PUPD_REG_OFFSET; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return C2_GPIOY_PUPD_REG_OFFSET; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return GPIOX_PUPD_REG_OFFSET; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return GPIOY_PUPD_REG_OFFSET; + } + + return -1; +} + +// +// offset to the GPIO bit +// +static int gpioToShiftReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDXU_34) { + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: + return (pin - GPIO_X1_START); + case GPIO_X2_START...GPIO_X2_END: + return (pin - GPIO_X2_START); + case GPIO_X3_START...GPIO_X3_END: + return (pin - GPIO_X3_START); + case GPIO_A0_START...GPIO_A0_END: + return (pin - GPIO_A0_START); + case GPIO_A2_START...GPIO_A2_END: + return (pin - GPIO_A2_START); + case GPIO_B3_START...GPIO_B3_END: + return (pin - GPIO_B3_START); + default: + break; + } + } + else if (piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return pin - C2_GPIOX_PIN_START; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return pin - C2_GPIOY_PIN_START; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return pin - GPIOX_PIN_START; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return pin - GPIOY_PIN_START; + } + + return -1; +} + +// +// offset to the GPIO Function register +// +static int gpioToGPFSELReg (int pin) +{ + if(piModel == PI_MODEL_ODROIDXU_34) { + switch(pin) { + case GPIO_X1_START...GPIO_X1_END: + return (GPIO_X1_CON_OFFSET >> 2); + case GPIO_X2_START...GPIO_X2_END: + return (GPIO_X2_CON_OFFSET >> 2); + case GPIO_X3_START...GPIO_X3_END: + return (GPIO_X3_CON_OFFSET >> 2); + case GPIO_A0_START...GPIO_A0_END: + return (GPIO_A0_CON_OFFSET >> 2); + case GPIO_A2_START...GPIO_A2_END: + return (GPIO_A2_CON_OFFSET >> 2); + case GPIO_B3_START...GPIO_B3_END: + return (GPIO_B3_CON_OFFSET >> 2); + default: + break; + } + } + else if (piModel == PI_MODEL_ODROIDC2) { + if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END) + return C2_GPIOX_FSEL_REG_OFFSET; + if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END) + return C2_GPIOY_FSEL_REG_OFFSET; + } + else { + if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END) + return GPIOX_FSEL_REG_OFFSET; + if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END) + return GPIOY_FSEL_REG_OFFSET; + } + + return -1; +} + +// +// pinToGpio: +// Take a Wiring pin (0 through X) and re-map it to the ODROID_GPIO pin +// +static int pinToGpioOdroidC [64] = { + 88, 87, 116, 115, 104, 102, 103, 83, // 0..7 + -1, -1, 117, 118, 107, 106, 105, -1, // 8..16 + -1, -1, -1, -1, -1, 101, 100, 108, // 16..23 + 97, -1, 99, 98, -1, -1, -1, -1, // 24..31 +// Padding: + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +}; + +// +// physToGpio: +// Take a physical pin (1 through 40) and re-map it to the ODROID_GPIO pin +// +static int physToGpioOdroidC [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + -1, -1, + -1, -1, + 83, -1, + -1, -1, + 88, 87, + 116, -1, + 115, 104, + -1, 102, + 107, -1, + 106, 103, + 105, 117, + -1, 118, // 25, 26 + + -1, -1, + 101, -1, + 100, 99, + 108, -1, + 97, 98, + -1, -1, + -1, -1, // 39, 40 + +// Not used + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, +} ; + +// +// pinToGpio: +// Take a Wiring pin (0 through X) and re-map it to the ODROIDC2_GPIO pin +// +static int pinToGpioOdroidC2_Rev1_1 [64] = { + 247, 238, 239, 237, 236, 233, 231, 249, // 0..7 + -1, -1, 229, 225, 235, 232, 230, -1, // 8..15 + -1, -1, -1, -1, -1, 228, 219, 234, // 16..23 + 214, -1, 224, 218, -1, -1, -1, -1, // 24..31 +// Padding: + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +}; + + +static int pinToGpioOdroidC2_Rev1_0 [64] = { + 219, 218, 247, -1, 235, 233, 234, 214, // 0..7 + -1, -1, 248, 249, 238, 237, 236, -1, // 8..15 + -1, -1, -1, -1, -1, 232, 231, 239, // 16..23 + 228, -1, 230, 229, -1, -1, -1, -1, // 24..31 +// Padding: + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 +}; + +// +// physToGpio: +// Take a physical pin (1 through 40) and re-map it to the ODROIDC2_GPIO pin +// +static int physToGpioOdroidC2_Rev1_1 [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + -1, -1, + -1, -1, + 249, -1, + -1, -1, + 247, 238, + 239, -1, + 237, 236, + -1, 233, + 235, -1, + 232, 231, + 230, 229, + -1, 225, // 25, 26 + + -1, -1, + 228, -1, + 219, 224, + 234, -1, + 214, 218, + -1, -1, + -1, -1, // 39, 40 + +// Not used + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, +} ; + + +static int physToGpioOdroidC2_Rev1_0 [64] = +{ + -1, // 0 + -1, -1, // 1, 2 + -1, -1, + -1, -1, + 214, -1, + -1, -1, + 219, 218, + 247, -1, + -1, 235, + -1, 233, + 238, -1, + 237, 234, + 236, 248, + -1, 249, // 25, 26 + + -1, -1, + 232, -1, + 231, 230, + 239, -1, + 228, 229, + -1, -1, + -1, -1, // 39, 40 + +// Not used + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, +} ; + +// +// pinToGpio: +// Take a Wiring pin (0 through X) and re-map it to the ODROIDXU_GPIO pin +// +static int pinToGpioOdroidXU [64] = { + 174, 173, // 0 | 1 : GPA0.3(UART_0.CTSN), GPA0.2(UART_0.RTSN) + 21, 22, // 2 | 3 : GPX1.5, GPX1.6 + 19, 23, // 4 | 5 : GPX1.3, GPX1.7 + 24, 18, // 6 | 7 : GPX2.0, GPX1.2 + + 209, 210, // 8 | 9 : GPB3.2(I2C_1.SDA), GPB3.3(I2C_1.SCL) + 190, 25, // 10 | 11 : GPA2.5(SPI_1.CSN), GPX2.1 + 192, 191, // 12 | 13 : GPA2.7(SPI_1.MOSI), GPA2.6(SPI_1.MISO) + 189, 172, // 14 | 15 : GPA2.4(SPI_1.SCLK), GPA0.1(UART_0.TXD) + 171, -1, // 16 | 17 : GPA0.0(UART_0.RXD), + -1, -1, // 18 | 19 + -1, 28, // 20 | 21 : , GPX2.4 + 30, 31, // 22 | 23 : GPX2.6, GPX2.7 + -1, -1, // 24 | 25 PWR_ON(INPUT), ADC_0.AIN0 + 29, 33, // 26 | 27 : GPX2.5, GPX3.1 + -1, -1, // 28 | 29 : REF1.8V OUT, ADC_0.AIN3 + 187, 188, // 30 | 31 : GPA2.2(I2C_5.SDA), GPA2.3(I2C_5.SCL) + + // Padding: + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32...47 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 48...63 +}; + +// +// physToGpio: +// Take a physical pin (1 through 40) and re-map it to the ODROIDXU_GPIO pin +// +static int physToGpioOdroidXU [64] = +{ + -1, // 0 + -1, -1, // 1 | 2 : 3.3V, 5.0V + 209, -1, // 3 | 4 : GPB3.2(I2C_1.SDA), 5.0V + 210, -1, // 5 | 6 : GPB3.3(I2C_1.SCL), GND + 18, 172, // 7 | 8 : GPX1.2, GPA0.1(UART_0.TXD) + -1, 171, // 9 | 10 : GND, GPA0.0(UART_0.RXD) + 174, 173, // 11 | 12 : GPA0.3(UART_0.CTSN), GPA0.2(UART_0.RTSN) + 21, -1, // 13 | 14 : GPX1.5, GND + 22, 19, // 15 | 16 : GPX1.6, GPX1.3 + -1, 23, // 17 | 18 : 3.3V, GPX1.7 + 192, -1, // 19 | 20 : GPA2.7(SPI_1.MOSI), GND + 191, 24, // 21 | 22 : GPA2.6(SPI_1.MISO), GPX2.0 + 189, 190, // 23 | 24 : GPA2.4(SPI_1.SCLK), GPA2.5(SPI_1.CSN) + -1, 25, // 25 | 26 : GND, GPX2.1 + 187, 188, // 27 | 28 : GPA2.2(I2C_5.SDA), GPA2.4(I2C_5.SCL) + 28, -1, // 29 | 30 : GPX2.4, GND + 30, 29, // 31 | 32 : GPX2.6, GPX2.5 + 31, -1, // 33 | 34 : GPX2.7, GND + -1, 33, // 35 | 36 : PWR_ON(INPUT), GPX3.1 + -1, -1, // 37 | 38 : ADC_0.AIN0, 1.8V REF OUT + -1, -1, // 39 | 40 : GND, AADC_0.AIN3 + + // Not used + -1, -1, -1, -1, -1, -1, -1, -1, // 41...48 + -1, -1, -1, -1, -1, -1, -1, -1, // 49...56 + -1, -1, -1, -1, -1, -1, -1 // 57...63 +} ; + + +/* + * Functions + ********************************************************************************* + */ + + +/* + * wiringPiFailure: + * Fail. Or not. + ********************************************************************************* + */ + +int wiringPiFailure (int fatal, const char *message, ...) +{ + va_list argp ; + char buffer [1024] ; + + if (!fatal && wiringPiReturnCodes) + return -1 ; + + va_start (argp, message) ; + vsnprintf (buffer, 1023, message, argp) ; + va_end (argp) ; + + fprintf (stderr, "%s", buffer) ; + exit (EXIT_FAILURE) ; + + return 0 ; +} + +const char wpi_mode_str[4][20] = { + "WPI_MODE_PINS", + "WPI_MODE_GPIO", + "WPI_MODE_GPIO_SYS", + "WPI_MODE_PHYS", +}; + +void wiringPiGpioCheck (const char *call_func, int origPin, int pin) +{ + if (wiringPiMode == WPI_MODE_PINS || wiringPiMode == WPI_MODE_PHYS) + { + // maybe pin is not gpio. + if ( pin < 0 ) { + (void)wiringPiFailure (WPI_FATAL, + "\n**************** %s ****************\n" \ + "\nCall Function = %s, wiringPiMode = %s\n" \ + "\nError gpio control (OrigPin = %d, pin = %d)\n\n", + __func__, call_func, wpi_mode_str[wiringPiMode], + origPin, pin); + } + } + else { + int i; + for(i = 0; i < 64; i++) { + if (origPin == pinToGpio[i]) break; + } + if (i == 64) { + (void)wiringPiFailure (WPI_FATAL, + "\n**************** %s ****************\n" \ + "\nCall Function = %s, wiringPiMode = %s\n" \ + "\nCannot found gpio pin! (OrigPin = %d)\n\n", + __func__, call_func, wpi_mode_str[wiringPiMode], + origPin); + } + } +} + +/* + * piBoardRev: + * Return a number representing the hardware revision of the board. + * + * Revision 1 really means the early Model B's. + * Revision 2 is everything else - it covers the B, B+ and CM. + * + * Seems there are some boards with 0000 in them (mistake in manufacture) + * So the distinction between boards that I can see is: + * 0000 - Error + * 0001 - Not used + * 0002 - Model B, Rev 1, 256MB, Egoman + * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed. + * 0004 - Model B, Rev 2, 256MB, Sony + * 0005 - Model B, Rev 2, 256MB, Qisda + * 0006 - Model B, Rev 2, 256MB, Egoman + * 0007 - Model A, Rev 2, 256MB, Egoman + * 0008 - Model A, Rev 2, 256MB, Sony + * 0009 - Model A, Rev 2, 256MB, Qisda + * 000d - Model B, Rev 2, 512MB, Egoman + * 000e - Model B, Rev 2, 512MB, Sony + * 000f - Model B, Rev 2, 512MB, Qisda + * 0010 - Model B+, Rev 1.2, 512MB, Sony + * 0011 - Pi CM, Rev 1.2, 512MB, Sony + * 0012 - Model A+ Rev 1.2, 256MB, Sony + * + * added : + * 000a - Model ODROID C1/C1+, Rev 1.0, 1024M, Hardkernel + * added : + * 0100 - Model ODROID XU3/4, Rev 1.0, 2048M, Hardkernel + * added : + * 02xx - Model ODROID C2, 2048M, Hardkernel + * Rev 1.0 : /sys/class/odroid/boardrev value is 0 (Dev board) + * Rev 1.1 : /sys/class/odroid/boardrev value is 1 (Mass board) + * + * A small thorn is the olde style overvolting - that will add in + * 1000000 + * + * The Pi compute module has an revision of 0011 - since we only check the + * last digit, then it's 1, therefore it'll default to not 2 or 3 for a + * Rev 1, so will appear as a Rev 2. This is fine for the most part, but + * we'll properly detect the Compute Module later and adjust accordingly. + * + ********************************************************************************* + */ + +static void piBoardRevOops (const char *why) +{ + fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ; + fprintf (stderr, " -> %s\n", why) ; + fprintf (stderr, " -> You may want to check:\n") ; + fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; + exit (EXIT_FAILURE) ; +} + +int piBoardRev (void) +{ + FILE *cpuFd ; + char line [120] ; + char *c ; + static int boardRev = -1 ; + + if (boardRev != -1) // No point checking twice + return boardRev ; + + if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) + piBoardRevOops ("Unable to open /proc/cpuinfo") ; + + while (fgets (line, 120, cpuFd) != NULL) + if (strncmp (line, "Revision", 8) == 0) + break ; + + fclose (cpuFd) ; + + if (strncmp (line, "Revision", 8) != 0) + piBoardRevOops ("No \"Revision\" line") ; + +// Chomp trailing CR/NL + + for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) + *c = 0 ; + + if (wiringPiDebug) + printf ("piboardRev: Revision string: %s\n", line) ; + +// Scan to first digit + + for (c = line ; *c ; ++c) + if (isdigit (*c)) + break ; + + if (!isdigit (*c)) + piBoardRevOops ("No numeric revision string") ; + +// Make sure its long enough + + if (strlen (c) < 4) + piBoardRevOops ("Bogus \"Revision\" line (too small)") ; + +// If you have overvolted the Pi, then it appears that the revision +// has 100000 added to it! +// The actual condition for it being set is: +// (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0 + + if (wiringPiDebug) + if (strlen (c) != 4) + printf ("piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0\n") ; + +// Isolate last 4 characters: + + c = c + strlen (c) - 4 ; + + if (wiringPiDebug) + printf ("piboardRev: last4Chars are: \"%s\"\n", c) ; + + if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0) || + (strcmp (c, "000a") == 0) || (strcmp (c, "0100") == 0) ) + boardRev = 1; + else + boardRev = 2; + + if (strncmp (c, "02", 2) == 0) { + int fd = 0; + char buf[2]; + + if ((fd = open ("/sys/class/odroid/boardrev", O_RDONLY)) < 0) { + printf ("ERROR : file not found.(boardrev)\n"); + boardRev = 1; + } + else { + read (fd, buf, sizeof(buf)); + close(fd); + boardRev = atoi(buf) + 1; + } + } + + if (wiringPiDebug) + printf ("piBoardRev: Returning revision: %d\n", boardRev) ; + + return boardRev ; +} + + +/* + * piBoardId: + * Do more digging into the board revision string as above, but return + * as much details as we can. + * This is undocumented and really only intended for the GPIO command. + * Use at your own risk! + ********************************************************************************* + */ + +void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) +{ + FILE *cpuFd ; + char line [120] ; + char *c ; + + (void)piBoardRev () ; // Call this first to make sure all's OK. Don't care about the result. + + if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) + piBoardRevOops ("Unable to open /proc/cpuinfo") ; + + while (fgets (line, 120, cpuFd) != NULL) + if (strncmp (line, "Revision", 8) == 0) + break ; + + fclose (cpuFd) ; + + if (strncmp (line, "Revision", 8) != 0) + piBoardRevOops ("No \"Revision\" line") ; + +// Chomp trailing CR/NL + + for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) + *c = 0 ; + + if (wiringPiDebug) + printf ("piboardId: Revision string: %s\n", line) ; + +// Scan to first digit + + for (c = line ; *c ; ++c) + if (isdigit (*c)) + break ; + +// Make sure its long enough + + if (strlen (c) < 4) + piBoardRevOops ("Bogus \"Revision\" line") ; + +// If longer than 4, we'll assume it's been overvolted + + *overVolted = strlen (c) > 4 ; + +// Extract last 4 characters: + + c = c + strlen (c) - 4 ; + +// Fill out the replys as appropriate + + /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } + else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; } + else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 256 ; *maker = PI_MAKER_QISDA ; } + else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_2 ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; } + else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_2 ; *mem = 256 ; *maker = PI_MAKER_SONY ; } + else if (strcmp (c, "000a") == 0) { + *model = PI_MODEL_ODROIDC; *rev = PI_VERSION_1; *mem = 1024; *maker = PI_MAKER_HARDKERNEL; + } + else if (strcmp (c, "0100") == 0) { + *model = PI_MODEL_ODROIDXU_34; *rev = PI_VERSION_1; *mem = 2048; *maker = PI_MAKER_HARDKERNEL; + } + else if (strncmp (c, "02", 2) == 0) { + *model = PI_MODEL_ODROIDC2; *mem = 2048; *maker = PI_MAKER_HARDKERNEL; + *rev = piBoardRev (); + } + else { + *model = 0; *rev = 0; *mem = 0; *maker = 0 ; + } + piModel = *model; +} + + +/* + * wpiPinToGpio: + * Translate a wiringPi Pin number to native GPIO pin number. + * Provided for external support. + ********************************************************************************* + */ + +int wpiPinToGpio (int wpiPin) +{ + return pinToGpio [wpiPin & 63] ; +} + + +/* + * physPinToGpio: + * Translate a physical Pin number to native GPIO pin number. + * Provided for external support. + ********************************************************************************* + */ + +int physPinToGpio (int physPin) +{ + return physToGpio [physPin & 63] ; +} + + +/* + * setPadDrive: + * Set the PAD driver value + ********************************************************************************* + */ + +void setPadDrive (int group, int value) +{ + uint32_t wrVal ; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) + { + if ((group < 0) || (group > 2)) + return ; + + wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; + *(pads + group + 11) = wrVal ; + + if (wiringPiDebug) + { + printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; + printf ("Read : %08X\n", *(pads + group + 11)) ; + } + } +} + + +/* + * getAlt: + * Returns the ALT bits for a given port. Only really of-use + * for the gpio readall command (I think) + ********************************************************************************* + */ + +int getAlt (int pin) +{ + int fSel, shift, alt ; + + if ( piModel == PI_MODEL_ODROIDC ) + pin &= 0x7F; + else if( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 ) + pin &= 0xFF; + else + pin &= 63 ; + + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return 0 ; + + if ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) { + + if(pin < 0) return 2; // ALT + + return (*(gpio + gpioToGPFSELReg(pin)) & (1 << gpioToShiftReg(pin))) ? 0 : 1; + } + else if ( piModel == PI_MODEL_ODROIDXU_34 ) { + + if(pin < 0) return 2; // ALT + + shift = (gpioToShiftReg(pin) * 4); + + if(pin < 100) // GPX0,1,2,3 + fSel = (*(gpio + gpioToGPFSELReg(pin)) & (0xF << shift)); + else // GPA0,1,2, GPB0,1,2,3,4 + fSel = (*(gpio1 + gpioToGPFSELReg(pin)) & (0xF << shift)); + + if(fSel & (0xE << shift)) return 2; + + return (fSel & (0x1 << shift)) ? 1 : 0; + } + else { + fSel = gpioToGPFSEL [pin] ; + shift = gpioToShift [pin] ; + + alt = (*(gpio + fSel) >> shift) & 7 ; + + return alt ; + } +} + + +/* + * pwmSetMode: + * Select the native "balanced" mode, or standard mark:space mode + ********************************************************************************* + */ + +void pwmSetMode (int mode) +{ + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) + { + if (mode == PWM_MODE_MS) + *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; + else + *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; + } +} + + +/* + * pwmSetRange: + * Set the PWM range register. We set both range registers to the same + * value. If you want different in your own code, then write your own. + ********************************************************************************* + */ + +void pwmSetRange (unsigned int range) +{ + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) + { + *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; + *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; + } +} + + +/* + * pwmSetClock: + * Set/Change the PWM clock. Originally my code, but changed + * (for the better!) by Chris Hall, <chris@kchall.plus.com> + * after further study of the manual and testing with a 'scope + ********************************************************************************* + */ + +void pwmSetClock (int divisor) +{ + uint32_t pwm_control ; + divisor &= 4095 ; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) + { + if (wiringPiDebug) + printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)); + + pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL + +// We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY +// stays high. + + *(pwm + PWM_CONTROL) = 0 ; // Stop PWM + +// Stop PWM clock before changing divisor. The delay after this does need to +// this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY +// flag is not working properly in balanced mode. Without the delay when DIV is +// adjusted the clock sometimes switches to very slow, once slow further DIV +// adjustments do nothing and it's difficult to get out of this mode. + + *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock + delayMicroseconds (110) ; // prevents clock going sloooow + + while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY + delayMicroseconds (1) ; + + *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; + + *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock + *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL + + if (wiringPiDebug) + printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)); + } +} + + +/* + * gpioClockSet: + * Set the freuency on a GPIO clock pin + ********************************************************************************* + */ + +void gpioClockSet (int pin, int freq) +{ + int divi, divr, divf ; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + pin &= 63 ; + + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + divi = 19200000 / freq ; + divr = 19200000 % freq ; + divf = (int)((double)divr * 4096.0 / 19200000.0) ; + + if (divi > 4095) + divi = 4095 ; + + *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock + while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait + ; + + *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers + *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock +} + + +/* + * wiringPiFindNode: + * Locate our device node + ********************************************************************************* + */ + +struct wiringPiNodeStruct *wiringPiFindNode (int pin) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + + while (node != NULL) + if ((pin >= node->pinBase) && (pin <= node->pinMax)) + return node ; + else + node = node->next ; + + return NULL ; +} + + +/* + * wiringPiNewNode: + * Create a new GPIO node into the wiringPi handling system + ********************************************************************************* + */ + +static void pinModeDummy (struct wiringPiNodeStruct *node, int pin, int mode) { return ; } +static void pullUpDnControlDummy (struct wiringPiNodeStruct *node, int pin, int pud) { return ; } +static int digitalReadDummy (struct wiringPiNodeStruct *node, int pin) { return LOW ; } +static void digitalWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } +static void pwmWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } +static int analogReadDummy (struct wiringPiNodeStruct *node, int pin) { return 0 ; } +static void analogWriteDummy (struct wiringPiNodeStruct *node, int pin, int value) { return ; } + +struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) +{ + int pin ; + struct wiringPiNodeStruct *node ; + + if ( piModel == PI_MODEL_ODROIDC ) { + // Minimum pin base is 128 + if (pinBase < 128) + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 128\n", pinBase) ; + } + else if ( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 ) { + // Minimum pin base is 256 + if (pinBase < 256) + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 256\n", pinBase) ; + } + else { + // Minimum pin base is 64 + if (pinBase < 64) + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ; + } + +// Check all pins in-case there is overlap: + for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin) + if (wiringPiFindNode (pin) != NULL) + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; + + node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros + if (node == NULL) + (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; + + node->pinBase = pinBase ; + node->pinMax = pinBase + numPins - 1 ; + node->pinMode = pinModeDummy ; + node->pullUpDnControl = pullUpDnControlDummy ; + node->digitalRead = digitalReadDummy ; + node->digitalWrite = digitalWriteDummy ; + node->pwmWrite = pwmWriteDummy ; + node->analogRead = analogReadDummy ; + node->analogWrite = analogWriteDummy ; + node->next = wiringPiNodes ; + wiringPiNodes = node ; + + return node ; +} + + +#ifdef notYetReady +/* + * pinED01: + * pinED10: + * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0 + * Pin must already be in input mode with appropriate pull up/downs set. + ********************************************************************************* + */ + +void pinEnableED01Pi (int pin) +{ + pin = pinToGpio [pin & 63] ; +} +#endif + + +/* + ********************************************************************************* + * Core Functions + ********************************************************************************* + */ + +/* + * pinModeAlt: + * This is an un-documented special to let you set any pin to any mode + ********************************************************************************* + */ + +void pinModeAlt (int pin, int mode) +{ + int fSel, shift ; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((pin & PI_GPIO_MASK) == 0) // On-board pin + { + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + fSel = gpioToGPFSEL [pin] ; + shift = gpioToShift [pin] ; + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; + } +} + + +/* + * pinMode: + * Sets the mode of a pin to be input, output or PWM output + ********************************************************************************* + */ + +void pinMode (int pin, int mode) +{ + int fSel, shift, alt ; + struct wiringPiNodeStruct *node = wiringPiNodes ; + int origPin = pin ; + unsigned int gpio_mask = PI_GPIO_MASK; + + if ( piModel == PI_MODEL_ODROIDC ) gpio_mask = ODROIDC_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDC2 ) gpio_mask = ODROIDC2_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDXU_34 ) gpio_mask = ODROIDXU_GPIO_MASK; + + if ((pin & gpio_mask) == 0) // On-board pin + { + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + wiringPiGpioCheck (__func__, origPin, pin); + + softPwmStop (origPin) ; + softToneStop (origPin) ; + + fSel = gpioToGPFSEL [pin] ; + shift = gpioToShift [pin] ; + + if (mode == INPUT) { + if ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) + *(gpio + gpioToGPFSELReg(pin)) = (*(gpio + gpioToGPFSELReg(pin)) | (1 << gpioToShiftReg(pin))); + else if ( piModel == PI_MODEL_ODROIDXU_34 ) { + shift = (gpioToShiftReg(pin) * 4); + if(pin < 100) + *(gpio + gpioToGPFSELReg(pin)) &= ~(0xF << shift); + else + *(gpio1 + gpioToGPFSELReg(pin)) &= ~(0xF << shift); + } + else + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)); // Sets bits to zero = input + } + else if (mode == OUTPUT) { + if ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) + *(gpio + gpioToGPFSELReg(pin)) = (*(gpio + gpioToGPFSELReg(pin)) & ~(1 << gpioToShiftReg(pin))); + else if ( piModel == PI_MODEL_ODROIDXU_34 ) { + shift = (gpioToShiftReg(pin) * 4); + if(pin < 100) { + *(gpio + gpioToGPFSELReg(pin)) &= ~(0xF << shift); + *(gpio + gpioToGPFSELReg(pin)) |= (0x1 << shift); + } + else { + *(gpio1 + gpioToGPFSELReg(pin)) &= ~(0xF << shift); + *(gpio1 + gpioToGPFSELReg(pin)) |= (0x1 << shift); + } + } + else + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift); + } + else if (mode == SOFT_PWM_OUTPUT) { + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) + softPwmCreate (pin, 0, 100); + else + softPwmCreate (origPin, 0, 100); + } + else if (mode == SOFT_TONE_OUTPUT) { + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) + softToneCreate (pin); + else + softToneCreate (origPin); + } + else if (mode == PWM_TONE_OUTPUT) + { + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) + return; + + pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode + pwmSetMode (PWM_MODE_MS) ; + } + else if (mode == PWM_OUTPUT) + { + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) + return; + + if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin + return ; + +// Set pin to PWM mode + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; + delayMicroseconds (110) ; // See comments in pwmSetClockWPi + + pwmSetMode (PWM_MODE_BAL) ; // Pi default mode + pwmSetRange (1024) ; // Default range of 1024 + pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM + } + else if (mode == GPIO_CLOCK) + { + if (piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) + return; + + if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin + return ; + +// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz + + *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; + delayMicroseconds (110) ; + gpioClockSet (pin, 100000) ; + } + } + else + { + if ((node = wiringPiFindNode (pin)) != NULL) + node->pinMode (node, pin, mode) ; + return ; + } +} + + +/* + * pullUpDownCtrl: + * Control the internal pull-up/down resistors on a GPIO pin + * The Arduino only has pull-ups and these are enabled by writing 1 + * to a port when in input mode - this paradigm doesn't quite apply + * here though. + ********************************************************************************* + */ + +void pullUpDnControl (int pin, int pud) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + unsigned int gpio_mask = PI_GPIO_MASK; + int origPin = pin; + + if ( piModel == PI_MODEL_ODROIDC ) gpio_mask = ODROIDC_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDC2 ) gpio_mask = ODROIDC2_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDXU_34 ) gpio_mask = ODROIDXU_GPIO_MASK; + + if ((pin & gpio_mask) == 0) // On-Board Pin + { + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + wiringPiGpioCheck (__func__, origPin, pin); + + if( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) { + + if(pud) { + // Enable Pull/Pull-down resister + *(gpio + gpioToPUENReg(pin)) = (*(gpio + gpioToPUENReg(pin)) | (1 << gpioToShiftReg(pin))); + + if(pud == PUD_UP) + *(gpio + gpioToPUPDReg(pin)) = (*(gpio + gpioToPUPDReg(pin)) | (1 << gpioToShiftReg(pin))); + else + *(gpio + gpioToPUPDReg(pin)) = (*(gpio + gpioToPUPDReg(pin)) & ~(1 << gpioToShiftReg(pin))); + } + else // Disable Pull/Pull-down resister + *(gpio + gpioToPUENReg(pin)) = (*(gpio + gpioToPUENReg(pin)) & ~(1 << gpioToShiftReg(pin))); + } + else if ( piModel == PI_MODEL_ODROIDXU_34) { + int shift = 0; + + shift = (gpioToShiftReg(pin) * 2); + + if(pud) { + if(pin < 100) { + *(gpio + gpioToPUPDReg(pin)) &= ~(0x3 << shift); + if(pud == PUD_UP) + *(gpio + gpioToPUPDReg(pin)) |= (0x3 << shift); + else + *(gpio + gpioToPUPDReg(pin)) |= (0x1 << shift); + } + else { + *(gpio1 + gpioToPUPDReg(pin)) &= ~(0x3 << shift); + if(pud == PUD_UP) + *(gpio1 + gpioToPUPDReg(pin)) |= (0x3 << shift); + else + *(gpio1 + gpioToPUPDReg(pin)) |= (0x1 << shift); + } + } + else { + // Disable Pull/Pull-down resister + if(pin < 100) + *(gpio + gpioToPUPDReg(pin)) &= ~(0x3 << shift); + else + *(gpio1 + gpioToPUPDReg(pin)) &= ~(0x3 << shift); + } + } + else { + *(gpio + GPPUD) = pud & 3; delayMicroseconds (5) ; + *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31); delayMicroseconds (5) ; + + *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ; + *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ; + } + } + else // Extension module + { + if ((node = wiringPiFindNode (pin)) != NULL) + node->pullUpDnControl (node, pin, pud) ; + return ; + } +} + + +/* + * digitalRead: + * Read the value of a given Pin, returning HIGH or LOW + ********************************************************************************* + */ + +int digitalRead (int pin) +{ + char c ; + struct wiringPiNodeStruct *node = wiringPiNodes ; + unsigned int gpio_mask = PI_GPIO_MASK; + int origPin = pin; + + if ( piModel == PI_MODEL_ODROIDC ) gpio_mask = ODROIDC_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDC2 ) gpio_mask = ODROIDC2_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDXU_34 ) gpio_mask = ODROIDXU_GPIO_MASK; + + if ((pin & gpio_mask) == 0) // On-Board Pin + { + /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode + { + int fd_pos = gpioToPin(pin); + + if ( sysFds [fd_pos] == -1) + return LOW ; + + lseek (sysFds [fd_pos], 0L, SEEK_SET) ; + read (sysFds [fd_pos], &c, 1) ; + return (c == '0') ? LOW : HIGH ; + } + else if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return LOW ; + + wiringPiGpioCheck (__func__, origPin, pin); + + if ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) { + if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0) + return HIGH ; + else + return LOW ; + } + else if ( piModel == PI_MODEL_ODROIDXU_34 ) { + if (pin < 100) + return *(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW; + else + return *(gpio1 + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW; + } + else { + if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) + return HIGH ; + else + return LOW ; + } + } + else + { + if ((node = wiringPiFindNode (pin)) == NULL) + return LOW ; + return node->digitalRead (node, pin) ; + } +} + + +/* + * digitalWrite: + * Set an output bit + ********************************************************************************* + */ + +void digitalWrite (int pin, int value) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + unsigned int gpio_mask = PI_GPIO_MASK; + int origPin = pin; + + if ( piModel == PI_MODEL_ODROIDC ) gpio_mask = ODROIDC_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDC2 ) gpio_mask = ODROIDC2_GPIO_MASK; + if ( piModel == PI_MODEL_ODROIDXU_34 ) gpio_mask = ODROIDXU_GPIO_MASK; + + if ((pin & gpio_mask) == 0) // On-Board Pin + { + /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode + { + int fd_pos = gpioToPin(pin); + + if (sysFds [fd_pos] != -1) + { + if (value == LOW) + write (sysFds [fd_pos], "0\n", 2) ; + else + write (sysFds [fd_pos], "1\n", 2) ; + } + return ; + } + else if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + wiringPiGpioCheck (__func__, origPin, pin); + + if ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) { + if (value == LOW) + *(gpio + gpioToGPSETReg(pin)) &= ~(1 << gpioToShiftReg(pin)); + else + *(gpio + gpioToGPSETReg(pin)) |= (1 << gpioToShiftReg(pin)); + } + else if ( piModel == PI_MODEL_ODROIDXU_34 ) { + if (pin < 100) { + if (value == LOW) + *(gpio + gpioToGPLEVReg(pin)) &= ~(1 << gpioToShiftReg(pin)); + else + *(gpio + gpioToGPLEVReg(pin)) |= (1 << gpioToShiftReg(pin)); + } + else { + if (value == LOW) + *(gpio1 + gpioToGPLEVReg(pin)) &= ~(1 << gpioToShiftReg(pin)); + else + *(gpio1 + gpioToGPLEVReg(pin)) |= (1 << gpioToShiftReg(pin)); + } + } + } + else + { + if ((node = wiringPiFindNode (pin)) != NULL) + node->digitalWrite (node, pin, value) ; + } +} + + +/* + * pwmWrite: + * Set an output PWM value + ********************************************************************************* + */ + +void pwmWrite (int pin, int value) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + unsigned int gpio_mask = PI_GPIO_MASK; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if ((pin & gpio_mask) == 0) // On-Board Pin + { + /**/ if (wiringPiMode == WPI_MODE_PINS) + pin = pinToGpio [pin] ; + else if (wiringPiMode == WPI_MODE_PHYS) + pin = physToGpio [pin] ; + else if (wiringPiMode != WPI_MODE_GPIO) + return ; + + *(pwm + gpioToPwmPort [pin]) = value ; + } + else + { + if ((node = wiringPiFindNode (pin)) != NULL) + node->pwmWrite (node, pin, value) ; + } +} + + +/* + * analogRead: + * Read the analog value of a given Pin. + * There is no on-board Pi analog hardware, + * so this needs to go to a new node. + ********************************************************************************* + */ + +int analogRead (int pin) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + unsigned char value[5] = {0,}; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34 ) { + if(pin < 2) { + if (adcFds [pin] == -1) + return 0; + lseek (adcFds [pin], 0L, SEEK_SET); + read (adcFds [pin], &value[0], 4); + return atoi(value); + } + } + + if ((node = wiringPiFindNode (pin)) == NULL) + return 0 ; + else + return node->analogRead (node, pin) ; +} + + +/* + * analogWrite: + * Write the analog value to the given Pin. + * There is no on-board Pi analog hardware, + * so this needs to go to a new node. + ********************************************************************************* + */ + +void analogWrite (int pin, int value) +{ + struct wiringPiNodeStruct *node = wiringPiNodes ; + + if ((node = wiringPiFindNode (pin)) == NULL) + return ; + + node->analogWrite (node, pin, value) ; +} + + +/* + * pwmToneWrite: + * Pi Specific. + * Output the given frequency on the Pi's PWM pin + ********************************************************************************* + */ + +void pwmToneWrite (int pin, int freq) +{ + int range ; + + if ( piModel == PI_MODEL_ODROIDC || + piModel == PI_MODEL_ODROIDC2 || + piModel == PI_MODEL_ODROIDXU_34) { + fprintf (stderr, "%s : Unsupport function on %s model\n", + __func__, piModelNames [piModel]); + exit (EXIT_FAILURE) ; + } + + if (freq == 0) + pwmWrite (pin, 0) ; // Off + else + { + range = 600000 / freq ; + pwmSetRange (range) ; + pwmWrite (pin, freq / 2) ; + } +} + + + +/* + * digitalWriteByte: + * Pi Specific + * Write an 8-bit byte to the first 8 GPIO pins - try to do it as + * fast as possible. + * However it still needs 2 operations to set the bits, so any external + * hardware must not rely on seeing a change as there will be a change + * to set the outputs bits to zero, then another change to set the 1's + ********************************************************************************* + */ + +union reg_bitfield { + unsigned int wvalue; + struct { + unsigned int bit0 : 1; + unsigned int bit1 : 1; + unsigned int bit2 : 1; + unsigned int bit3 : 1; + unsigned int bit4 : 1; + unsigned int bit5 : 1; + unsigned int bit6 : 1; + unsigned int bit7 : 1; + unsigned int bit8 : 1; + unsigned int bit9 : 1; + unsigned int bit10 : 1; + unsigned int bit11 : 1; + unsigned int bit12 : 1; + unsigned int bit13 : 1; + unsigned int bit14 : 1; + unsigned int bit15 : 1; + unsigned int bit16 : 1; + unsigned int bit17 : 1; + unsigned int bit18 : 1; + unsigned int bit19 : 1; + unsigned int bit20 : 1; + unsigned int bit21 : 1; + unsigned int bit22 : 1; + unsigned int bit23 : 1; + unsigned int bit24 : 1; + unsigned int bit25 : 1; + unsigned int bit26 : 1; + unsigned int bit27 : 1; + unsigned int bit28 : 1; + unsigned int bit29 : 1; + unsigned int bit30 : 1; + unsigned int bit31 : 1; + } bits; +}; + +void digitalWriteByte_XU(int value) +{ + union reg_bitfield gpx1, gpx2, gpa0; + + /* Read data register */ + gpx1.wvalue = *(gpio + (GPIO_X1_DAT_OFFSET >> 2)); + gpx2.wvalue = *(gpio + (GPIO_X2_DAT_OFFSET >> 2)); + gpa0.wvalue = *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)); + + /* Wiring PI GPIO0 = XU3/4 GPA0.3 */ + gpa0.bits.bit3 = (value & 0x01); + /* Wiring PI GPIO1 = XU3/4 GPA0.2 */ + gpa0.bits.bit2 = (value & 0x02); + /* Wiring PI GPIO2 = XU3/4 GPX1.5 */ + gpx1.bits.bit5 = (value & 0x04); + /* Wiring PI GPIO3 = XU3/4 GPX1.6 */ + gpx1.bits.bit6 = (value & 0x08); + /* Wiring PI GPIO4 = XU3/4 GPX1.3 */ + gpx1.bits.bit3 = (value & 0x10); + /* Wiring PI GPIO5 = XU3/4 GPX1.7 */ + gpx1.bits.bit7 = (value & 0x20); + /* Wiring PI GPIO6 = XU3/4 GPX2.0 */ + gpx2.bits.bit0 = (value & 0x40); + /* Wiring PI GPIO7 = XU3/4 GPX1.2 */ + gpx1.bits.bit2 = (value & 0x80); + + /* update data register */ + *(gpio + (GPIO_X1_DAT_OFFSET >> 2)) = gpx1.wvalue; + *(gpio + (GPIO_X2_DAT_OFFSET >> 2)) = gpx2.wvalue; + *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)) = gpa0.wvalue; +} + +void digitalWriteByte_C(int value) +{ + union reg_bitfield gpiox, gpioy; + + gpiox.wvalue = *(gpio + GPIOX_INP_REG_OFFSET); + gpioy.wvalue = *(gpio + GPIOY_INP_REG_OFFSET); + + /* Wiring PI GPIO0 = C1 GPIOY.8 */ + gpioy.bits.bit8 = (value & 0x01); + /* Wiring PI GPIO1 = C1 GPIOY.7 */ + gpioy.bits.bit7 = (value & 0x02); + /* Wiring PI GPIO2 = C1 GPIOX.19 */ + gpiox.bits.bit19 = (value & 0x04); + /* Wiring PI GPIO3 = C1 GPIOX.18 */ + gpiox.bits.bit18 = (value & 0x08); + /* Wiring PI GPIO4 = C1 GPIOX.7 */ + gpiox.bits.bit7 = (value & 0x10); + /* Wiring PI GPIO5 = C1 GPIOX.5 */ + gpiox.bits.bit5 = (value & 0x20); + /* Wiring PI GPIO6 = C1 GPIOX.6 */ + gpiox.bits.bit6 = (value & 0x40); + /* Wiring PI GPIO7 = C1 GPIOY.3 */ + gpioy.bits.bit3 = (value & 0x80); + + *(gpio + GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue; + *(gpio + GPIOY_OUTP_REG_OFFSET) = gpioy.wvalue; +} + +void digitalWriteByte_C2(int value) +{ + union reg_bitfield gpiox; + + gpiox.wvalue = *(gpio + C2_GPIOX_INP_REG_OFFSET); + + /* Wiring PI GPIO0 = C1 GPIOX.19 */ + gpiox.bits.bit19 = (value & 0x01); + /* Wiring PI GPIO1 = C1 GPIOX.10 */ + gpiox.bits.bit10 = (value & 0x02); + /* Wiring PI GPIO2 = C1 GPIOX.11 */ + gpiox.bits.bit11 = (value & 0x04); + /* Wiring PI GPIO3 = C1 GPIOX.9 */ + gpiox.bits.bit9 = (value & 0x08); + /* Wiring PI GPIO4 = C1 GPIOX.8 */ + gpiox.bits.bit8 = (value & 0x10); + /* Wiring PI GPIO5 = C1 GPIOX.5 */ + gpiox.bits.bit5 = (value & 0x20); + /* Wiring PI GPIO6 = C1 GPIOX.3 */ + gpiox.bits.bit3 = (value & 0x40); + /* Wiring PI GPIO7 = C1 GPIOX.21 */ + gpiox.bits.bit21 = (value & 0x80); + + *(gpio + C2_GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue; +} + +void digitalWriteByte (int value) +{ + uint32_t pinSet = 0 ; + uint32_t pinClr = 0 ; + int mask = 1 ; + int pin ; + + /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) + { + for (pin = 0 ; pin < 8 ; ++pin) + { + digitalWrite (pinToGpio[pin], value & mask) ; + mask <<= 1 ; + } + return ; + } + else + { + switch(piModel) { + case PI_MODEL_ODROIDC: + digitalWriteByte_C(value); + return; + case PI_MODEL_ODROIDC2: + digitalWriteByte_C2(value); + return; + case PI_MODEL_ODROIDXU_34: + digitalWriteByte_XU(value); + return; + default : + break; + } + for (pin = 0 ; pin < 8 ; ++pin) + { + if ((value & mask) == 0) + pinClr |= (1 << pinToGpio [pin]) ; + else + pinSet |= (1 << pinToGpio [pin]) ; + + mask <<= 1 ; + } + + *(gpio + gpioToGPCLR [0]) = pinClr ; + *(gpio + gpioToGPSET [0]) = pinSet ; + } +} + + +/* + * waitForInterrupt: + * Pi Specific. + * Wait for Interrupt on a GPIO pin. + * This is actually done via the /sys/class/gpio interface regardless of + * the wiringPi access mode in-use. Maybe sometime it might get a better + * way for a bit more efficiency. + ********************************************************************************* + */ + + +int waitForInterrupt (int pin, int mS) +{ + int fd, x ; + uint8_t c ; + struct pollfd polls ; + + if ((fd = sysFds [pin]) == -1) + return -2 ; + + // Setup poll structure + polls.fd = fd ; + polls.events = POLLPRI ; // Urgent data! + + +// Wait for it ... +wait: + x = poll (&polls, 1, mS) ; + +// Do a dummy read to clear the interrupt +// A one character read appars to be enough. +// Followed by a seek to reset it. + + (void)read (fd, &c, 1) ; + lseek (fd, 0, SEEK_SET) ; + + return x ; +} + + +/* + * interruptHandler: + * This is a thread and gets started to wait for the interrupt we're + * hoping to catch. It will call the user-function when the interrupt + * fires. + ********************************************************************************* + */ + +static void *interruptHandler (void *arg) +{ + int myPin ; + + (void)piHiPri (55) ; // Only effective if we run as root + + myPin = pinPass ; + pinPass = -1 ; + + for (;;) + if (waitForInterrupt (myPin, -1) > 0) + isrFunctions [myPin] () ; + + return NULL ; +} + + +/* + * wiringPiISR: + * Pi Specific. + * Take the details and create an interrupt handler that will do a call- + * back to the user supplied function. + ********************************************************************************* + */ + +int wiringPiISR (int pin, int mode, void (*function)(void)) +{ + pthread_t threadId ; + const char *modeS ; + char fName [64] ; + char pinS [8] ; + pid_t pid ; + int count, i ; + char c ; + int bcmGpioPin ; + + /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; + else if (wiringPiMode == WPI_MODE_PINS) + bcmGpioPin = pinToGpio [pin & 63] ; + else if (wiringPiMode == WPI_MODE_PHYS) + bcmGpioPin = physToGpio [pin & 63] ; + else + bcmGpioPin = pin ; + + if ( piModel == PI_MODEL_ODROIDC ) { + if ((pin < 0) || (pin > 128)) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-128 (%d)\n", pin) ; + } + else if ( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 ) { + if ((pin < 0) || (pin > 256)) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-256 (%d)\n", pin) ; + } + else { + if ((pin < 0) || (pin > 63)) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; + } + +// Now export the pin and set the right edge +// We're going to use the gpio program to do this, so it assumes +// a full installation of wiringPi. It's a bit 'clunky', but it +// is a way that will work when we're running in "Sys" mode, as +// a non-root user. (without sudo) + + if (mode != INT_EDGE_SETUP) + { + /**/ if (mode == INT_EDGE_FALLING) + modeS = "falling" ; + else if (mode == INT_EDGE_RISING) + modeS = "rising" ; + else + modeS = "both" ; + + sprintf (pinS, "%d", bcmGpioPin) ; + + if ((pid = fork ()) < 0) // Fail + return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; + + if (pid == 0) // Child, exec + { + /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0) + { + execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; + } + else if (access ("/usr/bin/gpio", X_OK) == 0) + { + execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; + return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; + } + else + return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ; + } + else // Parent, wait + wait (NULL) ; + } + +// Now pre-open the /sys/class node - but it may already be open if +// we are in Sys mode... + + if (sysFds [pin] == -1) + { + sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; + + if ((sysFds [pin] = open (fName, O_RDWR)) < 0) + return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; + sysFdIrqType [pin] = mode; + } + + // Clear any initial pending interrupt + + ioctl (sysFds [pin], FIONREAD, &count) ; + for (i = 0 ; i < count ; ++i) + read (sysFds [pin], &c, 1) ; + + isrFunctions [pin] = function ; + + pthread_mutex_lock (&pinMutex) ; + pinPass = pin ; + pthread_create (&threadId, NULL, interruptHandler, NULL) ; + while (pinPass != -1) + delay (1) ; + pthread_mutex_unlock (&pinMutex) ; + + return 0 ; +} + + +/* + * initialiseEpoch: + * Initialise our start-of-time variable to be the current unix + * time in milliseconds and microseconds. + ********************************************************************************* + */ + +static void initialiseEpoch (void) +{ + struct timeval tv ; + + gettimeofday (&tv, NULL) ; + epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; + epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; +} + + +/* + * delay: + * Wait for some number of milliseconds + ********************************************************************************* + */ + +void delay (unsigned int howLong) +{ + struct timespec sleeper, dummy ; + + sleeper.tv_sec = (time_t)(howLong / 1000) ; + sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; + + nanosleep (&sleeper, &dummy) ; +} + + +/* + * delayMicroseconds: + * This is somewhat intersting. It seems that on the Pi, a single call + * to nanosleep takes some 80 to 130 microseconds anyway, so while + * obeying the standards (may take longer), it's not always what we + * want! + * + * So what I'll do now is if the delay is less than 100uS we'll do it + * in a hard loop, watching a built-in counter on the ARM chip. This is + * somewhat sub-optimal in that it uses 100% CPU, something not an issue + * in a microcontroller, but under a multi-tasking, multi-user OS, it's + * wastefull, however we've no real choice )-: + * + * Plan B: It seems all might not be well with that plan, so changing it + * to use gettimeofday () and poll on that instead... + ********************************************************************************* + */ + +void delayMicrosecondsHard (unsigned int howLong) +{ + struct timeval tNow, tLong, tEnd ; + + gettimeofday (&tNow, NULL) ; + tLong.tv_sec = howLong / 1000000 ; + tLong.tv_usec = howLong % 1000000 ; + timeradd (&tNow, &tLong, &tEnd) ; + + while (timercmp (&tNow, &tEnd, <)) + gettimeofday (&tNow, NULL) ; +} + +void delayMicroseconds (unsigned int howLong) +{ + struct timespec sleeper ; + unsigned int uSecs = howLong % 1000000 ; + unsigned int wSecs = howLong / 1000000 ; + + /**/ if (howLong == 0) + return ; + else if (howLong < 100) + delayMicrosecondsHard (howLong) ; + else + { + sleeper.tv_sec = wSecs ; + sleeper.tv_nsec = (long)(uSecs * 1000L) ; + nanosleep (&sleeper, NULL) ; + } +} + + +/* + * millis: + * Return a number of milliseconds as an unsigned int. + ********************************************************************************* + */ + +unsigned int millis (void) +{ + struct timeval tv ; + uint64_t now ; + + gettimeofday (&tv, NULL) ; + now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; + + return (uint32_t)(now - epochMilli) ; +} + + +/* + * micros: + * Return a number of microseconds as an unsigned int. + ********************************************************************************* + */ + +unsigned int micros (void) +{ + struct timeval tv ; + uint64_t now ; + + gettimeofday (&tv, NULL) ; + now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; + + return (uint32_t)(now - epochMicro) ; +} + + +/* + * wiringPiSetup: + * Must be called once at the start of your program execution. + * + * Default setup: Initialises the system into wiringPi Pin mode and uses the + * memory mapped hardware directly. + * + * Changed now to revert to "gpio" mode if we're running on a Compute Module. + ********************************************************************************* + */ + +int wiringPiSetup (void) +{ + int fd ; + int boardRev ; + int model, rev, mem, maker, overVolted ; + + if (getenv (ENV_DEBUG) != NULL) + wiringPiDebug = TRUE ; + + if (getenv (ENV_CODES) != NULL) + wiringPiReturnCodes = TRUE ; + + // Open the master /dev/memory device + if (access("/dev/gpiomem",0) == 0) { + if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/gpiomem: %s\n", strerror (errno)) ; + } + else { + if (geteuid () != 0) + (void)wiringPiFailure (WPI_FATAL, "wiringPiSetup: Must be root. (Did you forget sudo?)\n") ; + + if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ; + } + + if (wiringPiDebug) + printf ("wiringPi: wiringPiSetup called\n") ; + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + if ( model == PI_MODEL_ODROIDC ) { + + pinToGpio = pinToGpioOdroidC; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC); + physToGpio = physToGpioOdroidC; + + // GPIO: + + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROID_GPIO_BASE) ; + if ((int32_t)gpio == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; + + // ADC + // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1) + adcFds [0] = open (piAinNode0, O_RDONLY) ; + adcFds [1] = open (piAinNode1, O_RDONLY) ; + } + else if ( model == PI_MODEL_ODROIDC2 ) { + + if(rev == PI_VERSION_1) { + pinToGpio = pinToGpioOdroidC2_Rev1_0; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_0); + physToGpio = physToGpioOdroidC2_Rev1_0; + } + else { + pinToGpio = pinToGpioOdroidC2_Rev1_1; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_1); + physToGpio = physToGpioOdroidC2_Rev1_1; + } + + // GPIO: + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDC2_GPIO_BASE) ; + if ((int32_t)gpio == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; + + // ADC + // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1) + adcFds [0] = open (C2_piAinNode0, O_RDONLY) ; + adcFds [1] = open (C2_piAinNode1, O_RDONLY) ; + } + else if ( model == PI_MODEL_ODROIDXU_34 ) { + // Check the kernel version and then set the ADC files + struct utsname uname_buf; + + uname(&uname_buf); + if (strncmp(uname_buf.release, "4.14", 4) == 0) { + piAinNode0_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage3_raw"; + } else if (strncmp(uname_buf.release, "4.9", 3) == 0) { + piAinNode0_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage3_raw"; + } else { // 3.10 kernel + piAinNode0_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw"; + } + + pinToGpio = pinToGpioOdroidXU; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidXU); + physToGpio = physToGpioOdroidXU; + + // GPIO: + //#define ODROIDXU_GPX_BASE 0x13400000 // GPX0,1,2,3 + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDXU_GPX_BASE) ; + if ((int32_t)gpio == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; + + //#define ODROIDXU_GPA_BASE 0x14010000 // GPA0,1,2, GPB0,1,2,3,4 + gpio1 = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDXU_GPA_BASE) ; + if ((int32_t)gpio1 == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; + + // ADC + // ADC Fds[0] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw") + // ADC Fds[1] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw") + adcFds [0] = open (piAinNode0_xu, O_RDONLY) ; + adcFds [1] = open (piAinNode1_xu, O_RDONLY) ; + } + else { + // GPIO: + boardRev = piBoardRev () ; + + /**/ if (boardRev == 1) // A, B, Rev 1, 1.1 + { + pinToGpio = pinToGpioR1 ; + physToGpio = physToGpioR1 ; + } + else // A, B, Rev 2, B+, CM + { + pinToGpio = pinToGpioR2 ; + physToGpio = physToGpioR2 ; + } + + gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; + if ((int32_t)gpio == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; + + // PWM + + pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; + if ((int32_t)pwm == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ; + + // Clock control (needed for PWM) + + clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ; + if ((int32_t)clk == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ; + + // The drive pads + + pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; + if ((int32_t)pads == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ; + } + +#ifdef USE_TIMER +// The system timer + + timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; + if ((int32_t)timer == -1) + return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ; + +// Set the timer to free-running, 1MHz. +// 0xF9 is 249, the timer divide is base clock / (divide+1) +// so base clock is 250MHz / 250 = 1MHz. + + *(timer + TIMER_CONTROL) = 0x0000280 ; + *(timer + TIMER_PRE_DIV) = 0x00000F9 ; + timerIrqRaw = timer + TIMER_IRQ_RAW ; +#endif + + initialiseEpoch () ; + +// If we're running on a compute module, then wiringPi pin numbers don't really many anything... + + if (model == PI_MODEL_CM) + wiringPiMode = WPI_MODE_GPIO ; + else + wiringPiMode = WPI_MODE_PINS ; + + return 0 ; +} + + +/* + * wiringPiSetupGpio: + * Must be called once at the start of your program execution. + * + * GPIO setup: Initialises the system into GPIO Pin mode and uses the + * memory mapped hardware directly. + ********************************************************************************* + */ + +int wiringPiSetupGpio (void) +{ + (void)wiringPiSetup () ; + + if (wiringPiDebug) + printf ("wiringPi: wiringPiSetupGpio called\n") ; + + wiringPiMode = WPI_MODE_GPIO ; + + return 0 ; +} + + +/* + * wiringPiSetupPhys: + * Must be called once at the start of your program execution. + * + * Phys setup: Initialises the system into Physical Pin mode and uses the + * memory mapped hardware directly. + ********************************************************************************* + */ + +int wiringPiSetupPhys (void) +{ + (void)wiringPiSetup () ; + + if (wiringPiDebug) + printf ("wiringPi: wiringPiSetupPhys called\n") ; + + wiringPiMode = WPI_MODE_PHYS ; + + return 0 ; +} + + +/* + * wiringPiSetupSys: + * Must be called once at the start of your program execution. + * + * Initialisation (again), however this time we are using the /sys/class/gpio + * interface to the GPIO systems - slightly slower, but always usable as + * a non-root user, assuming the devices are already exported and setup correctly. + */ + +int wiringPiSetupSys (void) +{ + int boardRev ; + int model, rev, mem, maker, overVolted ; + int pin, offset; + char fName [128] ; + + if (getenv (ENV_DEBUG) != NULL) + wiringPiDebug = TRUE ; + + if (getenv (ENV_CODES) != NULL) + wiringPiReturnCodes = TRUE ; + + if (wiringPiDebug) + printf ("wiringPi: wiringPiSetupSys called\n") ; + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + if ( model == PI_MODEL_ODROIDC ) { + pinToGpio = pinToGpioOdroidC ; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC); + physToGpio = physToGpioOdroidC ; + + // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1) + + adcFds [0] = open (piAinNode0, O_RDONLY) ; + adcFds [1] = open (piAinNode1, O_RDONLY) ; + } + else if ( model == PI_MODEL_ODROIDC2 ) { + if(rev == PI_VERSION_1) { + pinToGpio = pinToGpioOdroidC2_Rev1_0; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_0); + physToGpio = physToGpioOdroidC2_Rev1_0; + } + else { + pinToGpio = pinToGpioOdroidC2_Rev1_1; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_1); + physToGpio = physToGpioOdroidC2_Rev1_1; + } + + // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1) + + adcFds [0] = open (C2_piAinNode0, O_RDONLY) ; + adcFds [1] = open (C2_piAinNode1, O_RDONLY) ; + } + else if ( model == PI_MODEL_ODROIDXU_34 ) { + // Check the kernel version and then set the ADC files + struct utsname uname_buf; + + uname(&uname_buf); + if (strncmp(uname_buf.release, "4.14", 4) == 0) { + piAinNode0_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage3_raw"; + } else if (strncmp(uname_buf.release, "4.9", 3) == 0) { + piAinNode0_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage3_raw"; + } else { // 3.10 kernel + piAinNode0_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw"; + piAinNode1_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw"; + } + + pinToGpio = pinToGpioOdroidXU ; + pin_array_count = ARRAY_SIZE(pinToGpioOdroidXU); + physToGpio = physToGpioOdroidXU ; + + // ADC + // ADC Fds[0] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw") + // ADC Fds[1] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw") + adcFds [0] = open (piAinNode0_xu, O_RDONLY) ; + adcFds [1] = open (piAinNode1_xu, O_RDONLY) ; + } + +// Open and scan the directory, looking for exported GPIOs, and pre-open +// the 'value' interface to speed things up for later + for (pin = 0 ; pin < 64 ; ++pin) + { + sprintf (fName, "/sys/class/gpio/gpio%d/value", pinToGpio[pin]) ; + sysFds [pin] = open (fName, O_RDWR) ; + } + + initialiseEpoch () ; + + wiringPiMode = WPI_MODE_GPIO_SYS ; + + return 0 ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h new file mode 100755 index 00000000..63461546 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h @@ -0,0 +1,229 @@ +/* + * wiringPi: + * Arduino compatable (ish) Wiring library for the Raspberry Pi + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifndef __WIRING_PI_H__ +#define __WIRING_PI_H__ + +// Handy defines + +// Deprecated +#define NUM_PINS 17 + +#define WPI_MODE_PINS 0 +#define WPI_MODE_GPIO 1 +#define WPI_MODE_GPIO_SYS 2 +#define WPI_MODE_PHYS 3 +#define WPI_MODE_PIFACE 4 +#define WPI_MODE_UNINITIALISED -1 + +// Pin modes + +#define INPUT 0 +#define OUTPUT 1 +#define PWM_OUTPUT 2 +#define GPIO_CLOCK 3 +#define SOFT_PWM_OUTPUT 4 +#define SOFT_TONE_OUTPUT 5 +#define PWM_TONE_OUTPUT 6 + +#define LOW 0 +#define HIGH 1 + +// Pull up/down/none + +#define PUD_OFF 0 +#define PUD_DOWN 1 +#define PUD_UP 2 + +// PWM + +#define PWM_MODE_MS 0 +#define PWM_MODE_BAL 1 + +// Interrupt levels + +#define INT_EDGE_SETUP 0 +#define INT_EDGE_FALLING 1 +#define INT_EDGE_RISING 2 +#define INT_EDGE_BOTH 3 + +// Pi model types and version numbers +// Intended for the GPIO program Use at your own risk. + +#define PI_MODEL_UNKNOWN 0 +#define PI_MODEL_A 1 +#define PI_MODEL_B 2 +#define PI_MODEL_BP 3 +#define PI_MODEL_CM 4 +#define PI_MODEL_AP 5 +#define PI_MODEL_ODROIDC 6 +#define PI_MODEL_ODROIDXU_34 7 +#define PI_MODEL_ODROIDC2 8 + +#define PI_VERSION_UNKNOWN 0 +#define PI_VERSION_1 1 +#define PI_VERSION_1_1 2 +#define PI_VERSION_1_2 3 +#define PI_VERSION_2 4 + +#define PI_MAKER_UNKNOWN 0 +#define PI_MAKER_EGOMAN 1 +#define PI_MAKER_SONY 2 +#define PI_MAKER_QISDA 3 +#define PI_MAKER_HARDKERNEL 4 + +extern const char *piModelNames [9] ; +extern const char *piRevisionNames [5] ; +extern const char *piMakerNames [5] ; + + +// Intended for the GPIO program Use at your own risk. + +// Threads + +#define PI_THREAD(X) void *X (void *dummy) + +// Failure modes + +#define WPI_FATAL (1==1) +#define WPI_ALMOST (1==2) + + +// wiringPiNodeStruct: +// This describes additional device nodes in the extended wiringPi +// 2.0 scheme of things. +// It's a simple linked list for now, but will hopefully migrate to +// a binary tree for efficiency reasons - but then again, the chances +// of more than 1 or 2 devices being added are fairly slim, so who +// knows.... + +struct wiringPiNodeStruct +{ + int pinBase ; + int pinMax ; + + int fd ; // Node specific + unsigned int data0 ; // ditto + unsigned int data1 ; // ditto + unsigned int data2 ; // ditto + unsigned int data3 ; // ditto + + void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ; + void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ; + int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ; + void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; + void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; + int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ; + void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; + + struct wiringPiNodeStruct *next ; +} ; + +extern struct wiringPiNodeStruct *wiringPiNodes ; + + +// Function prototypes +// c++ wrappers thanks to a comment by Nick Lott +// (and others on the Raspberry Pi forums) + +#ifdef __cplusplus +extern "C" { +#endif + +// Data + +//extern const char *piModelNames [] ; +//extern const char *piRevisionNames[] ; + +// Internal + +extern int wiringPiFailure (int fatal, const char *message, ...) ; + +// Core wiringPi functions + +extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; +extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; + +extern int wiringPiSetup (void) ; +extern int wiringPiSetupSys (void) ; +extern int wiringPiSetupGpio (void) ; +extern int wiringPiSetupPhys (void) ; + +extern void pinModeAlt (int pin, int mode) ; +extern void pinMode (int pin, int mode) ; +extern void pullUpDnControl (int pin, int pud) ; +extern int digitalRead (int pin) ; +extern void digitalWrite (int pin, int value) ; +extern void pwmWrite (int pin, int value) ; +extern int analogRead (int pin) ; +extern void analogWrite (int pin, int value) ; + +// PiFace specifics +// (Deprecated) + +extern int wiringPiSetupPiFace (void) ; +extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only + +// On-Board Raspberry Pi hardware specific stuff + +extern int piBoardRev (void) ; +extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ; +extern int wpiPinToGpio (int wpiPin) ; +extern int physPinToGpio (int physPin) ; +extern void setPadDrive (int group, int value) ; +extern int getAlt (int pin) ; +extern void pwmToneWrite (int pin, int freq) ; +extern void digitalWriteByte (int value) ; +extern void pwmSetMode (int mode) ; +extern void pwmSetRange (unsigned int range) ; +extern void pwmSetClock (int divisor) ; +extern void gpioClockSet (int pin, int freq) ; + +// Interrupts +// (Also Pi hardware specific) + +extern int waitForInterrupt (int pin, int mS) ; +extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; + +// Threads + +extern int piThreadCreate (void *(*fn)(void *)) ; +extern void piLock (int key) ; +extern void piUnlock (int key) ; + +// Schedulling priority + +extern int piHiPri (const int pri) ; + +// Extras from arduino land + +extern void delay (unsigned int howLong) ; +extern void delayMicroseconds (unsigned int howLong) ; +extern unsigned int millis (void) ; +extern unsigned int micros (void) ; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o new file mode 100644 index 0000000000000000000000000000000000000000..6cabfb0928e2a5a3bcc12437b7e42a0ff5c2d40a GIT binary patch literal 53744 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 Jx=7CY{|}zIg#Z8m literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c new file mode 100755 index 00000000..2a121165 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c @@ -0,0 +1,240 @@ +/* + * wiringPiI2C.c: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +/* + * Notes: + * The Linux I2C code is actually the same (almost) as the SMBus code. + * SMBus is System Management Bus - and in essentially I2C with some + * additional functionality added, and stricter controls on the electrical + * specifications, etc. however I2C does work well with it and the + * protocols work over both. + * + * I'm directly including the SMBus functions here as some Linux distros + * lack the correct header files, and also some header files are GPLv2 + * rather than the LGPL that wiringPi is released under - presumably because + * originally no-one expected I2C/SMBus to be used outside the kernel - + * however enter the Raspberry Pi with people now taking directly to I2C + * devices without going via the kernel... + * + * This may ultimately reduce the flexibility of this code, but it won't be + * hard to maintain it and keep it current, should things change. + * + * Information here gained from: kernel/Documentation/i2c/dev-interface + * as well as other online resources. + ********************************************************************************* + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <errno.h> +#include <string.h> +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "wiringPi.h" +#include "wiringPiI2C.h" + +// I2C definitions + +#define I2C_SLAVE 0x0703 +#define I2C_SMBUS 0x0720 /* SMBus-level access */ + +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +// SMBus transaction types + +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + +// SMBus messages + +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ + +// Structures used in the ioctl() calls + +union i2c_smbus_data +{ + uint8_t byte ; + uint16_t word ; + uint8_t block [I2C_SMBUS_BLOCK_MAX + 2] ; // block [0] is used for length + one more for PEC +} ; + +struct i2c_smbus_ioctl_data +{ + char read_write ; + uint8_t command ; + int size ; + union i2c_smbus_data *data ; +} ; + +static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data) +{ + struct i2c_smbus_ioctl_data args ; + + args.read_write = rw ; + args.command = command ; + args.size = size ; + args.data = data ; + return ioctl (fd, I2C_SMBUS, &args) ; +} + + +/* + * wiringPiI2CRead: + * Simple device read + ********************************************************************************* + */ + +int wiringPiI2CRead (int fd) +{ + union i2c_smbus_data data ; + + if (i2c_smbus_access (fd, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) + return -1 ; + else + return data.byte & 0xFF ; +} + + +/* + * wiringPiI2CReadReg8: wiringPiI2CReadReg16: + * Read an 8 or 16-bit value from a regsiter on the device + ********************************************************************************* + */ + +int wiringPiI2CReadReg8 (int fd, int reg) +{ + union i2c_smbus_data data; + + if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data)) + return -1 ; + else + return data.byte & 0xFF ; +} + +int wiringPiI2CReadReg16 (int fd, int reg) +{ + union i2c_smbus_data data; + + if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, &data)) + return -1 ; + else + return data.word & 0xFFFF ; +} + + +/* + * wiringPiI2CWrite: + * Simple device write + ********************************************************************************* + */ + +int wiringPiI2CWrite (int fd, int data) +{ + return i2c_smbus_access (fd, I2C_SMBUS_WRITE, data, I2C_SMBUS_BYTE, NULL) ; +} + + +/* + * wiringPiI2CWriteReg8: wiringPiI2CWriteReg16: + * Write an 8 or 16-bit value to the given register + ********************************************************************************* + */ + +int wiringPiI2CWriteReg8 (int fd, int reg, int value) +{ + union i2c_smbus_data data ; + + data.byte = value ; + return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, &data) ; +} + +int wiringPiI2CWriteReg16 (int fd, int reg, int value) +{ + union i2c_smbus_data data ; + + data.word = value ; + return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, &data) ; +} + + +/* + * wiringPiI2CSetupInterface: + * Undocumented access to set the interface explicitly - might be used + * for the Pi's 2nd I2C interface... + ********************************************************************************* + */ + +int wiringPiI2CSetupInterface (const char *device, int devId) +{ + int fd ; + + if ((fd = open (device, O_RDWR)) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to open I2C device: %s\n", strerror (errno)) ; + + if (ioctl (fd, I2C_SLAVE, devId) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to select I2C device: %s\n", strerror (errno)) ; + + return fd ; +} + + +/* + * wiringPiI2CSetup: + * Open the I2C device, and regsiter the target device + ********************************************************************************* + */ + +int wiringPiI2CSetup (const int devId) +{ + const char *device ; + int model, rev, mem, maker, overVolted ; + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + if ( model == PI_MODEL_ODROIDC || model == PI_MODEL_ODROIDC2 ) + device = "/dev/i2c-1" ; + else if ( model == PI_MODEL_ODROIDXU_34 ) + device = "/dev/i2c-4" ; /* update 2016/feb/12 Linux */ + else { + rev = piBoardRev () ; + + if (rev == 1) + device = "/dev/i2c-0" ; + else + device = "/dev/i2c-1" ; + } + + return wiringPiI2CSetupInterface (device, devId) ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h new file mode 100644 index 00000000..6db8c688 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h @@ -0,0 +1,42 @@ +/* + * wiringPiI2C.h: + * Simplified I2C access routines + * Copyright (c) 2013 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int wiringPiI2CRead (int fd) ; +extern int wiringPiI2CReadReg8 (int fd, int reg) ; +extern int wiringPiI2CReadReg16 (int fd, int reg) ; + +extern int wiringPiI2CWrite (int fd, int data) ; +extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; +extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; + +extern int wiringPiI2CSetupInterface (const char *device, int devId) ; +extern int wiringPiI2CSetup (const int devId) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o new file mode 100644 index 0000000000000000000000000000000000000000..a46271c7aa58b14656a1a82a36e900c20ca04174 GIT binary patch literal 4520 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 Fe*hQ50k!}D literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c new file mode 100755 index 00000000..749045cd --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c @@ -0,0 +1,144 @@ +/* + * wiringPiSPI.c: + * Simplified SPI access routines + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + + +#include <stdint.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> +#include <sys/ioctl.h> +#include <linux/spi/spidev.h> + +#include "wiringPi.h" + +#include "wiringPiSPI.h" + + +// The SPI bus parameters +// Variables as they need to be passed as pointers later on + +const static char *spiDev0 = "/dev/spidev0.0" ; +const static char *spiDev1 = "/dev/spidev0.1" ; +const static char *spiDev0_XU = "/dev/spidev1.0"; +const static uint8_t spiMode = 0 ; +const static uint8_t spiBPW = 8 ; +const static uint16_t spiDelay = 0 ; + +static uint32_t spiSpeeds [2] ; +static int spiFds [2] ; + + +/* + * wiringPiSPIGetFd: + * Return the file-descriptor for the given channel + ********************************************************************************* + */ + +int wiringPiSPIGetFd (int channel) +{ + return spiFds [channel & 1] ; +} + + +/* + * wiringPiSPIDataRW: + * Write and Read a block of data over the SPI bus. + * Note the data ia being read into the transmit buffer, so will + * overwrite it! + * This is also a full-duplex operation. + ********************************************************************************* + */ + +int wiringPiSPIDataRW (int channel, unsigned char *data, int len) +{ + struct spi_ioc_transfer spi ; + + channel &= 1 ; + + spi.tx_buf = (unsigned long)data ; + spi.rx_buf = (unsigned long)data ; + spi.len = len ; + spi.delay_usecs = spiDelay ; + spi.speed_hz = spiSpeeds [channel] ; + spi.bits_per_word = spiBPW ; + + return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; +} + + +/* + * wiringPiSPISetup: + * Open the SPI device, and set it up, etc. + ********************************************************************************* + */ + +int wiringPiSPISetup (int channel, int speed) +{ + int fd ; + int model, rev, mem, maker, overVolted ; + + piBoardId (&model, &rev, &mem, &maker, &overVolted) ; + + channel &= 1 ; + + if (model == PI_MODEL_ODROIDXU_34) { + if (channel) + return wiringPiFailure (WPI_ALMOST, "ODROID-XU3/4 cannot support spi-channel 1.\n") ; + + if ((fd = open (spiDev0_XU, O_RDWR)) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; + } + else if (model == PI_MODEL_ODROIDC) { + if (channel) + return wiringPiFailure (WPI_ALMOST, "ODROID-C1/C1+ cannot support spi-channel 1.\n") ; + + if ((fd = open (spiDev0, O_RDWR)) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; + } + else if (model == PI_MODEL_ODROIDC2) { + return wiringPiFailure (WPI_ALMOST, "ODROID-C2 cannot support spi-channel\n") ; + } + else { + if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) + return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; + } + + spiSpeeds [channel] = speed ; + spiFds [channel] = fd ; + +// Set SPI parameters. +// Why are we reading it afterwriting it? I've no idea, but for now I'm blindly +// copying example code I've seen online... + + if (ioctl (fd, SPI_IOC_WR_MODE, &spiMode) < 0) + return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; + + if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) + return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; + + if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) + return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; + + return fd ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h new file mode 100644 index 00000000..f53697d1 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h @@ -0,0 +1,35 @@ +/* + * wiringPiSPI.h: + * Simplified SPI access routines + * Copyright (c) 2012 Gordon Henderson + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with wiringPi. + * If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +int wiringPiSPIGetFd (int channel) ; +int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; +int wiringPiSPISetup (int channel, int speed) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o new file mode 100644 index 0000000000000000000000000000000000000000..73772d7ad792ef86508a25dfff54c2e6db1059b3 GIT binary patch literal 4616 zcmbuCUrbw77{E^{gUVPhPTa`;$Q^cu>A3VV#@M1up#?6c6E+~j7;Q>>JDQdj+goLe zx+TD*AvGlWum_(s@yVxY%wiPDHWz*IL1SXvi*XOz;-6_^%%V>GzSHy3vrDT>{K&oE zIlu4E`OfLN=Uz_t1^cTU4o2c&hgqpdlrfjP)b{bFk2SDO%qVQY-t2Y9V)cbfu_a^n z$8P9Ejm7HStza<n0Z*&GqOTbFPLGkdJgyj!CJ~k&^)xKAgz7W$-(LxMwz(h)m>Y$8 z@$n1#$_>nKECxNTQDa{{Pnz3c%wF!k#4Sp5fU%gSG|!<Q8ym_0IeX24Wx!zdMj_}? zjl!sBhf%O_*q1zw!9u{}u@}g5EyB>Vw`-NTFCf$G?HXn7C*E)=bMM2V7=<Tr2vOYp z)#WPeDS_Lf$oZB0r^><vcrK3O(0pZ#$kk;>!r{x`$~T@PR(KE-<@cUji&PfQ^VHm+ zuPi%x2(M~>MOpZm8zC#0suR_ajhpfp^Ec+dR2HtF`K~2W=C@+SuuRW9dr4_#RBdqz z%G}`U>Z(!L4{=Oi6;=H3QEbWXx2v4r8>RIwu3I-(BA=1JxR&x}4C0k$ANw!A!}sX7 z<sSWh{<}D?eU3N31_Lh!r_NY=)O?{mI~@n*)x39ib-Am9b!2!@J(7-^s(&(^I$^4@ za6FmIn1|He**b3Q9X?*sHZpCR(Xv*oV<>QJXfV(=KDMvDQ;mdEskEhLbJNr54Cv{2 zTLeZ-nMqaG>d>8yrNR?QQ?=4+dfH5>SQ$(q9udV*KEK}X*B`rwgkpSu$G`a2F&AS4 ze*Yo0b!;M+vU2KvtyA;1b>(<Ze?{-oyq(&?Jw>i|c=axCm-isn+lV(1$Ejn?G1K7K zUSI24f*slbYzMb6Mn_B&^u2;Tk2>J?Rh_7FyLvXVz0eH`+oSmW^|%|(R`s}>W}SoX zVP~zQ&fNs4$L$Ji6mDe|49%+9udC&Z&ax*UV@~)hCr-#zPMnON0C$-b=s6^RSWzxp z1gAb}G&)%g_p#rctk#a03d8}w6V4BXbSrO{vJyuhC;qNw#L0?#&2DnC^-J5%ooX1) zPnJ&JSzkZj6fm!cWM^m}=Kb~a@(Vs}^EY_EhPB!F5y79d@e#peHvTm4*RJh5GCwEy z83K}aviqc7u^9oid2Q88d)g8l_d5#T*PzeBMGQH~o6so7->Sgh1CHY^i3I%FfcE7I z{`iI~m;b8@{8|P6TLsQujA!Dh6T@*hnY0LlBdkA~Ma7Rn-old<2^^YC3;OrrtpjiS z@z#mA19&@#H{HwcI^MhR)-8`PU|RiA83e*s_}Fn48VC;c_5?#i{rw|-qoL8B-e6yd z#nTZh$wHy56^<lAk;y~|4{|wt#I$nL3`$FfGtt2)!!vfx-d{ZRA%U66q|%{eIuf?x z=@iRa86fElEXmqQfkzac4u8RW3*`_RL5S1IQQUtePX4%`P|$BDT*O~S2!b4+A>yAS z1VOICMf?`DQE*&*Mv4E95Cl2y2jVVqKwzF-65lDfy?))sDNnb=>mkpb;xerE3T~g* zQJX*I303evRe_(E^4u@g|B1vmOZ+n_Pm9FAmHg%Pxi0YsB>!J3<Z<AFf#7@}hKuIq zlDJ3Wir}d5-AVr2CI1$Q?~%Bi-z#xB{{g{K;WsDc_e=gQ5<e<&IsdrC<@_PRQQ^Cd z@+Tz!7KxvfxSaot#O3_23XW>4l;?HHzeVD2OaAzMLG`>_!T$q^%g>hzu_$O3F1%lS z&y_fxt;5_};!C2>wCu?#D?9<($`th^wK8ThtXbxa#k44#V@#XKW*G-sE|rWY%;ZU? zWzuNFXkCL-QSNqAmuZpo)RdWmMDRUnY6DM=wedp_9B>SCG8D^%r%bBpe`pnAaqHXP z^gduHAIggbeOe!Ggxhwws^Rj%CCj*Y#eU-~Qv625ap;Q$e@m1{;6g6k5OMj#HZF1T zm{OO2S7J_kJOO*XG(IKJp;2!B6i<Gn?c@7Id<Qv@76r{wUucRaJp>%v_V@)6|Bfx5 z>Zf@8&cU{QxitJy%5aJ+TH!x%Xdv?v5ZWu^`G1;{jp9kC!A5P#jhP}|X4tm-;`$)7 z*FP!ZXD~<-nm?h_&_Guo0inH{iVZ{basT1hFU8aT!*|TOy#s7U#J>h@S?u+fs~!En dqxwa1e0Ohy%RW9nCgsK-7mjzpE{lEqe*kMOH30ws literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c new file mode 100644 index 00000000..ca976a99 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c @@ -0,0 +1,213 @@ +/* + * wiringSerial.c: + * Handle a serial port + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdarg.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "wiringSerial.h" + +/* + * serialOpen: + * Open and initialise the serial port, setting all the right + * port parameters - or as many as are required - hopefully! + ********************************************************************************* + */ + +int serialOpen (const char *device, const int baud) +{ + struct termios options ; + speed_t myBaud ; + int status, fd ; + + switch (baud) + { + case 50: myBaud = B50 ; break ; + case 75: myBaud = B75 ; break ; + case 110: myBaud = B110 ; break ; + case 134: myBaud = B134 ; break ; + case 150: myBaud = B150 ; break ; + case 200: myBaud = B200 ; break ; + case 300: myBaud = B300 ; break ; + case 600: myBaud = B600 ; break ; + case 1200: myBaud = B1200 ; break ; + case 1800: myBaud = B1800 ; break ; + case 2400: myBaud = B2400 ; break ; + case 4800: myBaud = B4800 ; break ; + case 9600: myBaud = B9600 ; break ; + case 19200: myBaud = B19200 ; break ; + case 38400: myBaud = B38400 ; break ; + case 57600: myBaud = B57600 ; break ; + case 115200: myBaud = B115200 ; break ; + case 230400: myBaud = B230400 ; break ; + + default: + return -2 ; + } + + if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1) + return -1 ; + + fcntl (fd, F_SETFL, O_RDWR) ; + +// Get and modify current options: + + tcgetattr (fd, &options) ; + + cfmakeraw (&options) ; + cfsetispeed (&options, myBaud) ; + cfsetospeed (&options, myBaud) ; + + options.c_cflag |= (CLOCAL | CREAD) ; + options.c_cflag &= ~PARENB ; + options.c_cflag &= ~CSTOPB ; + options.c_cflag &= ~CSIZE ; + options.c_cflag |= CS8 ; + options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ; + options.c_oflag &= ~OPOST ; + + options.c_cc [VMIN] = 0 ; + options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds) + + tcsetattr (fd, TCSANOW | TCSAFLUSH, &options) ; + + ioctl (fd, TIOCMGET, &status); + + status |= TIOCM_DTR ; + status |= TIOCM_RTS ; + + ioctl (fd, TIOCMSET, &status); + + usleep (10000) ; // 10mS + + return fd ; +} + + +/* + * serialFlush: + * Flush the serial buffers (both tx & rx) + ********************************************************************************* + */ + +void serialFlush (const int fd) +{ + tcflush (fd, TCIOFLUSH) ; +} + + +/* + * serialClose: + * Release the serial port + ********************************************************************************* + */ + +void serialClose (const int fd) +{ + close (fd) ; +} + + +/* + * serialPutchar: + * Send a single character to the serial port + ********************************************************************************* + */ + +void serialPutchar (const int fd, const unsigned char c) +{ + write (fd, &c, 1) ; +} + + +/* + * serialPuts: + * Send a string to the serial port + ********************************************************************************* + */ + +void serialPuts (const int fd, const char *s) +{ + write (fd, s, strlen (s)) ; +} + +/* + * serialPrintf: + * Printf over Serial + ********************************************************************************* + */ + +void serialPrintf (const int fd, const char *message, ...) +{ + va_list argp ; + char buffer [1024] ; + + va_start (argp, message) ; + vsnprintf (buffer, 1023, message, argp) ; + va_end (argp) ; + + serialPuts (fd, buffer) ; +} + + +/* + * serialDataAvail: + * Return the number of bytes of data avalable to be read in the serial port + ********************************************************************************* + */ + +int serialDataAvail (const int fd) +{ + int result ; + + if (ioctl (fd, FIONREAD, &result) == -1) + return -1 ; + + return result ; +} + + +/* + * serialGetchar: + * Get a single character from the serial device. + * Note: Zero is a valid character and this function will time-out after + * 10 seconds. + ********************************************************************************* + */ + +int serialGetchar (const int fd) +{ + uint8_t x ; + + if (read (fd, &x, 1) != 1) + return -1 ; + + return ((int)x) & 0xFF ; +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h new file mode 100644 index 00000000..430dc731 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h @@ -0,0 +1,38 @@ +/* + * wiringSerial.h: + * Handle a serial port + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int serialOpen (const char *device, const int baud) ; +extern void serialClose (const int fd) ; +extern void serialFlush (const int fd) ; +extern void serialPutchar (const int fd, const unsigned char c) ; +extern void serialPuts (const int fd, const char *s) ; +extern void serialPrintf (const int fd, const char *message, ...) ; +extern int serialDataAvail (const int fd) ; +extern int serialGetchar (const int fd) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o new file mode 100644 index 0000000000000000000000000000000000000000..e7cad0a25271a775178c20858327c8aa15f620b5 GIT binary patch literal 4504 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 MfUKw)u%^lW10h5&M*si- literal 0 HcmV?d00001 diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c new file mode 100644 index 00000000..3df94e8a --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c @@ -0,0 +1,83 @@ +/* + * wiringShift.c: + * Emulate some of the Arduino wiring functionality. + * + * Copyright (c) 2009-2012 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#include <stdint.h> + +#include "wiringPi.h" +#include "wiringShift.h" + +/* + * shiftIn: + * Shift data in from a clocked source + ********************************************************************************* + */ + +uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) +{ + uint8_t value = 0 ; + int8_t i ; + + if (order == MSBFIRST) + for (i = 7 ; i >= 0 ; --i) + { + digitalWrite (cPin, HIGH) ; + value |= digitalRead (dPin) << i ; + digitalWrite (cPin, LOW) ; + } + else + for (i = 0 ; i < 8 ; ++i) + { + digitalWrite (cPin, HIGH) ; + value |= digitalRead (dPin) << i ; + digitalWrite (cPin, LOW) ; + } + + return value; +} + +/* + * shiftOut: + * Shift data out to a clocked source + ********************************************************************************* + */ + +void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) +{ + int8_t i; + + if (order == MSBFIRST) + for (i = 7 ; i >= 0 ; --i) + { + digitalWrite (dPin, val & (1 << i)) ; + digitalWrite (cPin, HIGH) ; + digitalWrite (cPin, LOW) ; + } + else + for (i = 0 ; i < 8 ; ++i) + { + digitalWrite (dPin, val & (1 << i)) ; + digitalWrite (cPin, HIGH) ; + digitalWrite (cPin, LOW) ; + } +} diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h new file mode 100644 index 00000000..419ade41 --- /dev/null +++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h @@ -0,0 +1,41 @@ +/* + * wiringShift.h: + * Emulate some of the Arduino wiring functionality. + * + * Copyright (c) 2009-2012 Gordon Henderson. + *********************************************************************** + * This file is part of wiringPi: + * https://projects.drogon.net/raspberry-pi/wiringpi/ + * + * wiringPi is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wiringPi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with wiringPi. If not, see <http://www.gnu.org/licenses/>. + *********************************************************************** + */ + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#ifndef _STDINT_H +# include <stdint.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) ; +extern void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ; + +#ifdef __cplusplus +} +#endif diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o new file mode 100644 index 0000000000000000000000000000000000000000..5f83a176a82e8accfc7468ff19e0627daf10c387 GIT binary patch literal 2336 zcmbW1&ubG=5XUFk{zzNhR1qvx=z5U|c1ffyD5%+VlcrGG(l-7;Ye?H|6HHS`HrRU5 zLZldIMeyREAf7ylAb4r7f>I9_FFlC0C>9U)pkkfbyl0=AU6oGQ%zK|V^L_Jv?B0s@ z#k?L5aPz=f*zIu&uwJ{{4qMGI?1x6s652>K^e!<RdK>mX`K<e&Y{g5TeDmKtrtWVG z!*dcVZ+)N?o%!-wXuG_%x?WoLXbmgYQ0cp`_&Q!%@#*FD%cI&AZFG6k-=+gRtH(r~ zz~6S8B>t}VQPA6Q*3-^o#a2<;NCK<f#KN&yY;92e<~e`cJk3*H)63g>d1LiGR;eHT zY*i^PhL-TV^jDRdwX4fky_E^9`URbj|I*nh?&?5KclT)}kQgiG%%ak%cBsMjuA<co z-3)c9!4CD*@d{T?218xJuHY%E`w;!1d2S4WXSUhXy06}M56>Wu?1(i2@Q8dwZeH?6 z<d#KAmz9MYO%9Z5`{m$VqZ~k>$t@TVk$pW)-teCUU=Y*OOzR=jx=UJ1Qe0LRNo%1t zDhEq--WbYhvVvn3In9z23Da?NbbV^z%Z}5y<akp7B>Xv<gi1~(fpEEn014>wRhtC9 zYKTOFx+?BRa!{z#+IwV&@oBD#255KTr(JjqIq5%UTGn|``+6py$xRKXGn1w|4h8bP zIY{>O4MeoQ<UlMo934rHXpz2X5+*WJ88el=kk6O~?+h8KiAvf)(F6!EecHh$e17ay zEGY1O0`C^M7(eU6=LIh6+!wg0v+2UWy6~SaJj6bB_H~_c;V~DkFnuq2dbnj-gL8gP zpcdw)&D0orGhgv(-pU)<lxiBYCa4oBGX?5cp#T<8i@9v(nvtCYb$n)e+Q?x@ZpJj! zp8iC8!Ay-`1J%kl(#gquYTDps?Aa@rNlUih>@YI2i)=qCz3MyNiUYK_VIIJIfW3+e z%crxYCV#V9Slltj?Qir0+q^8?(%^0KC-5Q7z2=87m!`6>|9|HXvwZ%ZVAnF9-^l^< zd|BN0BIj)}^o0|2h`q{~cqd8cCCh(G9l`kib94zCPUjbApG>|kIzP(g`TYD2AhYj1 rBA8|QY3c}OUl#T4wNv;V1_xOJeKQ*HvCmJ;Y5q414&b<G_W6GSkZ@iT literal 0 HcmV?d00001 -- GitLab