All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.silverspoon.bulldog.beagleboneblack.BeagleBoneBlack Maven / Gradle / Ivy

package io.silverspoon.bulldog.beagleboneblack;

import java.io.File;

import io.silverspoon.bulldog.beagleboneblack.gpio.BBBAnalogInput;
import io.silverspoon.bulldog.beagleboneblack.gpio.BBBDigitalInput;
import io.silverspoon.bulldog.beagleboneblack.gpio.BBBDigitalOutput;
import io.silverspoon.bulldog.beagleboneblack.gpio.BBBEmmc;
import io.silverspoon.bulldog.beagleboneblack.gpio.BBBHdmi;
import io.silverspoon.bulldog.beagleboneblack.gpio.BBBPwm;
import io.silverspoon.bulldog.beagleboneblack.io.BBBUartPort;
import io.silverspoon.bulldog.beagleboneblack.sysfs.BBBSysFs;
import io.silverspoon.bulldog.core.gpio.Pin;
import io.silverspoon.bulldog.core.gpio.base.DigitalIOFeature;
import io.silverspoon.bulldog.core.gpio.event.FeatureActivationEventArgs;
import io.silverspoon.bulldog.core.gpio.event.FeatureActivationListener;
import io.silverspoon.bulldog.core.platform.AbstractBoard;
import io.silverspoon.bulldog.core.util.BulldogUtil;
import io.silverspoon.bulldog.linux.gpio.LinuxDigitalInput;
import io.silverspoon.bulldog.linux.gpio.LinuxDigitalOutput;
import io.silverspoon.bulldog.linux.io.LinuxI2cBus;
import io.silverspoon.bulldog.linux.io.LinuxSpiBus;

public class BeagleBoneBlack extends AbstractBoard implements FeatureActivationListener {

   private static final String NAME = "BeagleBone Black";
   private BBBSysFs sysFs = new BBBSysFs();

   BeagleBoneBlack() {
      super();
      createPins();
      createBuses();
      createProperties();
   }

   private void createPins() {
      getPins().add(createNativeDigitalIOPin("P8_3", "GPIO1_6", 1, 6, "P8", 3));
      getPins().add(createNativeDigitalIOPin("P8_4", "GPIO1_7", 1, 7, "P8", 4));
      getPins().add(createNativeDigitalIOPin("P8_5", "GPIO1_2", 1, 2, "P8", 5));
      getPins().add(createNativeDigitalIOPin("P8_6", "GPIO1_3", 1, 3, "P8", 6));
      getPins().add(createNativeDigitalIOPin("P8_7", "TIMER4", 2, 2, "P8", 7));
      getPins().add(createNativeDigitalIOPin("P8_8", "TIMER7", 2, 3, "P8", 8));
      getPins().add(createNativeDigitalIOPin("P8_9", "TIMER5", 2, 5, "P8", 9));
      getPins().add(createNativeDigitalIOPin("P8_10", "TIMER6", 2, 4, "P8", 10));
      getPins().add(createNativeDigitalIOPin("P8_11", "GPIO1_13", 1, 13, "P8", 11));
      getPins().add(createNativeDigitalIOPin("P8_12", "GPIO1_12", 1, 12, "P8", 12));
      getPins().add(createNativeDigitalIOPin("P8_13", "EHRPWM2B", 0, 23, "P8", 13));
      getPins().add(createNativeDigitalIOPin("P8_14", "GPIO0_26", 0, 26, "P8", 14));
      getPins().add(createNativeDigitalIOPin("P8_15", "GPIO1_15", 1, 15, "P8", 15));
      getPins().add(createNativeDigitalIOPin("P8_16", "GPIO1_14", 1, 14, "P8", 16));
      getPins().add(createNativeDigitalIOPin("P8_17", "GPIO0_27", 0, 27, "P8", 17));
      getPins().add(createNativeDigitalIOPin("P8_18", "GPIO2_1", 2, 1, "P8", 18));
      getPins().add(createNativeDigitalIOPin("P8_19", "EHRPWM2A", 0, 22, "P8", 19));
      getPins().add(createNativeDigitalIOPin("P8_20", "GPIO1_31", 1, 31, "P8", 20));
      getPins().add(createNativeDigitalIOPin("P8_21", "GPIO1_30", 1, 30, "P8", 21));
      getPins().add(createNativeDigitalIOPin("P8_22", "GPIO1_5", 1, 5, "P8", 22));
      getPins().add(createNativeDigitalIOPin("P8_23", "GPIO1_4", 1, 4, "P8", 23));
      getPins().add(createNativeDigitalIOPin("P8_24", "GPIO1_1", 1, 1, "P8", 24));
      getPins().add(createNativeDigitalIOPin("P8_25", "GPIO1_0", 1, 0, "P8", 25));
      getPins().add(createNativeDigitalIOPin("P8_26", "GPIO1_29", 1, 29, "P8", 26));
      getPins().add(createNativeDigitalIOPin("P8_27", "GPIO2_22", 2, 22, "P8", 27));
      getPins().add(createNativeDigitalIOPin("P8_28", "GPIO2_24", 2, 24, "P8", 28));
      getPins().add(createNativeDigitalIOPin("P8_29", "GPIO2_23", 2, 23, "P8", 29));
      getPins().add(createNativeDigitalIOPin("P8_30", "GPIO2_25", 2, 25, "P8", 30));
      getPins().add(createNativeDigitalIOPin("P8_31", "GPIO0_10", 0, 10, "P8", 31));
      getPins().add(createNativeDigitalIOPin("P8_32", "GPIO0_11", 0, 11, "P8", 32));
      getPins().add(createNativeDigitalIOPin("P8_33", "GPIO0_9", 0, 9, "P8", 33));
      getPins().add(createNativeDigitalIOPin("P8_34", "GPIO2_17", 2, 17, "P8", 34));
      getPins().add(createNativeDigitalIOPin("P8_35", "GPIO0_8", 0, 8, "P8", 35));
      getPins().add(createNativeDigitalIOPin("P8_36", "GPIO2_16", 2, 16, "P8", 36));
      getPins().add(createNativeDigitalIOPin("P8_37", "GPIO2_14", 2, 14, "P8", 37));
      getPins().add(createNativeDigitalIOPin("P8_38", "GPIO2_1", 2, 1, "P8", 38));
      getPins().add(createNativeDigitalIOPin("P8_39", "GPIO2_12", 2, 12, "P8", 39));
      getPins().add(createNativeDigitalIOPin("P8_40", "GPIO2_13", 2, 14, "P8", 40));
      getPins().add(createNativeDigitalIOPin("P8_41", "GPIO2_10", 2, 10, "P8", 41));
      getPins().add(createNativeDigitalIOPin("P8_42", "GPIO2_11", 2, 11, "P8", 42));
      getPins().add(createNativeDigitalIOPin("P8_43", "GPIO2_8", 2, 8, "P8", 43));
      getPins().add(createNativeDigitalIOPin("P8_44", "GPIO2_9", 2, 9, "P8", 44));
      getPins().add(createNativeDigitalIOPin("P8_45", "GPIO2_6", 2, 6, "P8", 45));
      getPins().add(createNativeDigitalIOPin("P8_46", "GPIO2_27", 2, 27, "P8", 46));

      getPins().add(createNativeDigitalIOPin("P9_11", "UART4_RX", 0, 30, "P9", 11));
      getPins().add(createNativeDigitalIOPin("P9_12", "GPIO1_28", 1, 28, "P9", 12));
      getPins().add(createNativeDigitalIOPin("P9_13", "UART4_TX", 0, 31, "P9", 13));
      getPins().add(createNativeDigitalIOPin("P9_14", "EHRPWM1A", 1, 18, "P9", 14));
      getPins().add(createNativeDigitalIOPin("P9_15", "GPIO1_16", 1, 16, "P9", 15));
      getPins().add(createNativeDigitalIOPin("P9_16", "EHRPWM1B", 1, 19, "P9", 16));
      getPins().add(createNativeDigitalIOPin("P9_17", "GPIO0_5", 0, 5, "P9", 17));
      getPins().add(createNativeDigitalIOPin("P9_18", "GPIO0_4", 0, 4, "P9", 18));
      getPins().add(createNativeDigitalIOPin("P9_19", "GPIO0_15", 0, 15, "P9", 19));
      getPins().add(createNativeDigitalIOPin("P9_20", "GPIO0_14", 0, 14, "P9", 20));
      getPins().add(createNativeDigitalIOPin("P9_21", "UART2TX", 0, 3, "P9", 21));
      getPins().add(createNativeDigitalIOPin("P9_22", "UART2RX", 0, 2, "P9", 22));
      getPins().add(createNativeDigitalIOPin("P9_23", "GPIO1_17", 1, 17, "P9", 23));
      getPins().add(createNativeDigitalIOPin("P9_24", "UART1TX", 0, 12, "P9", 24));
      getPins().add(createNativeDigitalIOPin("P9_25", "GPIO3_21", 3, 21, "P9", 25));
      getPins().add(createNativeDigitalIOPin("P9_26", "UART1RX", 0, 13, "P9", 26));
      getPins().add(createSysFsDigitalIOPin("P9_27", "GPIO3_19", 3, 19, "P9", 27));
      getPins().add(createNativeDigitalIOPin("P9_28", "GPIO3_17", 3, 17, "P9", 28));
      getPins().add(createNativeDigitalIOPin("P9_29", "GPIO3_15", 3, 15, "P9", 29));
      getPins().add(createSysFsDigitalIOPin("P9_30", "GPIO3_16", 3, 16, "P9", 30));
      getPins().add(createNativeDigitalIOPin("P9_31", "EHRPWM0A", 3, 14, "P9", 31));

      getPins().add(createAnalogInputPin("P9_33", "AIN4", 2, 7, "P9", 33, 4));
      getPins().add(createAnalogInputPin("P9_35", "AIN6", 2, 9, "P9", 35, 6));
      getPins().add(createAnalogInputPin("P9_36", "AIN5", 2, 8, "P9", 36, 5));
      getPins().add(createAnalogInputPin("P9_37", "AIN2", 2, 5, "P9", 37, 2));
      getPins().add(createAnalogInputPin("P9_38", "AIN3", 2, 6, "P9", 38, 3));
      getPins().add(createAnalogInputPin("P9_39", "AIN0", 2, 3, "P9", 39, 0));
      getPins().add(createAnalogInputPin("P9_40", "AIN1", 2, 4, "P9", 40, 1));

      getPins().add(createNativeDigitalIOPin("P9_41", "GPIO0_20", 0, 20, "P9", 41));
      getPins().add(createNativeDigitalIOPin("P9_42", "GPIO0_7", 0, 7, "P9", 42));

      getPins().add(new BeagleBonePin("J1_1", "UART01", 0, 0, "J1", 1));
      getPins().add(new BeagleBonePin("J1_2", "UART01", 0, 0, "J1", 2));
      getPins().add(new BeagleBonePin("J1_3", "UART01", 0, 0, "J1", 3));
      getPins().add(new BeagleBonePin("J1_4", "UART01", 0, 0, "J1", 4));
      getPins().add(new BeagleBonePin("J1_5", "UART01", 0, 0, "J1", 5));
      getPins().add(new BeagleBonePin("J1_6", "UART01", 0, 0, "J1", 6));

      addPwmToPin(getPin(BBBNames.EHRPWM0A_P9_21), 0x154, 0x3, BBBNames.EHRPWM0, "B", 1);
      addPwmToPin(getPin(BBBNames.EHRPWM0A_P9_31), 0x190, 0x1, BBBNames.EHRPWM0, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM0B_P9_22), 0x150, 0x3, BBBNames.EHRPWM0, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM0B_P9_29), 0x194, 0x1, BBBNames.EHRPWM0, "B", 1);
      addPwmToPin(getPin(BBBNames.EHRPWM1A_P8_36), 0x0C8, 0x2, BBBNames.EHRPWM1, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM1A_P9_14), 0x048, 0x6, BBBNames.EHRPWM1, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM1B_P8_34), 0x0CC, 0x2, BBBNames.EHRPWM1, "B", 1);
      addPwmToPin(getPin(BBBNames.EHRPWM1B_P9_16), 0x04C, 0x6, BBBNames.EHRPWM1, "B", 1);
      addPwmToPin(getPin(BBBNames.EHRPWM2A_P8_19), 0x020, 0x4, BBBNames.EHRPWM2, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM2A_P8_45), 0x0A0, 0x3, BBBNames.EHRPWM2, "A", 0);
      addPwmToPin(getPin(BBBNames.EHRPWM2B_P8_13), 0x024, 0x4, BBBNames.EHRPWM2, "B", 1);
      addPwmToPin(getPin(BBBNames.EHRPWM2B_P8_46), 0x0a4, 0x3, BBBNames.EHRPWM2, "B", 1);
      addPwmToPin(getPin(BBBNames.ECAPPWM0_P9_42), 0x164, 0x0, BBBNames.ECAPPWM0, "0", 0);
      addPwmToPin(getPin(BBBNames.ECAPPWM2_P9_28), 0x19C, 0x4, BBBNames.ECAPPWM2, "2", 0);

      if (isHdmiEnabled()) {
         blockHdmiPins();
      }

      if (isEmmcEnabled()) {
         blockEmmcPins();
      }
   }

   private Pin createSysFsDigitalIOPin(String name, String internalName, int bank, int pinIndex, String port, int portIndex) {
      BeagleBonePin pin = new BeagleBonePin(name, internalName, bank, pinIndex, port, portIndex);
      pin.addFeature(new DigitalIOFeature(pin, new LinuxDigitalInput(pin), new LinuxDigitalOutput(pin)));
      return pin;
   }

   private Pin createNativeDigitalIOPin(String name, String internalName, int bank, int pinIndex, String port, int portIndex) {
      BeagleBonePin pin = new BeagleBonePin(name, internalName, bank, pinIndex, port, portIndex);
      pin.addFeature(new DigitalIOFeature(pin, new BBBDigitalInput(pin), new BBBDigitalOutput(pin)));
      return pin;
   }

   private void addPwmToPin(Pin pin, int registerAddress, int muxMode, String pwmGroup, String qualifier, int channel) {
      pin.addFeature(new BBBPwm(pin, registerAddress, muxMode, pwmGroup, qualifier, channel));
      pin.addFeatureActivationListener(this);
   }

   private Pin createAnalogInputPin(String name, String internalName, int bank, int pinIndex, String port, int portIndex, int channelId) {
      BeagleBonePin pin = new BeagleBonePin(name, internalName, bank, pinIndex, port, portIndex);
      pin.addFeature(new BBBAnalogInput(pin, channelId));
      return pin;
   }

   private void blockWithHdmiFeature(Pin pin) {
      pin.addFeature(new BBBHdmi(pin));
      pin.activateFeature(BBBHdmi.class);
   }

   private void blockHdmiPins() {
      blockWithHdmiFeature(getPin(BBBNames.P8_27));
      blockWithHdmiFeature(getPin(BBBNames.P8_28));
      blockWithHdmiFeature(getPin(BBBNames.P8_29));
      blockWithHdmiFeature(getPin(BBBNames.P8_30));
      blockWithHdmiFeature(getPin(BBBNames.P8_31));
      blockWithHdmiFeature(getPin(BBBNames.P8_32));
      blockWithHdmiFeature(getPin(BBBNames.P8_33));
      blockWithHdmiFeature(getPin(BBBNames.P8_34));
      blockWithHdmiFeature(getPin(BBBNames.P8_35));
      blockWithHdmiFeature(getPin(BBBNames.P8_36));
      blockWithHdmiFeature(getPin(BBBNames.P8_37));
      blockWithHdmiFeature(getPin(BBBNames.P8_38));
      blockWithHdmiFeature(getPin(BBBNames.P8_39));
      blockWithHdmiFeature(getPin(BBBNames.P8_40));
      blockWithHdmiFeature(getPin(BBBNames.P8_41));
      blockWithHdmiFeature(getPin(BBBNames.P8_42));
      blockWithHdmiFeature(getPin(BBBNames.P8_43));
      blockWithHdmiFeature(getPin(BBBNames.P8_44));
      blockWithHdmiFeature(getPin(BBBNames.P8_45));
      blockWithHdmiFeature(getPin(BBBNames.P8_46));

      blockWithHdmiFeature(getPin(BBBNames.P9_25));
      blockWithHdmiFeature(getPin(BBBNames.P9_28));
      blockWithHdmiFeature(getPin(BBBNames.P9_29));
      blockWithHdmiFeature(getPin(BBBNames.P9_31));
   }

   private void blockWithEmmcFeature(Pin pin) {
      pin.addFeature(new BBBEmmc(pin));
      pin.activateFeature(BBBEmmc.class);
   }

   private void blockEmmcPins() {
      blockWithEmmcFeature(getPin(BBBNames.P8_3));
      blockWithEmmcFeature(getPin(BBBNames.P8_4));
      blockWithEmmcFeature(getPin(BBBNames.P8_5));
      blockWithEmmcFeature(getPin(BBBNames.P8_6));
      blockWithEmmcFeature(getPin(BBBNames.P8_20));
      blockWithEmmcFeature(getPin(BBBNames.P8_21));
      blockWithEmmcFeature(getPin(BBBNames.P8_22));
      blockWithEmmcFeature(getPin(BBBNames.P8_23));
      blockWithEmmcFeature(getPin(BBBNames.P8_24));
      blockWithEmmcFeature(getPin(BBBNames.P8_25));
   }

   private void createBuses() {
      createI2cBuses();
      createSerialPorts();
      createSpiBuses();
   }

   private void createI2cBuses() {
      getI2cBuses().add(new LinuxI2cBus(BBBNames.I2C_0, "/dev/i2c-0"));
      getI2cBuses().add(new LinuxI2cBus(BBBNames.I2C_1, "/dev/i2c-1"));
   }

   private void createSpiBuses() {
      getSpiBuses().add(new LinuxSpiBus(BBBNames.SPI_0_CS0, "/dev/spidev0.0", this));
      getSpiBuses().add(new LinuxSpiBus(BBBNames.SPI_0_CS1, "/dev/spidev0.1", this));
      getSpiBuses().add(new LinuxSpiBus(BBBNames.SPI_1_CS0, "/dev/spidev1.0", this));
      getSpiBuses().add(new LinuxSpiBus(BBBNames.SPI_1_CS1, "/dev/spidev1.1", this));
   }

   private BBBUartPort createSerialPort(String name, String path, String slotName, Pin rx, Pin tx) {
      BBBUartPort uart = new BBBUartPort(name, path, slotName, rx, tx);
      if (uart.isSlotLoaded()) {
         uart.setup();
      }
      return uart;
   }

   private void createSerialPorts() {
      getSerialPorts().add(createSerialPort(BBBNames.UART0, "/dev/ttyO0", "BB-UART0", null, null));
      getSerialPorts().add(createSerialPort(BBBNames.UART1, "/dev/ttyO1", "BB-UART1", getPin(BBBNames.P9_26), getPin(BBBNames.P9_24)));
      getSerialPorts().add(createSerialPort(BBBNames.UART2, "/dev/ttyO2", "BB-UART2", getPin(BBBNames.P9_21), getPin(BBBNames.P9_22)));
      getSerialPorts().add(createSerialPort(BBBNames.UART3, "/dev/ttyO3", "BB-UART3", null, getPin(BBBNames.P9_42)));
      getSerialPorts().add(createSerialPort(BBBNames.UART4, "/dev/ttyO4", "BB-UART4", getPin(BBBNames.P9_11), getPin(BBBNames.P9_13)));
      getSerialPorts().add(createSerialPort(BBBNames.UART5, "/dev/ttyO5", "BB-UART5", getPin(BBBNames.P8_38), getPin(BBBNames.P8_37)));
   }

   private void createProperties() {
      if (isHdmiEnabled()) {
         setProperty(BBBProperties.HDMI_ENABLED, Boolean.TRUE.toString());
      }

      if (isEmmcEnabled()) {
         setProperty(BBBProperties.EMMC_ENABLED, Boolean.TRUE.toString());
      }

      if (new File("/etc/dogtag").exists()) {
         setProperty(BBBProperties.DOGTAG, BulldogUtil.readFileAsString("/etc/dogtag"));
      }

      getProperties().list(System.out);
      System.out.flush();
   }

   @Override
   public String getName() {
      return NAME;
   }

   public void featureActivating(Object o, FeatureActivationEventArgs args) {
   }

   public void featureActivated(Object o, FeatureActivationEventArgs args) {
   }

   public void featureDeactivating(Object o, FeatureActivationEventArgs args) {
   }

   public void featureDeactivated(Object o, FeatureActivationEventArgs args) {
   }

   public void loadSlot(String deviceId) {
      sysFs.createSlotIfNotExists(deviceId);
   }

   public void removeSlot(String deviceId) {
      sysFs.removeSlotOfDevice(deviceId);
   }

   public boolean isHdmiEnabled() {
      int slot = sysFs.getSlotNumber("BB-BONELT-HDMI");
      return sysFs.isSlotLoaded(slot);
   }

   public boolean isEmmcEnabled() {
      int slot = sysFs.getSlotNumber("BB-BONE-EMMC-2G");
      return sysFs.isSlotLoaded(slot);
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy