diff --git a/bulldog-board-beagleboneblack/src/main/java/io/silverspoon/bulldog/beagleboneblack/gpio/BBBDigitalOutput.java b/bulldog-board-beagleboneblack/src/main/java/io/silverspoon/bulldog/beagleboneblack/gpio/BBBDigitalOutput.java index 2a7b28f9..95161bce 100644 --- a/bulldog-board-beagleboneblack/src/main/java/io/silverspoon/bulldog/beagleboneblack/gpio/BBBDigitalOutput.java +++ b/bulldog-board-beagleboneblack/src/main/java/io/silverspoon/bulldog/beagleboneblack/gpio/BBBDigitalOutput.java @@ -10,6 +10,15 @@ public class BBBDigitalOutput extends AbstractDigitalOutput { public BBBDigitalOutput(Pin pin) { super(pin); + + BeagleBonePin bbbPin = (BeagleBonePin) getPin(); + int value = NativeGpio.digitalRead(bbbPin.getPortNumeric(), bbbPin.getIndexOnPort()); + + if (value == NativeGpio.HIGH) { + setSignal(Signal.High); + } else { + setSignal(Signal.Low); + } } protected void setupImpl() { diff --git a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/AbstractBCM.java b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/AbstractBCM.java index b577540c..4ec394ca 100644 --- a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/AbstractBCM.java +++ b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/AbstractBCM.java @@ -34,6 +34,10 @@ public abstract class AbstractBCM { public abstract int getGPIOClear(); + public abstract int getGPIORead(); + + public abstract int getRegisterSize(); + public MemoryMap getGpioMemory() { if (gpioMemory == null) { gpioMemory = new MemoryMap("/dev/mem", this.getGPIOBase(), 4096, 0); @@ -71,21 +75,21 @@ public void cleanup() { } public void configureAsInput(int gpio) { - long address = (gpio / 10) * 4; + long address = (gpio / 10) * getRegisterSize(); int value = this.getGpioMemory().getIntValueAt(address); value &= ~(7 << getGpioRegisterOffset(gpio)); this.getGpioMemory().setIntValue(address, value); } public void configureAsOutput(int gpio) { - long address = (gpio / 10) * 4; + long address = (gpio / 10) * getRegisterSize(); int value = this.getGpioMemory().getIntValueAt(address); value |= (1 << getGpioRegisterOffset(gpio)); this.getGpioMemory().setIntValue(address, value); } public void configureAlternateFunction(int gpio, int alt) { - long address = (gpio / 10) * 4; + long address = (gpio / 10) * getRegisterSize(); int value = this.getGpioMemory().getIntValueAt(address); value |= (((alt) <= 3 ? (alt) + 4 : (alt) == 4 ? 3 : 2) << (gpio % 10) * 3); this.getGpioMemory().setIntValue(address, value); diff --git a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2835.java b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2835.java index 7a8b040a..af958d80 100644 --- a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2835.java +++ b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2835.java @@ -10,16 +10,19 @@ public class BCM2835 extends AbstractBCM { public static final int GPIO_BASE = (BCM_PERI_BASE + 0x200000); public static final int PWM_BASE = (BCM_PERI_BASE + 0x20C000); public static final int CLOCK_BASE = (BCM_PERI_BASE + 0x101000); + public static final int REGISTER_SIZE = 4; - public static final int PWMCLK_CNTL = 40 * 4; - public static final int PWMCLK_DIV = 41 * 4; + public static final int PWMCLK_CNTL = 40 * REGISTER_SIZE; + public static final int PWMCLK_DIV = 41 * REGISTER_SIZE; public static final int PWM_CTL = 0; - public static final int PWM_RNG1 = 4 * 4; - public static final int PWM_DAT1 = 5 * 4; + public static final int PWM_RNG1 = 4 * REGISTER_SIZE; + public static final int PWM_DAT1 = 5 * REGISTER_SIZE; + + public static final int GPIO_SET = 7 * REGISTER_SIZE; + public static final int GPIO_CLEAR = 10 * REGISTER_SIZE; + public static final int GPIO_READ = 13 * REGISTER_SIZE; - public static final int GPIO_SET = 7 * 4; - public static final int GPIO_CLEAR = 10 * 4; @Override public int getBCMPeriBase() { @@ -71,8 +74,18 @@ public int getGPIOSet() { return GPIO_SET; } + @Override + public int getGPIORead() { + return GPIO_READ; + } + @Override public int getGPIOClear() { return GPIO_CLEAR; } + + @Override + public int getRegisterSize() { + return 0; + } } \ No newline at end of file diff --git a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2836.java b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2836.java index e94042e1..a8e2d35d 100644 --- a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2836.java +++ b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/bcm/BCM2836.java @@ -10,16 +10,18 @@ public class BCM2836 extends AbstractBCM { public static final int GPIO_BASE = (BCM_PERI_BASE + 0x200000); public static final int PWM_BASE = (BCM_PERI_BASE + 0x20C000); public static final int CLOCK_BASE = (BCM_PERI_BASE + 0x101000); + public static final int REGISTER_SIZE = 4; - public static final int PWMCLK_CNTL = 40 * 4; - public static final int PWMCLK_DIV = 41 * 4; + public static final int PWMCLK_CNTL = 40 * REGISTER_SIZE; + public static final int PWMCLK_DIV = 41 * REGISTER_SIZE; public static final int PWM_CTL = 0; - public static final int PWM_RNG1 = 4 * 4; - public static final int PWM_DAT1 = 5 * 4; + public static final int PWM_RNG1 = 4 * REGISTER_SIZE; + public static final int PWM_DAT1 = 5 * REGISTER_SIZE; - public static final int GPIO_SET = 7 * 4; - public static final int GPIO_CLEAR = 10 * 4; + public static final int GPIO_SET = 7 * REGISTER_SIZE; + public static final int GPIO_CLEAR = 10 * REGISTER_SIZE; + public static final int GPIO_READ = 13 * REGISTER_SIZE; @Override public int getBCMPeriBase() { @@ -75,4 +77,14 @@ public int getGPIOSet() { public int getGPIOClear() { return GPIO_CLEAR; } + + @Override + public int getGPIORead() { + return GPIO_READ; + } + + @Override + public int getRegisterSize() { + return REGISTER_SIZE; + } } diff --git a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalInput.java b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalInput.java index 7cc58bf4..003a2ccc 100644 --- a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalInput.java +++ b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalInput.java @@ -27,7 +27,7 @@ protected void setupImpl() { public Signal read() { int address = 1 << getRaspiPin().getGpioNumber(); - return Signal.fromNumericValue(BCM.getGpioMemory().getIntValueAt(address)); + return Signal.fromNumericValue(BCM.getGpioMemory().getIntValueAt(BCM.getGPIORead()) & address); } public void setup() { diff --git a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalOutput.java b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalOutput.java index 987ce8f5..3de17ccb 100644 --- a/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalOutput.java +++ b/bulldog-board-raspberrypi/src/main/java/io/silverspoon/bulldog/raspberrypi/gpio/RaspiDigitalOutput.java @@ -19,6 +19,9 @@ protected void setupImpl() { RaspberryPiPin pin = (RaspberryPiPin) getPin(); BCM.configureAsInput(pin.getGpioNumber()); BCM.configureAsOutput(pin.getGpioNumber()); + int address = 1 << pin.getGpioNumber(); + Signal s = Signal.fromNumericValue(BCM.getGpioMemory().getIntValueAt(BCM.getGPIORead()) & address); + setSignal(s); } @Override diff --git a/bulldog-core/src/main/java/io/silverspoon/bulldog/core/gpio/base/AbstractDigitalOutput.java b/bulldog-core/src/main/java/io/silverspoon/bulldog/core/gpio/base/AbstractDigitalOutput.java index ffecfb25..04a3b50d 100644 --- a/bulldog-core/src/main/java/io/silverspoon/bulldog/core/gpio/base/AbstractDigitalOutput.java +++ b/bulldog-core/src/main/java/io/silverspoon/bulldog/core/gpio/base/AbstractDigitalOutput.java @@ -79,4 +79,8 @@ public void awaitBlinkingStopped() { } protected abstract void applySignalImpl(Signal signal); + + protected void setSignal(Signal signal) { + this.signal = signal; + } }