From 95d8dec24f8489e897271a5758e849ccacd40753 Mon Sep 17 00:00:00 2001 From: Thomas Kohler Date: Sat, 4 Jan 2025 19:35:24 +0100 Subject: [PATCH] fix --- examples/beaglebone_basic_direct_pin.go | 2 +- examples/beaglebone_blink.go | 2 +- examples/beaglebone_blink_usr_led.go | 2 +- examples/beaglebone_blinkm.go | 2 +- examples/beaglebone_button.go | 2 +- examples/beaglebone_direct_pin.go | 2 +- examples/beaglebone_grove_accelerometer.go | 2 +- examples/beaglebone_led_brightness.go | 2 +- ...lebone_led_brightness_with_analog_input.go | 2 +- examples/beaglebone_servo.go | 2 +- examples/beaglepocket_direct_pin.go | 5 +- platforms/{beaglebone => beagleboard}/LICENSE | 0 .../{beaglebone => beagleboard}/README.md | 0 .../beaglebone/beaglebone_adaptor.go | 37 ++--- .../beaglebone/beaglebone_adaptor_test.go | 6 +- .../beaglebone/black_pins.go | 0 platforms/{beaglebone => beagleboard}/doc.go | 8 +- .../pocketbeagle/pocketbeagle_adaptor.go | 113 +++++++++++++++ .../pocketbeagle/pocketbeagle_adaptor_test.go | 58 ++++++++ .../pocketbeagle}/pocketbeagle_pins.go | 132 +++++++++--------- platforms/beaglebone/pocketbeagle_adaptor.go | 69 --------- .../beaglebone/pocketbeagle_adaptor_test.go | 35 ----- platforms/tinkerboard/tinkerboard2/adaptor.go | 7 +- 23 files changed, 281 insertions(+), 209 deletions(-) rename platforms/{beaglebone => beagleboard}/LICENSE (100%) rename platforms/{beaglebone => beagleboard}/README.md (100%) rename platforms/{ => beagleboard}/beaglebone/beaglebone_adaptor.go (88%) rename platforms/{ => beagleboard}/beaglebone/beaglebone_adaptor_test.go (98%) rename platforms/{ => beagleboard}/beaglebone/black_pins.go (100%) rename platforms/{beaglebone => beagleboard}/doc.go (77%) create mode 100644 platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor.go create mode 100644 platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor_test.go rename platforms/{beaglebone => beagleboard/pocketbeagle}/pocketbeagle_pins.go (63%) delete mode 100644 platforms/beaglebone/pocketbeagle_adaptor.go delete mode 100644 platforms/beaglebone/pocketbeagle_adaptor_test.go diff --git a/examples/beaglebone_basic_direct_pin.go b/examples/beaglebone_basic_direct_pin.go index 98b54d87c..5b2216350 100644 --- a/examples/beaglebone_basic_direct_pin.go +++ b/examples/beaglebone_basic_direct_pin.go @@ -10,7 +10,7 @@ import ( "fmt" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_blink.go b/examples/beaglebone_blink.go index 6325f5c78..6a4083f2d 100644 --- a/examples/beaglebone_blink.go +++ b/examples/beaglebone_blink.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_blink_usr_led.go b/examples/beaglebone_blink_usr_led.go index b9d7a3937..3386a8d5b 100644 --- a/examples/beaglebone_blink_usr_led.go +++ b/examples/beaglebone_blink_usr_led.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_blinkm.go b/examples/beaglebone_blinkm.go index bdaf74dec..9cc1dacdb 100644 --- a/examples/beaglebone_blinkm.go +++ b/examples/beaglebone_blinkm.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/i2c" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_button.go b/examples/beaglebone_button.go index 3ee3cc10e..421f817f1 100644 --- a/examples/beaglebone_button.go +++ b/examples/beaglebone_button.go @@ -11,7 +11,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_direct_pin.go b/examples/beaglebone_direct_pin.go index 48ea72907..7dbb8778f 100644 --- a/examples/beaglebone_direct_pin.go +++ b/examples/beaglebone_direct_pin.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_grove_accelerometer.go b/examples/beaglebone_grove_accelerometer.go index ffe6d1b3e..522e626eb 100644 --- a/examples/beaglebone_grove_accelerometer.go +++ b/examples/beaglebone_grove_accelerometer.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/i2c" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_led_brightness.go b/examples/beaglebone_led_brightness.go index f95d90768..c6a4d1b63 100644 --- a/examples/beaglebone_led_brightness.go +++ b/examples/beaglebone_led_brightness.go @@ -12,7 +12,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_led_brightness_with_analog_input.go b/examples/beaglebone_led_brightness_with_analog_input.go index 00b36e8f0..728797163 100644 --- a/examples/beaglebone_led_brightness_with_analog_input.go +++ b/examples/beaglebone_led_brightness_with_analog_input.go @@ -13,7 +13,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/aio" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglebone_servo.go b/examples/beaglebone_servo.go index 325c01400..a6383c888 100644 --- a/examples/beaglebone_servo.go +++ b/examples/beaglebone_servo.go @@ -13,7 +13,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { diff --git a/examples/beaglepocket_direct_pin.go b/examples/beaglepocket_direct_pin.go index 3a3c7ec40..6bc2e4404 100644 --- a/examples/beaglepocket_direct_pin.go +++ b/examples/beaglepocket_direct_pin.go @@ -13,7 +13,7 @@ import ( "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" "gobot.io/x/gobot/v2/platforms/adaptors" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beaglebone/pocketbeagle" ) // Wiring @@ -23,6 +23,7 @@ import ( // LED's: the output pins are wired to the cathode of the LED, the anode is wired with a resistor (70-130Ohm for 20mA) // to VCC // Expected behavior: always one LED is on, the other in opposite state, if button is pressed the state changes +// note: you can also use user LEDs, e.g. "usr0", "usr3" func main() { const ( inPinNum = "P1_34" @@ -30,7 +31,7 @@ func main() { outPinInvertedNum = "P1_36" ) - board := beaglebone.NewPocketBeagleAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum)) + board := pocketbeagle.NewAdaptor(adaptors.WithGpiosActiveLow(outPinInvertedNum)) inPin := gpio.NewDirectPinDriver(board, inPinNum) outPin := gpio.NewDirectPinDriver(board, outPinNum) diff --git a/platforms/beaglebone/LICENSE b/platforms/beagleboard/LICENSE similarity index 100% rename from platforms/beaglebone/LICENSE rename to platforms/beagleboard/LICENSE diff --git a/platforms/beaglebone/README.md b/platforms/beagleboard/README.md similarity index 100% rename from platforms/beaglebone/README.md rename to platforms/beagleboard/README.md diff --git a/platforms/beaglebone/beaglebone_adaptor.go b/platforms/beagleboard/beaglebone/beaglebone_adaptor.go similarity index 88% rename from platforms/beaglebone/beaglebone_adaptor.go rename to platforms/beagleboard/beaglebone/beaglebone_adaptor.go index c32093b34..faeaeb8e1 100644 --- a/platforms/beaglebone/beaglebone_adaptor.go +++ b/platforms/beagleboard/beaglebone/beaglebone_adaptor.go @@ -36,8 +36,7 @@ type Adaptor struct { *adaptors.PWMPinsAdaptor *adaptors.I2cBusAdaptor *adaptors.SpiBusAdaptor - usrLed string - pwmPinTranslate func(string) (string, int, error) + usrLed string } // NewAdaptor returns a new Beaglebone Black/Green Adaptor @@ -52,11 +51,10 @@ func NewAdaptor(opts ...interface{}) *Adaptor { sys := system.NewAccesser(system.WithDigitalPinSysfsAccess()) pwmPinTranslator := adaptors.NewPWMPinTranslator(sys, bbbPwmPinMap) a := &Adaptor{ - name: gobot.DefaultName("BeagleboneBlack"), - sys: sys, - mutex: &sync.Mutex{}, - pwmPinTranslate: pwmPinTranslator.Translate, - usrLed: "/sys/class/leds/beaglebone:green:", + name: gobot.DefaultName("BeagleboneBlack"), + sys: sys, + mutex: &sync.Mutex{}, + usrLed: "/sys/class/leds/beaglebone:green:", } var digitalPinsOpts []adaptors.DigitalPinsOptionApplier @@ -83,7 +81,8 @@ func NewAdaptor(opts ...interface{}) *Adaptor { a.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate) a.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, a.translateAndMuxDigitalPin, digitalPinsOpts...) - a.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.translateAndMuxPWMPin, pwmPinsOpts...) + a.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate), + pwmPinsOpts...) a.I2cBusAdaptor = adaptors.NewI2cBusAdaptor(sys, i2cBusNumberValidator.Validate, defaultI2cBusNumber) a.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber, defaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed) @@ -176,17 +175,21 @@ func (a *Adaptor) translateAndMuxDigitalPin(id string) (string, int, error) { return "", line, nil } -func (a *Adaptor) translateAndMuxPWMPin(id string) (string, int, error) { - path, channel, err := a.pwmPinTranslate(id) - if err != nil { - return path, channel, err - } +func (a *Adaptor) getTranslateAndMuxPWMPinFunc( + pwmPinTranslate func(id string) (string, int, error), +) func(id string) (string, int, error) { + return func(id string) (string, int, error) { + path, channel, err := pwmPinTranslate(id) + if err != nil { + return path, channel, err + } - if err := a.muxPin(id, "pwm"); err != nil { - return "", -1, err - } + if err := a.muxPin(id, "pwm"); err != nil { + return "", -1, err + } - return path, channel, nil + return path, channel, nil + } } func (a *Adaptor) muxPin(pin, cmd string) error { diff --git a/platforms/beaglebone/beaglebone_adaptor_test.go b/platforms/beagleboard/beaglebone/beaglebone_adaptor_test.go similarity index 98% rename from platforms/beaglebone/beaglebone_adaptor_test.go rename to platforms/beagleboard/beaglebone/beaglebone_adaptor_test.go index 36bc70987..b625282de 100644 --- a/platforms/beaglebone/beaglebone_adaptor_test.go +++ b/platforms/beagleboard/beaglebone/beaglebone_adaptor_test.go @@ -89,8 +89,6 @@ func TestNewAdaptor(t *testing.T) { assert.NotNil(t, a.PWMPinsAdaptor) assert.NotNil(t, a.I2cBusAdaptor) assert.NotNil(t, a.SpiBusAdaptor) - assert.Equal(t, bbbPinMap, a.pinMap) - assert.NotNil(t, a.pwmPinTranslate) assert.Equal(t, "/sys/class/leds/beaglebone:green:", a.usrLed) assert.True(t, a.sys.IsSysfsDigitalPinAccess()) // act & assert @@ -341,8 +339,10 @@ func Test_translateAndMuxPWMPin(t *testing.T) { // arrange muxPath := fmt.Sprintf("/sys/devices/platform/ocp/ocp:%s_pinmux/state", name) fs.Add(muxPath) + pwmPinTranslator := adaptors.NewPWMPinTranslator(a.sys, bbbPwmPinMap) + translateAndMuxPWMPin := a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate) // act - path, channel, err := a.translateAndMuxPWMPin(name) + path, channel, err := translateAndMuxPWMPin(name) // assert assert.Equal(t, tc.wantErr, err) assert.Equal(t, tc.wantDir, path) diff --git a/platforms/beaglebone/black_pins.go b/platforms/beagleboard/beaglebone/black_pins.go similarity index 100% rename from platforms/beaglebone/black_pins.go rename to platforms/beagleboard/beaglebone/black_pins.go diff --git a/platforms/beaglebone/doc.go b/platforms/beagleboard/doc.go similarity index 77% rename from platforms/beaglebone/doc.go rename to platforms/beagleboard/doc.go index f4834243e..2dfb6eb39 100644 --- a/platforms/beaglebone/doc.go +++ b/platforms/beagleboard/doc.go @@ -1,5 +1,5 @@ /* -Package beaglebone provides the Gobot adaptor for the Beaglebone Black/Green, as well as a +Package beagleboard provides the Gobot adaptor for the Beaglebone Black/Green, as well as a separate Adaptor for the PocketBeagle. Installing: @@ -15,7 +15,7 @@ Example: "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" - "gobot.io/x/gobot/v2/platforms/beaglebone" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" ) func main() { @@ -42,6 +42,6 @@ Example: } For more information refer to the beaglebone README: -https://github.com/hybridgroup/gobot/blob/release/platforms/beaglebone/README.md +https://github.com/hybridgroup/gobot/blob/release/platforms/beagleboard/README.md */ -package beaglebone // import "gobot.io/x/gobot/v2/platforms/beaglebone" +package beagleboard // import "gobot.io/x/gobot/v2/platforms/beagleboard" diff --git a/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor.go b/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor.go new file mode 100644 index 000000000..359967d50 --- /dev/null +++ b/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor.go @@ -0,0 +1,113 @@ +package pocketbeagle + +import ( + "fmt" + "os" + + "gobot.io/x/gobot/v2" + "gobot.io/x/gobot/v2/platforms/adaptors" + "gobot.io/x/gobot/v2/platforms/beagleboard/beaglebone" + "gobot.io/x/gobot/v2/system" +) + +const pwmPeriodDefault = 500000 // 0.5 ms = 2 kHz + +// PocketBeagleAdaptor is the Gobot Adaptor for the PocketBeagle +// For more information check out: +// +// http://beagleboard.org/pocket +type PocketBeagleAdaptor struct { + *beaglebone.Adaptor + sys *system.Accesser +} + +// NewAdaptor creates a new Adaptor for the PocketBeagle +// tested with sysfs and cdev on "Linux BeagleBone 5.10.168-ti-r71" +// +// Optional parameters: +// +// adaptors.WithGpioCdevAccess(): use character device driver instead of sysfs +// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.# +// adaptors.WithGpiosPullUp(pins): will be silently ignored (for some pins) +// adaptors.WithGpioDebounce(inPinNum, debounceTime): is only supported for debounceTime < 8ms +// +// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor] +func NewAdaptor(opts ...interface{}) *PocketBeagleAdaptor { + sys := system.NewAccesser() + a := PocketBeagleAdaptor{ + Adaptor: beaglebone.NewAdaptor(opts...), + sys: sys, + } + + a.SetName(gobot.DefaultName("PocketBeagle")) + + var digitalPinsOpts []adaptors.DigitalPinsOptionApplier + pwmPinsOpts := []adaptors.PwmPinsOptionApplier{adaptors.WithPWMDefaultPeriod(pwmPeriodDefault)} + for _, opt := range opts { + switch o := opt.(type) { + case adaptors.DigitalPinsOptionApplier: + digitalPinsOpts = append(digitalPinsOpts, o) + case adaptors.PwmPinsOptionApplier: + pwmPinsOpts = append(pwmPinsOpts, o) + case func(system.Optioner): + // do nothing, already applied on NewAdaptor(opts) + default: + panic(fmt.Sprintf("'%s' can not be applied on adaptor '%s'", opt, a.Name())) + } + } + + analogPinTranslator := adaptors.NewAnalogPinTranslator(sys, analogPinMap) + digitalPinTranslator := adaptors.NewDigitalPinTranslator(sys, gpioPinDefinitions) + pwmPinTranslator := adaptors.NewPWMPinTranslator(sys, pwmPinMap) + + a.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(sys, analogPinTranslator.Translate) + a.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(sys, + a.getTranslateAndMuxDigitalPinFunc(digitalPinTranslator.Translate), digitalPinsOpts...) + a.PWMPinsAdaptor = adaptors.NewPWMPinsAdaptor(sys, a.getTranslateAndMuxPWMPinFunc(pwmPinTranslator.Translate), + pwmPinsOpts...) + + return &a +} + +func (a *PocketBeagleAdaptor) getTranslateAndMuxDigitalPinFunc( + digitalPinTranslate func(id string) (string, int, error), +) func(id string) (string, int, error) { + return func(id string) (string, int, error) { + if a.sys.IsSysfsDigitalPinAccess() { + // mux is done by id, not by line + if err := a.muxPin(id, "gpio"); err != nil { + return "", -1, err + } + } + + return digitalPinTranslate(id) + } +} + +func (a *PocketBeagleAdaptor) getTranslateAndMuxPWMPinFunc( + pwmPinTranslate func(id string) (string, int, error), +) func(id string) (string, int, error) { + return func(id string) (string, int, error) { + path, channel, err := pwmPinTranslate(id) + if err != nil { + return path, channel, err + } + + if err := a.muxPin(id, "pwm"); err != nil { + return "", -1, err + } + + return path, channel, nil + } +} + +func (a *PocketBeagleAdaptor) muxPin(pin, cmd string) error { + path := fmt.Sprintf("/sys/devices/platform/ocp/ocp:%s_pinmux/state", pin) + fi, e := a.sys.OpenFile(path, os.O_WRONLY, 0o666) + defer fi.Close() //nolint:staticcheck // for historical reasons + if e != nil { + return e + } + _, e = fi.WriteString(cmd) + return e +} diff --git a/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor_test.go b/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor_test.go new file mode 100644 index 000000000..40897bc58 --- /dev/null +++ b/platforms/beagleboard/pocketbeagle/pocketbeagle_adaptor_test.go @@ -0,0 +1,58 @@ +package pocketbeagle + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gobot.io/x/gobot/v2/platforms/adaptors" +) + +func TestNewAdaptor(t *testing.T) { + // arrange & act + a := NewAdaptor() + // assert + assert.IsType(t, &PocketBeagleAdaptor{}, a) + assert.True(t, strings.HasPrefix(a.Name(), "PocketBeagle")) + assert.NotNil(t, a.sys) + assert.NotNil(t, a.AnalogPinsAdaptor) + assert.NotNil(t, a.DigitalPinsAdaptor) + assert.NotNil(t, a.PWMPinsAdaptor) + assert.NotNil(t, a.I2cBusAdaptor) + assert.NotNil(t, a.SpiBusAdaptor) + assert.True(t, a.sys.IsCdevDigitalPinAccess()) +} + +func TestNewAdaptorWithOption(t *testing.T) { + // arrange & act + a := NewAdaptor(adaptors.WithGpioSysfsAccess()) + // assert + require.NoError(t, a.Connect()) + assert.True(t, a.sys.IsSysfsDigitalPinAccess()) +} + +func TestDigitalIO(t *testing.T) { + // some basic tests, further tests are done in "digitalpinsadaptor.go" + // arrange + a := NewAdaptor() + require.NoError(t, a.Connect()) + dpa := a.sys.UseMockDigitalPinAccess() + require.True(t, a.sys.IsCdevDigitalPinAccess()) + // act & assert write + err := a.DigitalWrite("P1_02", 1) + require.NoError(t, err) + assert.Equal(t, []int{1}, dpa.Written("gpiochip2", "23")) + // arrange, act & assert read + dpa.UseValue("gpiochip3", "19", 2) + i, err := a.DigitalRead("P2_34") + require.NoError(t, err) + assert.Equal(t, 2, i) + // act and assert unknown pin + require.ErrorContains(t, a.DigitalWrite("99", 1), "'99' is not a valid id for a digital pin") + // act and assert finalize + require.NoError(t, a.Finalize()) + assert.Equal(t, 0, dpa.Exported("gpiochip2", "23")) + assert.Equal(t, 0, dpa.Exported("gpiochip3", "19")) +} diff --git a/platforms/beaglebone/pocketbeagle_pins.go b/platforms/beagleboard/pocketbeagle/pocketbeagle_pins.go similarity index 63% rename from platforms/beaglebone/pocketbeagle_pins.go rename to platforms/beagleboard/pocketbeagle/pocketbeagle_pins.go index cfc2d1347..d9d67eb7a 100644 --- a/platforms/beaglebone/pocketbeagle_pins.go +++ b/platforms/beagleboard/pocketbeagle/pocketbeagle_pins.go @@ -1,48 +1,46 @@ -package beaglebone +package pocketbeagle import "gobot.io/x/gobot/v2/platforms/adaptors" -// notes for character device -// pins: A=0+Nr, B=8+Nr, C=16+Nr // tested: am335x-debian-11.7-iot-armhf-2023-09-02-4gb, OK: work as input and output, IN: work only as input -var pocketBeagleGpioPinDefinitions = adaptors.DigitalPinDefinitions{ - //gpiochip0 - 32 lines: - //line 0: "NC" unused input active-high - //line 1: "NC" unused input active-high +var gpioPinDefinitions = adaptors.DigitalPinDefinitions{ + // gpiochip0 - 32 lines: + // line 0: "NC" unused input active-high + // line 1: "NC" unused input active-high "P1_08": {Sysfs: 2, Cdev: adaptors.CdevPin{Chip: 0, Line: 2}}, // P1.08_SPI0_CLK - ? "P1_10": {Sysfs: 3, Cdev: adaptors.CdevPin{Chip: 0, Line: 3}}, // P1.10_SPI0_MISO - ? "P1_12": {Sysfs: 4, Cdev: adaptors.CdevPin{Chip: 0, Line: 4}}, // P1.12_SPI0_MOSI - ? "P1_06": {Sysfs: 5, Cdev: adaptors.CdevPin{Chip: 0, Line: 5}}, // P1.06_SPI0_CS - ? - //line 6: "[MMC0_CD]" "cd" input active-low [used] + // line 6: "[MMC0_CD]" "cd" input active-low [used] "P2_29": {Sysfs: 7, Cdev: adaptors.CdevPin{Chip: 0, Line: 7}}, // P2.29_SPI1_CLK - ? - //line 8: "[SYSBOOT 12]" unused input active-high - //line 9: "[SYSBOOT 13]" unused input active-high - //line 10: "[SYSBOOT 14]" unused input active-high - //line 11: "[SYSBOOT 15]" unused input active-high + // line 8: "[SYSBOOT 12]" unused input active-high + // line 9: "[SYSBOOT 13]" unused input active-high + // line 10: "[SYSBOOT 14]" unused input active-high + // line 11: "[SYSBOOT 15]" unused input active-high "P1_26": {Sysfs: 12, Cdev: adaptors.CdevPin{Chip: 0, Line: 12}}, // P1.26_I2C2_SDA - ? "P1_28": {Sysfs: 13, Cdev: adaptors.CdevPin{Chip: 0, Line: 13}}, // P1.28_I2C2_SCL - ? "P2_11": {Sysfs: 14, Cdev: adaptors.CdevPin{Chip: 0, Line: 14}}, // P2.11_I2C1_SDA - ? "P2_09": {Sysfs: 15, Cdev: adaptors.CdevPin{Chip: 0, Line: 15}}, // P2.09_I2C1_SCL - ? - //line 16: "NC" unused input active-high - //line 17: "NC" unused input active-high - //line 18: "NC" unused input active-high + // line 16: "NC" unused input active-high + // line 17: "NC" unused input active-high + // line 18: "NC" unused input active-high "P2_31": {Sysfs: 19, Cdev: adaptors.CdevPin{Chip: 0, Line: 19}}, // P2.31_SPI1_CS - ? "P1_20": {Sysfs: 20, Cdev: adaptors.CdevPin{Chip: 0, Line: 20}}, // P1.20_PRU0.16 - ? - //line 21: "NC" unused input active-high - //line 22: "NC" unused input active-high + // line 21: "NC" unused input active-high + // line 22: "NC" unused input active-high "P2_03": {Sysfs: 23, Cdev: adaptors.CdevPin{Chip: 0, Line: 23}}, // P2.03 - ? - //line 24: "NC" unused input active-high - //line 25: "NC" unused input active-high + // line 24: "NC" unused input active-high + // line 25: "NC" unused input active-high "P1_34": {Sysfs: 26, Cdev: adaptors.CdevPin{Chip: 0, Line: 26}}, // P1.34 - ? "P2_19": {Sysfs: 27, Cdev: adaptors.CdevPin{Chip: 0, Line: 27}}, // P2.19 - ? - //line 28: "NC" unused input active-high - //line 29: "NC" unused input active-high + // line 28: "NC" unused input active-high + // line 29: "NC" unused input active-high "P2_05": {Sysfs: 30, Cdev: adaptors.CdevPin{Chip: 0, Line: 30}}, // P2.05_UART4_RX - ? "P2_07": {Sysfs: 31, Cdev: adaptors.CdevPin{Chip: 0, Line: 31}}, // P2.07_UART4_TX - ? - //gpiochip1 - 32 lines: - //line 0: "NC" unused input active-high - //... - //line 7: "NC" unused input active-high + // gpiochip1 - 32 lines: + // line 0: "NC" unused input active-high + // ... + // line 7: "NC" unused input active-high "P2_27": {Sysfs: 40, Cdev: adaptors.CdevPin{Chip: 1, Line: 8}}, // P2.27_SPI1_MISO- ? "P2_25": {Sysfs: 41, Cdev: adaptors.CdevPin{Chip: 1, Line: 9}}, // P2.25_SPI1_MOSI - ? "P1_32": {Sysfs: 42, Cdev: adaptors.CdevPin{Chip: 1, Line: 10}}, // P1.32_UART0_RX - ? @@ -51,10 +49,10 @@ var pocketBeagleGpioPinDefinitions = adaptors.DigitalPinDefinitions{ "P2_33": {Sysfs: 45, Cdev: adaptors.CdevPin{Chip: 1, Line: 13}}, // P2.33 - ? "P2_22": {Sysfs: 46, Cdev: adaptors.CdevPin{Chip: 1, Line: 14}}, // P2.22 - ? "P2_18": {Sysfs: 47, Cdev: adaptors.CdevPin{Chip: 1, Line: 15}}, // P2.18 - ? - //line 16: "NC" unused input active-high - //line 17: "NC" unused input active-high + // line 16: "NC" unused input active-high + // line 17: "NC" unused input active-high "P2_01": {Sysfs: 50, Cdev: adaptors.CdevPin{Chip: 1, Line: 18}}, // P2.01_PWM1A - ? - //line 19: "NC" unused input active-high + // line 19: "NC" unused input active-high "P2_10": {Sysfs: 52, Cdev: adaptors.CdevPin{Chip: 1, Line: 20}}, // P2.10- ? "usr0": {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 21}}, // USR LED 0 (beaglebone:green:usr0) - ? "usr1": {Sysfs: -1, Cdev: adaptors.CdevPin{Chip: 1, Line: 22}}, // USR LED 1 (beaglebone:green:usr1) - ? @@ -64,46 +62,46 @@ var pocketBeagleGpioPinDefinitions = adaptors.DigitalPinDefinitions{ "P2_04": {Sysfs: 58, Cdev: adaptors.CdevPin{Chip: 1, Line: 26}}, // P2.04 - ? "P2_02": {Sysfs: 59, Cdev: adaptors.CdevPin{Chip: 1, Line: 27}}, // P2.02 - ? "P2_08": {Sysfs: 60, Cdev: adaptors.CdevPin{Chip: 1, Line: 28}}, // P2.08 - ? - //line 29: "NC" unused input active-high - //line 30: "NC" unused input active-high - //line 31: "NC" unused input active-high - //gpiochip2 - 32 lines: + // line 29: "NC" unused input active-high + // line 30: "NC" unused input active-high + // line 31: "NC" unused input active-high + // gpiochip2 - 32 lines: "P2_20": {Sysfs: 64, Cdev: adaptors.CdevPin{Chip: 2, Line: 0}}, // P2.20 - ? "P2_17": {Sysfs: 65, Cdev: adaptors.CdevPin{Chip: 2, Line: 1}}, // P2.17 - ? - //line 2: "NC" unused input active-high - //line 3: "NC" unused input active-high - //line 4: "NC" unused input active-high - //line 5: "[EEPROM_WP]" unused input active-high - //line 6: "[SYSBOOT 0]" unused input active-high - //line 7: "[SYSBOOT 1]" unused input active-high - //line 8: "[SYSBOOT 2]" unused input active-high - //line 9: "[SYSBOOT 3]" unused input active-high - //line 10: "[SYSBOOT 4]" unused input active-high - //line 11: "[SYSBOOT 5]" unused input active-high - //line 12: "[SYSBOOT 6]" unused input active-high - //line 13: "[SYSBOOT 7]" unused input active-high - //line 14: "[SYSBOOT 8]" unused input active-high - //line 15: "[SYSBOOT 9]" unused input active-high - //line 16: "[SYSBOOT 10]" unused input active-high - //line 17: "[SYSBOOT 11]" unused input active-high - //line 18: "NC" unused input active-high - //... - //line 21: "NC" unused input active-high + // line 2: "NC" unused input active-high + // line 3: "NC" unused input active-high + // line 4: "NC" unused input active-high + // line 5: "[EEPROM_WP]" unused input active-high + // line 6: "[SYSBOOT 0]" unused input active-high + // line 7: "[SYSBOOT 1]" unused input active-high + // line 8: "[SYSBOOT 2]" unused input active-high + // line 9: "[SYSBOOT 3]" unused input active-high + // line 10: "[SYSBOOT 4]" unused input active-high + // line 11: "[SYSBOOT 5]" unused input active-high + // line 12: "[SYSBOOT 6]" unused input active-high + // line 13: "[SYSBOOT 7]" unused input active-high + // line 14: "[SYSBOOT 8]" unused input active-high + // line 15: "[SYSBOOT 9]" unused input active-high + // line 16: "[SYSBOOT 10]" unused input active-high + // line 17: "[SYSBOOT 11]" unused input active-high + // line 18: "NC" unused input active-high + // ... + // line 21: "NC" unused input active-high "P2_35": {Sysfs: 86, Cdev: adaptors.CdevPin{Chip: 2, Line: 22}}, // P2.35_AIN5 - ? "P1_02": {Sysfs: 87, Cdev: adaptors.CdevPin{Chip: 2, Line: 23}}, // P1.02_AIN6 - ? "P1_35": {Sysfs: 88, Cdev: adaptors.CdevPin{Chip: 2, Line: 24}}, // P1.35_PRU1.10 - ? "P1_04": {Sysfs: 89, Cdev: adaptors.CdevPin{Chip: 2, Line: 25}}, // P1.04_PRU1.11 - ? - //line 26: "[MMC0_DAT3]" unused input active-high - //line 27: "[MMC0_DAT2]" unused input active-high - //line 28: "[MMC0_DAT1]" unused input active-high - //line 29: "[MMC0_DAT0]" unused input active-high - //line 30: "[MMC0_CLK]" unused input active-high - //line 31: "[MMC0_CMD]" unused input active-high - //gpiochip3 - 32 lines: - //line 0: "NC" unused input active-high - //... - //line 4: "NC" unused input active-high - //line 13: "P1.03 [USB1]" unused input active-high + // line 26: "[MMC0_DAT3]" unused input active-high + // line 27: "[MMC0_DAT2]" unused input active-high + // line 28: "[MMC0_DAT1]" unused input active-high + // line 29: "[MMC0_DAT0]" unused input active-high + // line 30: "[MMC0_CLK]" unused input active-high + // line 31: "[MMC0_CMD]" unused input active-high + // gpiochip3 - 32 lines: + // line 0: "NC" unused input active-high + // ... + // line 4: "NC" unused input active-high + // line 13: "P1.03 [USB1]" unused input active-high "P1_36": {Sysfs: 110, Cdev: adaptors.CdevPin{Chip: 3, Line: 14}}, // P1.36_PWM0A - ? "P1_33": {Sysfs: 111, Cdev: adaptors.CdevPin{Chip: 3, Line: 15}}, // P1.33_PRU0.1 - ? "P2_32": {Sysfs: 112, Cdev: adaptors.CdevPin{Chip: 3, Line: 16}}, // P2.32_PRU0.2 - ? @@ -112,9 +110,9 @@ var pocketBeagleGpioPinDefinitions = adaptors.DigitalPinDefinitions{ "P2_34": {Sysfs: 115, Cdev: adaptors.CdevPin{Chip: 3, Line: 19}}, // P2.34_PRU0.5 - ? "P2_28": {Sysfs: 116, Cdev: adaptors.CdevPin{Chip: 3, Line: 20}}, // P2.28_PRU0.6- ? "P1_29": {Sysfs: 117, Cdev: adaptors.CdevPin{Chip: 3, Line: 21}}, // P1.29_PRU0.7 - ? - //line 22: "NC" unused input active-high - //... - //line 31: "NC" unused input active-high + // line 22: "NC" unused input active-high + // ... + // line 31: "NC" unused input active-high // P1_01 - VIN; P1_03 - USB1-V_EN; P1_05 - USB1-VBUS; P1_07 - USB1-VIN; P1_09 - USB1-DN; P1_11 - USB1-DP; // P1_13 - USB1-ID; P1_14 - 3.3V; P1_15 - USB1-GND; P1_16 - GND; P1_16 - AIN-VREF-; P1_18 - AIN-VREF+; P1_19 - AIO0 @@ -122,7 +120,7 @@ var pocketBeagleGpioPinDefinitions = adaptors.DigitalPinDefinitions{ // P2_14 - BAT-VIN; P2_15 - GND; P2_16 - BAT-TEMP; P2_21 - GND; P2_23 - 3.3V; P2_26 - NRST; P2_36 - AIO7 } -var pocketBeaglePwmPinMap = adaptors.PWMPinDefinitions{ +var pwmPinMap = adaptors.PWMPinDefinitions{ "P1_33": {Dir: "/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/", DirRegexp: "pwmchip[0-9]+$", Channel: 1}, "P1_36": {Dir: "/sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/", DirRegexp: "pwmchip[0-9]+$", Channel: 0}, @@ -130,7 +128,7 @@ var pocketBeaglePwmPinMap = adaptors.PWMPinDefinitions{ "P2_3": {Dir: "/sys/devices/platform/ocp/48304000.epwmss/48304200.pwm/pwm/", DirRegexp: "pwmchip[0-9]+$", Channel: 1}, } -var pocketBeagleAnalogPinMap = adaptors.AnalogPinDefinitions{ +var analogPinMap = adaptors.AnalogPinDefinitions{ "P1_19": {Path: "/sys/bus/iio/devices/iio:device0/in_voltage0_raw", W: false, ReadBufLen: 1024}, "P1_21": {Path: "/sys/bus/iio/devices/iio:device0/in_voltage1_raw", W: false, ReadBufLen: 1024}, "P1_23": {Path: "/sys/bus/iio/devices/iio:device0/in_voltage2_raw", W: false, ReadBufLen: 1024}, diff --git a/platforms/beaglebone/pocketbeagle_adaptor.go b/platforms/beaglebone/pocketbeagle_adaptor.go deleted file mode 100644 index 14aa53519..000000000 --- a/platforms/beaglebone/pocketbeagle_adaptor.go +++ /dev/null @@ -1,69 +0,0 @@ -package beaglebone - -import ( - "fmt" - - "gobot.io/x/gobot/v2" - "gobot.io/x/gobot/v2/platforms/adaptors" - "gobot.io/x/gobot/v2/system" -) - -// PocketBeagleAdaptor is the Gobot Adaptor for the PocketBeagle -// For more information check out: -// -// http://beagleboard.org/pocket -type PocketBeagleAdaptor struct { - *Adaptor -} - -// NewPocketBeagleAdaptor creates a new Adaptor for the PocketBeagle -// tested with sysfs and cdev on "Linux BeagleBone 5.10.168-ti-r71" -// -// Optional parameters: -// -// adaptors.WithGpioCdevAccess(): use character device driver instead of sysfs -// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.# -// adaptors.WithGpiosPullUp(pins): will be silently ignored (for some pins) -// adaptors.WithGpioDebounce(inPinNum, debounceTime): is only supported for debounceTime < 8ms -// -// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor] -func NewPocketBeagleAdaptor(opts ...interface{}) *PocketBeagleAdaptor { - a := NewAdaptor(opts...) - system.WithDigitalPinCdevAccess()(a.sys) - a.SetName(gobot.DefaultName("PocketBeagle")) - - var digitalPinsOpts []adaptors.DigitalPinsOptionApplier - for _, opt := range opts { - switch o := opt.(type) { - case adaptors.DigitalPinsOptionApplier: - digitalPinsOpts = append(digitalPinsOpts, o) - case func(system.Optioner): - //do nothing, already applied on NewAdaptor(opts) - default: - panic(fmt.Sprintf("'%s' can not be applied on adaptor '%s'", opt, a.name)) - } - } - - analogPinTranslator := adaptors.NewAnalogPinTranslator(a.sys, pocketBeagleAnalogPinMap) - digitalPinTranslator := adaptors.NewDigitalPinTranslator(a.sys, pocketBeagleGpioPinDefinitions) - pwmPinTranslator := adaptors.NewPWMPinTranslator(a.sys, pocketBeaglePwmPinMap) - - translateAndMuxDigitalPin := func(id string) (string, int, error) { - if a.sys.IsSysfsDigitalPinAccess() { - // mux is done by id, not by line - if err := a.muxPin(id, "gpio"); err != nil { - return "", -1, err - } - } - - return digitalPinTranslator.Translate(id) - } - - a.AnalogPinsAdaptor = adaptors.NewAnalogPinsAdaptor(a.sys, analogPinTranslator.Translate) - a.DigitalPinsAdaptor = adaptors.NewDigitalPinsAdaptor(a.sys, translateAndMuxDigitalPin, digitalPinsOpts...) - a.pwmPinTranslate = pwmPinTranslator.Translate - - return &PocketBeagleAdaptor{ - Adaptor: a, - } -} diff --git a/platforms/beaglebone/pocketbeagle_adaptor_test.go b/platforms/beaglebone/pocketbeagle_adaptor_test.go deleted file mode 100644 index 1b71259be..000000000 --- a/platforms/beaglebone/pocketbeagle_adaptor_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package beaglebone - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "gobot.io/x/gobot/v2/platforms/adaptors" -) - -func TestNewPocketBeagleAdaptor(t *testing.T) { - // arrange & act - a := NewPocketBeagleAdaptor() - // assert - assert.IsType(t, &PocketBeagleAdaptor{}, a) - assert.True(t, strings.HasPrefix(a.Name(), "PocketBeagle")) - assert.NotNil(t, a.sys) - assert.NotNil(t, a.AnalogPinsAdaptor) - assert.NotNil(t, a.pwmPinTranslate) - assert.Equal(t, pocketBeaglePinMap, a.pinMap) - assert.Equal(t, "/sys/class/leds/beaglebone:green:", a.usrLed) - assert.True(t, a.sys.IsSysfsDigitalPinAccess()) -} - -func TestNewPocketBeagleAdaptorWithOption(t *testing.T) { - // arrange & act - a := NewPocketBeagleAdaptor(adaptors.WithGpioCdevAccess()) - // we have to mock the fs at this point to ensure the option can be applied on each test environment - a.sys.UseMockFilesystem([]string{"/dev/gpiochip0"}) - // assert - require.NoError(t, a.Connect()) - assert.True(t, a.sys.IsCdevDigitalPinAccess()) -} diff --git a/platforms/tinkerboard/tinkerboard2/adaptor.go b/platforms/tinkerboard/tinkerboard2/adaptor.go index 7e283d5f8..d3d113ca3 100644 --- a/platforms/tinkerboard/tinkerboard2/adaptor.go +++ b/platforms/tinkerboard/tinkerboard2/adaptor.go @@ -36,7 +36,10 @@ type Tinkerboard2Adaptor struct { // Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor] func NewAdaptor(opts ...interface{}) *Tinkerboard2Adaptor { sys := system.NewAccesser() - a := tinkerboard.NewAdaptor(opts...) + a := Tinkerboard2Adaptor{ + Adaptor: tinkerboard.NewAdaptor(opts...), + sys: sys, + } a.SetName(gobot.DefaultName("Tinker Board 2")) var digitalPinsOpts []adaptors.DigitalPinsOptionApplier @@ -66,5 +69,5 @@ func NewAdaptor(opts ...interface{}) *Tinkerboard2Adaptor { a.SpiBusAdaptor = adaptors.NewSpiBusAdaptor(sys, spiBusNumberValidator.Validate, defaultSpiBusNumber, defaultSpiChipNumber, defaultSpiMode, defaultSpiBitsNumber, defaultSpiMaxSpeed) - return &Tinkerboard2Adaptor{Adaptor: a, sys: sys} + return &a }