Compare commits

...

4 Commits

Author SHA1 Message Date
soypat 0eabf16c36 undo epd2in66b Configure method deletion 2025-11-10 16:10:07 -03:00
soypat f9db7a6d0f fix type 2025-11-10 15:58:48 -03:00
soypat d6a420bb08 add missing easytepper_go.go file 2025-11-10 15:55:27 -03:00
soypat c7229ddba6 bring #753 changes over to new pin HAL 2025-11-10 15:43:56 -03:00
33 changed files with 566 additions and 404 deletions
+7 -3
View File
@@ -5,9 +5,10 @@ package apa102 // import "tinygo.org/x/drivers/apa102"
import ( import (
"image/color" "image/color"
"machine"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
const ( const (
@@ -37,8 +38,11 @@ func New(b drivers.SPI) *Device {
// NewSoftwareSPI returns a new APA102 driver that will use a software based // NewSoftwareSPI returns a new APA102 driver that will use a software based
// implementation of the SPI protocol. // implementation of the SPI protocol.
func NewSoftwareSPI(sckPin, sdoPin machine.Pin, delay uint32) *Device { func NewSoftwareSPI(sckPin, sdoPin pin.Output, delay uint32) *Device {
return New(&bbSPI{SCK: sckPin, SDO: sdoPin, Delay: delay}) return New(&bbSPI{SCK: sckPin.Set, SDO: sdoPin.Set, Delay: delay, configurePins: func() {
legacy.ConfigurePinOut(sckPin)
legacy.ConfigurePinOut(sdoPin)
}})
} }
// WriteColors writes the given RGBA color slice out using the APA102 protocol. // WriteColors writes the given RGBA color slice out using the APA102 protocol.
+12 -6
View File
@@ -1,6 +1,9 @@
package apa102 package apa102
import "machine" import (
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
)
// bbSPI is a dumb bit-bang implementation of SPI protocol that is hardcoded // bbSPI is a dumb bit-bang implementation of SPI protocol that is hardcoded
// to mode 0 and ignores trying to receive data. Just enough for the APA102. // to mode 0 and ignores trying to receive data. Just enough for the APA102.
@@ -8,15 +11,18 @@ import "machine"
// most purposes other than the APA102 package. It might be desirable to make // most purposes other than the APA102 package. It might be desirable to make
// this more generic and include it in the TinyGo "machine" package instead. // this more generic and include it in the TinyGo "machine" package instead.
type bbSPI struct { type bbSPI struct {
SCK machine.Pin SCK pin.OutputFunc
SDO machine.Pin SDO pin.OutputFunc
Delay uint32 Delay uint32
configurePins func()
} }
// Configure sets up the SCK and SDO pins as outputs and sets them low // Configure sets up the SCK and SDO pins as outputs and sets them low
func (s *bbSPI) Configure() { func (s *bbSPI) Configure() {
s.SCK.Configure(machine.PinConfig{Mode: machine.PinOutput}) if s.configurePins == nil {
s.SDO.Configure(machine.PinConfig{Mode: machine.PinOutput}) panic(legacy.ErrConfigBeforeInstantiated)
}
s.configurePins()
s.SCK.Low() s.SCK.Low()
s.SDO.Low() s.SDO.Low()
if s.Delay == 0 { if s.Delay == 0 {
+31 -24
View File
@@ -1,31 +1,36 @@
package bmi160 package bmi160
import ( import (
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
// DeviceSPI is the SPI interface to a BMI160 accelerometer/gyroscope. There is // DeviceSPI is the SPI interface to a BMI160 accelerometer/gyroscope. There is
// also an I2C interface, but it is not yet supported. // also an I2C interface, but it is not yet supported.
type DeviceSPI struct { type DeviceSPI struct {
// Chip select pin // Chip select pin
CSB machine.Pin csb pin.OutputFunc
buf [7]byte buf [7]byte
// SPI bus (requires chip select to be usable). // SPI bus (requires chip select to be usable).
Bus drivers.SPI bus drivers.SPI
configurePins func()
} }
// NewSPI returns a new device driver. The pin and SPI interface are not // NewSPI returns a new device driver. The pin and SPI interface are not
// touched, provide a fully configured SPI object and call Configure to start // touched, provide a fully configured SPI object and call Configure to start
// using this device. // using this device.
func NewSPI(csb machine.Pin, spi drivers.SPI) *DeviceSPI { func NewSPI(csb pin.Output, spi drivers.SPI) *DeviceSPI {
return &DeviceSPI{ return &DeviceSPI{
CSB: csb, // chip select csb: csb.Set, // chip select
Bus: spi, bus: spi,
configurePins: func() {
legacy.ConfigurePinOut(csb)
},
} }
} }
@@ -33,9 +38,11 @@ func NewSPI(csb machine.Pin, spi drivers.SPI) *DeviceSPI {
// configures the BMI160, but it does not configure the SPI interface (it is // configures the BMI160, but it does not configure the SPI interface (it is
// assumed to be up and running). // assumed to be up and running).
func (d *DeviceSPI) Configure() error { func (d *DeviceSPI) Configure() error {
d.CSB.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.configurePins == nil {
d.CSB.High() return legacy.ErrConfigBeforeInstantiated
}
d.configurePins()
d.csb.High()
// The datasheet recommends doing a register read from address 0x7F to get // The datasheet recommends doing a register read from address 0x7F to get
// SPI communication going: // SPI communication going:
// > If CSB sees a rising edge after power-up, the BMI160 interface switches // > If CSB sees a rising edge after power-up, the BMI160 interface switches
@@ -86,9 +93,9 @@ func (d *DeviceSPI) ReadTemperature() (temperature int32, err error) {
data[0] = 0x80 | reg_TEMPERATURE_0 data[0] = 0x80 | reg_TEMPERATURE_0
data[1] = 0 data[1] = 0
data[2] = 0 data[2] = 0
d.CSB.Low() d.csb.Low()
err = d.Bus.Tx(data, data) err = d.bus.Tx(data, data)
d.CSB.High() d.csb.High()
if err != nil { if err != nil {
return return
} }
@@ -123,9 +130,9 @@ func (d *DeviceSPI) ReadAcceleration() (x int32, y int32, z int32, err error) {
for i := 1; i < len(data); i++ { for i := 1; i < len(data); i++ {
data[i] = 0 data[i] = 0
} }
d.CSB.Low() d.csb.Low()
err = d.Bus.Tx(data, data) err = d.bus.Tx(data, data)
d.CSB.High() d.csb.High()
if err != nil { if err != nil {
return return
} }
@@ -153,9 +160,9 @@ func (d *DeviceSPI) ReadRotation() (x int32, y int32, z int32, err error) {
for i := 1; i < len(data); i++ { for i := 1; i < len(data); i++ {
data[i] = 0 data[i] = 0
} }
d.CSB.Low() d.csb.Low()
err = d.Bus.Tx(data, data) err = d.bus.Tx(data, data)
d.CSB.High() d.csb.High()
if err != nil { if err != nil {
return return
} }
@@ -201,9 +208,9 @@ func (d *DeviceSPI) readRegister(address uint8) uint8 {
data := d.buf[:2] data := d.buf[:2]
data[0] = 0x80 | address data[0] = 0x80 | address
data[1] = 0 data[1] = 0
d.CSB.Low() d.csb.Low()
d.Bus.Tx(data, data) d.bus.Tx(data, data)
d.CSB.High() d.csb.High()
return data[1] return data[1]
} }
@@ -217,7 +224,7 @@ func (d *DeviceSPI) writeRegister(address, data uint8) {
buf[0] = address buf[0] = address
buf[1] = data buf[1] = data
d.CSB.Low() d.csb.Low()
d.Bus.Tx(buf, buf) d.bus.Tx(buf, buf)
d.CSB.High() d.csb.High()
} }
+7 -7
View File
@@ -2,22 +2,22 @@
package buzzer // import "tinygo.org/x/drivers/buzzer" package buzzer // import "tinygo.org/x/drivers/buzzer"
import ( import (
"machine"
"time" "time"
"tinygo.org/x/drivers/internal/pin"
) )
// Device wraps a GPIO connection to a buzzer. // Device wraps a GPIO connection to a buzzer.
type Device struct { type Device struct {
pin machine.Pin pin pin.OutputFunc
High bool High bool
BPM float64 BPM float64
} }
// New returns a new buzzer driver given which pin to use // New returns a new buzzer driver given which pin to use
func New(pin machine.Pin) Device { func New(pin pin.Output) Device {
return Device{ return Device{
pin: pin, pin: pin.Set,
High: false, High: false,
BPM: 96.0, BPM: 96.0,
} }
@@ -25,14 +25,14 @@ func New(pin machine.Pin) Device {
// On sets the buzzer to a high state. // On sets the buzzer to a high state.
func (l *Device) On() (err error) { func (l *Device) On() (err error) {
l.pin.Set(true) l.pin.High()
l.High = true l.High = true
return return
} }
// Off sets the buzzer to a low state. // Off sets the buzzer to a low state.
func (l *Device) Off() (err error) { func (l *Device) Off() (err error) {
l.pin.Set(false) l.pin.Low()
l.High = false l.High = false
return return
} }
+4 -67
View File
@@ -2,9 +2,9 @@
package easystepper // import "tinygo.org/x/drivers/easystepper" package easystepper // import "tinygo.org/x/drivers/easystepper"
import ( import (
"errors"
"machine"
"time" "time"
"tinygo.org/x/drivers/internal/pin"
) )
// StepMode determines the coil sequence used to perform a single step // StepMode determines the coil sequence used to perform a single step
@@ -30,28 +30,10 @@ func (sm StepMode) stepCount() uint {
} }
} }
// DeviceConfig contains the configuration data for a single easystepper driver
type DeviceConfig struct {
// Pin1 ... Pin4 determines the pins to configure and use for the device
Pin1, Pin2, Pin3, Pin4 machine.Pin
// StepCount is the number of steps required to perform a full revolution of the stepper motor
StepCount uint
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
RPM uint
// Mode determines the coil sequence used to perform a single step
Mode StepMode
}
// DualDeviceConfig contains the configuration data for a dual easystepper driver
type DualDeviceConfig struct {
DeviceConfig
// Pin5 ... Pin8 determines the pins to configure and use for the second device
Pin5, Pin6, Pin7, Pin8 machine.Pin
}
// Device holds the pins and the delay between steps // Device holds the pins and the delay between steps
type Device struct { type Device struct {
pins [4]machine.Pin pins [4]pin.OutputFunc
config func()
stepDelay time.Duration stepDelay time.Duration
stepNumber uint8 stepNumber uint8
stepMode StepMode stepMode StepMode
@@ -62,51 +44,6 @@ type DualDevice struct {
devices [2]*Device devices [2]*Device
} }
// New returns a new single easystepper driver given a DeviceConfig
func New(config DeviceConfig) (*Device, error) {
if config.StepCount == 0 || config.RPM == 0 {
return nil, errors.New("config.StepCount and config.RPM must be > 0")
}
return &Device{
pins: [4]machine.Pin{config.Pin1, config.Pin2, config.Pin3, config.Pin4},
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
stepMode: config.Mode,
}, nil
}
// Configure configures the pins of the Device
func (d *Device) Configure() {
for _, pin := range d.pins {
pin.Configure(machine.PinConfig{Mode: machine.PinOutput})
}
}
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
func NewDual(config DualDeviceConfig) (*DualDevice, error) {
// Create the first device
dev1, err := New(config.DeviceConfig)
if err != nil {
return nil, err
}
// Create the second device
config.DeviceConfig.Pin1 = config.Pin5
config.DeviceConfig.Pin2 = config.Pin6
config.DeviceConfig.Pin3 = config.Pin7
config.DeviceConfig.Pin4 = config.Pin8
dev2, err := New(config.DeviceConfig)
if err != nil {
return nil, err
}
// Return composite dual device
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
}
// Configure configures the pins of the DualDevice
func (d *DualDevice) Configure() {
d.devices[0].Configure()
d.devices[1].Configure()
}
// Move rotates the motor the number of given steps // Move rotates the motor the number of given steps
// (negative steps will rotate it the opposite direction) // (negative steps will rotate it the opposite direction)
func (d *Device) Move(steps int32) { func (d *Device) Move(steps int32) {
+26
View File
@@ -0,0 +1,26 @@
package easystepper
import (
"errors"
"time"
"tinygo.org/x/drivers/internal/pin"
)
func NewCrossPlatform(stepcount, rpm uint, mode StepMode, pins [4]pin.OutputFunc) (*Device, error) {
if stepcount == 0 || rpm == 0 {
return nil, errors.New("zero rpm and/or stepcount")
}
for i := range pins {
if pins[i] == nil {
return nil, errors.New("nil pin")
}
}
d := &Device{
pins: pins,
stepDelay: time.Second * 60 / time.Duration((stepcount * rpm)),
stepMode: mode,
config: func() {},
}
return d, nil
}
+83
View File
@@ -0,0 +1,83 @@
//go:build baremetal
package easystepper
import (
"errors"
"machine"
"time"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
)
// New returns a new single easystepper driver given a DeviceConfig
func New(config DeviceConfig) (*Device, error) {
if config.StepCount == 0 || config.RPM == 0 {
return nil, errors.New("config.StepCount and config.RPM must be > 0")
}
return &Device{
pins: [4]pin.OutputFunc{config.Pin1.Set, config.Pin2.Set, config.Pin3.Set, config.Pin4.Set},
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
stepMode: config.Mode,
config: func() {
legacy.ConfigurePinOut(config.Pin1)
legacy.ConfigurePinOut(config.Pin2)
legacy.ConfigurePinOut(config.Pin3)
legacy.ConfigurePinOut(config.Pin4)
},
}, nil
}
// Configure configures the pins of the Device
func (d *Device) Configure() {
if d.config == nil {
panic(legacy.ErrConfigBeforeInstantiated)
}
d.config()
}
// Configure configures the pins of the DualDevice
func (d *DualDevice) Configure() {
d.devices[0].Configure()
d.devices[1].Configure()
}
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
func NewDual(config DualDeviceConfig) (*DualDevice, error) {
// Create the first device
dev1, err := New(config.DeviceConfig)
if err != nil {
return nil, err
}
// Create the second device
config.DeviceConfig.Pin1 = config.Pin5
config.DeviceConfig.Pin2 = config.Pin6
config.DeviceConfig.Pin3 = config.Pin7
config.DeviceConfig.Pin4 = config.Pin8
dev2, err := New(config.DeviceConfig)
if err != nil {
return nil, err
}
// Return composite dual device
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
}
// DeviceConfig contains the configuration data for a single easystepper driver
type DeviceConfig struct {
// Pin1 ... Pin4 determines the pins to configure and use for the device
Pin1, Pin2, Pin3, Pin4 machine.Pin
// StepCount is the number of steps required to perform a full revolution of the stepper motor
StepCount uint
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
RPM uint
// Mode determines the coil sequence used to perform a single step
Mode StepMode
}
// DualDeviceConfig contains the configuration data for a dual easystepper driver
type DualDeviceConfig struct {
DeviceConfig
// Pin5 ... Pin8 determines the pins to configure and use for the second device
Pin5, Pin6, Pin7, Pin8 machine.Pin
}
+3
View File
@@ -1,3 +1,6 @@
// Guarded because still unsure of how to deal with interrupt drivers.
//go:build tinygo
// Package ft6336 provides a driver for the FT6336 I2C Self-Capacitive touch // Package ft6336 provides a driver for the FT6336 I2C Self-Capacitive touch
// panel controller. // panel controller.
// //
+16 -15
View File
@@ -5,12 +5,13 @@ package gc9a01 // import "tinygo.org/x/drivers/gc9a01"
import ( import (
"image/color" "image/color"
"machine"
"time" "time"
"errors" "errors"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
// Rotation controls the rotation used by the display. // Rotation controls the rotation used by the display.
@@ -22,10 +23,10 @@ type FrameRate uint8
// Device wraps an SPI connection. // Device wraps an SPI connection.
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
resetPin machine.Pin resetPin pin.OutputFunc
csPin machine.Pin csPin pin.OutputFunc
blPin machine.Pin blPin pin.OutputFunc
width int16 width int16
height int16 height int16
columnOffsetCfg int16 columnOffsetCfg int16
@@ -52,17 +53,17 @@ type Config struct {
} }
// New creates a new ST7789 connection. The SPI wire must already be configured. // New creates a new ST7789 connection. The SPI wire must already be configured.
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device { func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(resetPin)
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(blPin)
return Device{ return Device{
bus: bus, bus: bus,
resetPin: resetPin, resetPin: resetPin.Set,
dcPin: dcPin, dcPin: dcPin.Set,
csPin: csPin, csPin: csPin.Set,
blPin: blPin, blPin: blPin.Set,
} }
} }
@@ -226,7 +227,7 @@ func (d *Device) Data(data uint8) {
// Tx sends data to the display // Tx sends data to the display
func (d *Device) Tx(data []byte, isCommand bool) { func (d *Device) Tx(data []byte, isCommand bool) {
d.dcPin.Set(!isCommand) d.dcPin(!isCommand)
d.bus.Tx(data, nil) d.bus.Tx(data, nil)
} }
+19 -10
View File
@@ -5,30 +5,39 @@
package hcsr04 package hcsr04
import ( import (
"machine"
"time" "time"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
const TIMEOUT = 23324 // max sensing distance (4m) const TIMEOUT = 23324 // max sensing distance (4m)
// Device holds the pins // Device holds the pins
type Device struct { type Device struct {
trigger machine.Pin trigger pin.OutputFunc
echo machine.Pin echo pin.InputFunc
configurePins func()
} }
// New returns a new ultrasonic driver given 2 pins // New returns a new ultrasonic driver given 2 pins
func New(trigger, echo machine.Pin) Device { func New(trigger pin.Output, echo pin.Input) Device {
return Device{ return Device{
trigger: trigger, trigger: trigger.Set,
echo: echo, echo: echo.Get,
configurePins: func() {
legacy.ConfigurePinOut(trigger)
legacy.ConfigurePinInput(echo)
},
} }
} }
// Configure configures the pins of the Device // Configure configures the pins of the Device
func (d *Device) Configure() { func (d *Device) Configure() {
d.trigger.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.configurePins == nil {
d.echo.Configure(machine.PinConfig{Mode: machine.PinInput}) panic(legacy.ErrConfigBeforeInstantiated)
}
d.configurePins()
} }
// ReadDistance returns the distance of the object in mm // ReadDistance returns the distance of the object in mm
@@ -52,7 +61,7 @@ func (d *Device) ReadPulse() int32 {
d.trigger.Low() d.trigger.Low()
i := uint8(0) i := uint8(0)
for { for {
if d.echo.Get() { if d.echo() {
t = time.Now() t = time.Now()
break break
} }
@@ -66,7 +75,7 @@ func (d *Device) ReadPulse() int32 {
} }
i = 0 i = 0
for { for {
if !d.echo.Get() { if !d.echo() {
return int32(time.Since(t).Microseconds()) return int32(time.Since(t).Microseconds())
} }
i++ i++
+5 -5
View File
@@ -210,7 +210,7 @@ func (d *Device) SendCommand(command byte) {
d.bus.SetCommandMode(true) d.bus.SetCommandMode(true)
d.bus.Write([]byte{command}) d.bus.Write([]byte{command})
for d.busy(command == DISPLAY_CLEAR || command == CURSOR_HOME) { for d.isBusy(command == DISPLAY_CLEAR || command == CURSOR_HOME) {
} }
} }
@@ -219,7 +219,7 @@ func (d *Device) sendData(data byte) {
d.bus.SetCommandMode(false) d.bus.SetCommandMode(false)
d.bus.Write([]byte{data}) d.bus.Write([]byte{data})
for d.busy(false) { for d.isBusy(false) {
} }
} }
@@ -231,9 +231,9 @@ func (d *Device) CreateCharacter(cgramAddr uint8, data []byte) {
} }
} }
// busy returns true when hd447890 is busy // isBusy returns true when hd447890 is isBusy
// or after the timeout specified // or after the timeout specified
func (d *Device) busy(longDelay bool) bool { func (d *Device) isBusy(longDelay bool) bool {
if d.bus.WriteOnly() { if d.bus.WriteOnly() {
// Can't read busy flag if write only, so sleep a bit then return // Can't read busy flag if write only, so sleep a bit then return
if longDelay { if longDelay {
@@ -261,7 +261,7 @@ func (d *Device) busy(longDelay bool) bool {
// Busy returns true when hd447890 is busy // Busy returns true when hd447890 is busy
func (d *Device) Busy() bool { func (d *Device) Busy() bool {
return d.busy(false) return d.isBusy(false)
} }
// Size returns the current size of the display. // Size returns the current size of the display.
+4 -4
View File
@@ -3,9 +3,9 @@ package max6675
import ( import (
"errors" "errors"
"machine"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/pin"
) )
// ErrThermocoupleOpen is returned when the thermocouple input is open. // ErrThermocoupleOpen is returned when the thermocouple input is open.
@@ -14,16 +14,16 @@ var ErrThermocoupleOpen = errors.New("thermocouple input open")
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
} }
// Create a new Device to read from a MAX6675 thermocouple. // Create a new Device to read from a MAX6675 thermocouple.
// Pins must be configured before use. Frequency for SPI // Pins must be configured before use. Frequency for SPI
// should be 4.3MHz maximum. // should be 4.3MHz maximum.
func NewDevice(bus drivers.SPI, cs machine.Pin) *Device { func NewDevice(bus drivers.SPI, cs pin.Output) *Device {
return &Device{ return &Device{
bus: bus, bus: bus,
cs: cs, cs: cs.Set,
} }
} }
+14 -9
View File
@@ -3,31 +3,36 @@
package max72xx package max72xx
import ( import (
"machine"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
configurePins func()
} }
// NewDriver creates a new max7219 connection. The SPI wire must already be configured // NewDriver creates a new max7219 connection. The SPI wire must already be configured
// The SPI frequency must not be higher than 10MHz. // The SPI frequency must not be higher than 10MHz.
// parameter cs: the datasheet also refers to this pin as "load" pin. // parameter cs: the datasheet also refers to this pin as "load" pin.
func NewDevice(bus drivers.SPI, cs machine.Pin) *Device { func NewDevice(bus drivers.SPI, cs pin.Output) *Device {
return &Device{ return &Device{
bus: bus, bus: bus,
cs: cs, cs: cs.Set,
configurePins: func() {
legacy.ConfigurePinOut(cs)
},
} }
} }
// Configure setups the pins. // Configure setups the pins.
func (driver *Device) Configure() { func (driver *Device) Configure() {
outPutConfig := machine.PinConfig{Mode: machine.PinOutput} if driver.configurePins == nil {
panic(legacy.ErrConfigBeforeInstantiated)
driver.cs.Configure(outPutConfig) }
driver.configurePins()
} }
// SetScanLimit sets the scan limit. Maximum is 8. // SetScanLimit sets the scan limit. Maximum is 8.
+16 -8
View File
@@ -8,18 +8,20 @@ package mcp2515 // import "tinygo.org/x/drivers/mcp2515"
import ( import (
"errors" "errors"
"fmt" "fmt"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
// Device wraps MCP2515 SPI CAN Module. // Device wraps MCP2515 SPI CAN Module.
type Device struct { type Device struct {
spi SPI spi SPI
cs machine.Pin cs pin.OutputFunc
msg *CANMsg msg *CANMsg
mcpMode byte mcpMode byte
configurePins func()
} }
// CANMsg stores CAN message fields. // CANMsg stores CAN message fields.
@@ -36,15 +38,18 @@ const (
) )
// New returns a new MCP2515 driver. Pass in a fully configured SPI bus. // New returns a new MCP2515 driver. Pass in a fully configured SPI bus.
func New(b drivers.SPI, csPin machine.Pin) *Device { func New(b drivers.SPI, csPin pin.Output) *Device {
d := &Device{ d := &Device{
spi: SPI{ spi: SPI{
bus: b, bus: b,
tx: make([]byte, 0, bufferSize), tx: make([]byte, 0, bufferSize),
rx: make([]byte, 0, bufferSize), rx: make([]byte, 0, bufferSize),
}, },
cs: csPin, cs: csPin.Set,
msg: &CANMsg{}, msg: &CANMsg{},
configurePins: func() {
legacy.ConfigurePinOut(csPin)
},
} }
return d return d
@@ -52,7 +57,10 @@ func New(b drivers.SPI, csPin machine.Pin) *Device {
// Configure sets up the device for communication. // Configure sets up the device for communication.
func (d *Device) Configure() { func (d *Device) Configure() {
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.configurePins == nil {
panic(legacy.ErrConfigBeforeInstantiated)
}
d.configurePins()
} }
const beginTimeoutValue int = 10 const beginTimeoutValue int = 10
+24 -16
View File
@@ -5,8 +5,9 @@ package onewire // import "tinygo.org/x/drivers/onewire"
import ( import (
"errors" "errors"
"machine"
"time" "time"
"tinygo.org/x/drivers/internal/pin"
) )
// OneWire ROM commands // OneWire ROM commands
@@ -19,7 +20,8 @@ const (
// Device wraps a connection to an 1-Wire devices. // Device wraps a connection to an 1-Wire devices.
type Device struct { type Device struct {
p machine.Pin set pin.OutputFunc
get pin.InputFunc
} }
// Config wraps a configuration to an 1-Wire devices. // Config wraps a configuration to an 1-Wire devices.
@@ -32,24 +34,30 @@ var (
errReadAddress = errors.New("Error: OneWire. Read address error: CRC mismatch.") errReadAddress = errors.New("Error: OneWire. Read address error: CRC mismatch.")
) )
// New creates a new GPIO 1-Wire connection. // NewFromFuncs expects pin setter and getter for DQ line. Ideally this driver should receive
// The pin must be pulled up to the VCC via a resistor greater than 500 ohms (default 4.7k). // a one-wire bus HAL abstraction, but I was asked to show how this could be done using pin HAL so here goes.
func New(p machine.Pin) Device { func NewFromFuncs(getPinLevel pin.InputFunc, setPinLevel pin.OutputFunc) *Device {
return Device{ return &Device{
p: p, set: setPinLevel,
get: getPinLevel,
} }
} }
// Configure initializes the protocol. // Configure initializes the protocol.
func (d *Device) Configure(config Config) {} func (d *Device) Configure(config Config) {}
// By setting the pin value one should configure as output and also expect a more
// consistent behaviour across all tinygo hosts by pulling DQ line low consistently. Win-win.
func (d *Device) cfgOut() { d.set.Low() }
func (d *Device) cfgIn() { d.get() }
// Reset pull DQ line low, then up. // Reset pull DQ line low, then up.
func (d Device) Reset() error { func (d Device) Reset() error {
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput}) d.cfgOut()
time.Sleep(480 * time.Microsecond) time.Sleep(480 * time.Microsecond)
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) d.cfgIn()
time.Sleep(70 * time.Microsecond) time.Sleep(70 * time.Microsecond)
precence := d.p.Get() precence := d.get()
time.Sleep(410 * time.Microsecond) time.Sleep(410 * time.Microsecond)
if precence { if precence {
return errNoPresence return errNoPresence
@@ -59,14 +67,14 @@ func (d Device) Reset() error {
// WriteBit transmits a bit to 1-Wire bus. // WriteBit transmits a bit to 1-Wire bus.
func (d Device) WriteBit(data uint8) { func (d Device) WriteBit(data uint8) {
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput}) d.cfgOut()
if data&1 == 1 { // Send '1' if data&1 == 1 { // Send '1'
time.Sleep(5 * time.Microsecond) time.Sleep(5 * time.Microsecond)
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) d.cfgIn()
time.Sleep(60 * time.Microsecond) time.Sleep(60 * time.Microsecond)
} else { // Send '0' } else { // Send '0'
time.Sleep(60 * time.Microsecond) time.Sleep(60 * time.Microsecond)
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) d.cfgIn()
time.Sleep(5 * time.Microsecond) time.Sleep(5 * time.Microsecond)
} }
} }
@@ -81,11 +89,11 @@ func (d Device) Write(data uint8) {
// ReadBit receives a bit from 1-Wire bus. // ReadBit receives a bit from 1-Wire bus.
func (d Device) ReadBit() (data uint8) { func (d Device) ReadBit() (data uint8) {
d.p.Configure(machine.PinConfig{Mode: machine.PinOutput}) d.cfgOut()
time.Sleep(3 * time.Microsecond) time.Sleep(3 * time.Microsecond)
d.p.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) d.cfgIn()
time.Sleep(8 * time.Microsecond) time.Sleep(8 * time.Microsecond)
if d.p.Get() { if d.get() {
data = 1 data = 1
} }
time.Sleep(60 * time.Microsecond) time.Sleep(60 * time.Microsecond)
+31
View File
@@ -0,0 +1,31 @@
//go:build tinygo
package onewire
import (
"machine"
"tinygo.org/x/drivers/internal/legacy"
)
// New creates a new GPIO 1-Wire connection.
// The pin must be pulled up to the VCC via a resistor greater than 500 ohms (default 4.7k).
func New(p machine.Pin) Device {
isOut := false
return Device{
set: func(level bool) {
if !isOut {
legacy.ConfigurePinOut(p)
isOut = true
}
p.Set(level)
},
get: func() (level bool) {
if isOut {
legacy.ConfigurePinInputPullup(p)
isOut = false
}
return p.Get()
},
}
}
+8 -8
View File
@@ -6,18 +6,18 @@ package pcd8544 // import "tinygo.org/x/drivers/pcd8544"
import ( import (
"errors" "errors"
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/pin"
) )
// Device wraps an SPI connection. // Device wraps an SPI connection.
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
rstPin machine.Pin rstPin pin.OutputFunc
scePin machine.Pin scePin pin.OutputFunc
buffer []byte buffer []byte
width int16 width int16
height int16 height int16
@@ -30,12 +30,12 @@ type Config struct {
} }
// New creates a new PCD8544 connection. The SPI bus must already be configured. // New creates a new PCD8544 connection. The SPI bus must already be configured.
func New(bus drivers.SPI, dcPin, rstPin, scePin machine.Pin) *Device { func New(bus drivers.SPI, dcPin, rstPin, scePin pin.Output) *Device {
return &Device{ return &Device{
bus: bus, bus: bus,
dcPin: dcPin, dcPin: dcPin.Set,
rstPin: rstPin, rstPin: rstPin.Set,
scePin: scePin, scePin: scePin.Set,
} }
} }
+19 -12
View File
@@ -2,7 +2,8 @@
package shiftregister package shiftregister
import ( import (
"machine" "tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type NumberBit int8 type NumberBit int8
@@ -16,9 +17,10 @@ const (
// Device holds pin number // Device holds pin number
type Device struct { type Device struct {
latch, clock, out machine.Pin // IC wiring latch, clock, out pin.OutputFunc // IC wiring
bits NumberBit // Pin number config func()
mask uint32 // keep all pins state bits NumberBit // Pin number
mask uint32 // keep all pins state
} }
// ShiftPin is the implementation of the ShiftPin interface. // ShiftPin is the implementation of the ShiftPin interface.
@@ -29,20 +31,25 @@ type ShiftPin struct {
} }
// New returns a new shift output register device // New returns a new shift output register device
func New(Bits NumberBit, Latch, Clock, Out machine.Pin) *Device { func New(Bits NumberBit, Latch, Clock, Out pin.Output) *Device {
return &Device{ return &Device{
latch: Latch, latch: Latch.Set,
clock: Clock, clock: Clock.Set,
out: Out, out: Out.Set,
bits: Bits, bits: Bits,
config: func() {
legacy.ConfigurePinOut(Latch)
legacy.ConfigurePinOut(Clock)
legacy.ConfigurePinOut(Out)
},
} }
} }
// Configure set hardware configuration // Configure set hardware configuration
func (d *Device) Configure() { func (d *Device) Configure() {
d.latch.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.config == nil {
d.clock.Configure(machine.PinConfig{Mode: machine.PinOutput}) panic(legacy.ErrConfigBeforeInstantiated)
d.out.Configure(machine.PinConfig{Mode: machine.PinOutput}) }
d.latch.High() d.latch.High()
} }
@@ -53,7 +60,7 @@ func (d *Device) WriteMask(mask uint32) {
d.latch.Low() d.latch.Low()
for i := 0; i < int(d.bits); i++ { for i := 0; i < int(d.bits); i++ {
d.clock.Low() d.clock.Low()
d.out.Set(mask&1 != 0) d.out(mask&1 != 0)
mask = mask >> 1 mask = mask >> 1
d.clock.High() d.clock.High()
} }
+2
View File
@@ -1,3 +1,5 @@
//go:build tinygo
package ssd1289 package ssd1289
import "machine" import "machine"
+18 -16
View File
@@ -7,6 +7,9 @@ import (
"image/color" "image/color"
"machine" "machine"
"time" "time"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Bus interface { type Bus interface {
@@ -14,10 +17,10 @@ type Bus interface {
} }
type Device struct { type Device struct {
rs machine.Pin rs pin.OutputFunc
wr machine.Pin wr pin.OutputFunc
cs machine.Pin cs pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
bus Bus bus Bus
} }
@@ -26,21 +29,20 @@ const height = int16(320)
func New(rs machine.Pin, wr machine.Pin, cs machine.Pin, rst machine.Pin, bus Bus) Device { func New(rs machine.Pin, wr machine.Pin, cs machine.Pin, rst machine.Pin, bus Bus) Device {
d := Device{ d := Device{
rs: rs, rs: rs.Set,
wr: wr, wr: wr.Set,
cs: cs, cs: cs.Set,
rst: rst, rst: rst.Set,
bus: bus, bus: bus,
} }
legacy.ConfigurePinOut(rs)
legacy.ConfigurePinOut(wr)
legacy.ConfigurePinOut(cs)
legacy.ConfigurePinOut(rst)
rs.Configure(machine.PinConfig{Mode: machine.PinOutput}) cs.Set(true)
wr.Configure(machine.PinConfig{Mode: machine.PinOutput}) rst.Set(true)
cs.Configure(machine.PinConfig{Mode: machine.PinOutput}) wr.Set(true)
rst.Configure(machine.PinConfig{Mode: machine.PinOutput})
cs.High()
rst.High()
wr.High()
return d return d
} }
+13 -12
View File
@@ -5,12 +5,13 @@ package ssd1331 // import "tinygo.org/x/drivers/ssd1331"
import ( import (
"image/color" "image/color"
"machine"
"errors" "errors"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Model uint8 type Model uint8
@@ -19,9 +20,9 @@ type Rotation uint8
// Device wraps an SPI connection. // Device wraps an SPI connection.
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
resetPin machine.Pin resetPin pin.OutputFunc
csPin machine.Pin csPin pin.OutputFunc
width int16 width int16
height int16 height int16
batchLength int16 batchLength int16
@@ -36,15 +37,15 @@ type Config struct {
} }
// New creates a new SSD1331 connection. The SPI wire must already be configured. // New creates a new SSD1331 connection. The SPI wire must already be configured.
func New(bus drivers.SPI, resetPin, dcPin, csPin machine.Pin) Device { func New(bus drivers.SPI, resetPin, dcPin, csPin pin.Output) Device {
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(resetPin)
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
return Device{ return Device{
bus: bus, bus: bus,
dcPin: dcPin, dcPin: dcPin.Set,
resetPin: resetPin, resetPin: resetPin.Set,
csPin: csPin, csPin: csPin.Set,
} }
} }
@@ -251,7 +252,7 @@ func (d *Device) Data(data uint8) {
// Tx sends data to the display // Tx sends data to the display
func (d *Device) Tx(data []byte, isCommand bool) { func (d *Device) Tx(data []byte, isCommand bool) {
d.dcPin.Set(!isCommand) d.dcPin(!isCommand)
d.bus.Tx(data, nil) d.bus.Tx(data, nil)
} }
+32 -24
View File
@@ -6,10 +6,11 @@ package ssd1351 // import "tinygo.org/x/drivers/ssd1351"
import ( import (
"errors" "errors"
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
var ( var (
@@ -19,17 +20,18 @@ var (
// Device wraps an SPI connection. // Device wraps an SPI connection.
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
resetPin machine.Pin resetPin pin.OutputFunc
csPin machine.Pin csPin pin.OutputFunc
enPin machine.Pin enPin pin.OutputFunc
rwPin machine.Pin rwPin pin.OutputFunc
width int16 configurePins func()
height int16 width int16
rowOffset int16 height int16
columnOffset int16 rowOffset int16
bufferLength int16 columnOffset int16
bufferLength int16
} }
// Config is the configuration for the display // Config is the configuration for the display
@@ -41,19 +43,29 @@ type Config struct {
} }
// New creates a new SSD1351 connection. The SPI wire must already be configured. // New creates a new SSD1351 connection. The SPI wire must already be configured.
func New(bus drivers.SPI, resetPin, dcPin, csPin, enPin, rwPin machine.Pin) Device { func New(bus drivers.SPI, resetPin, dcPin, csPin, enPin, rwPin pin.Output) Device {
return Device{ return Device{
bus: bus, bus: bus,
dcPin: dcPin, dcPin: dcPin.Set,
resetPin: resetPin, resetPin: resetPin.Set,
csPin: csPin, csPin: csPin.Set,
enPin: enPin, enPin: enPin.Set,
rwPin: rwPin, rwPin: rwPin.Set,
configurePins: func() {
legacy.ConfigurePinOut(dcPin)
legacy.ConfigurePinOut(resetPin)
legacy.ConfigurePinOut(csPin)
legacy.ConfigurePinOut(enPin)
legacy.ConfigurePinOut(rwPin)
},
} }
} }
// Configure initializes the display with default configuration // Configure initializes the display with default configuration
func (d *Device) Configure(cfg Config) { func (d *Device) Configure(cfg Config) {
if d.configurePins == nil {
panic(legacy.ErrConfigBeforeInstantiated)
}
if cfg.Width == 0 { if cfg.Width == 0 {
cfg.Width = 128 cfg.Width = 128
} }
@@ -73,11 +85,7 @@ func (d *Device) Configure(cfg Config) {
} }
// configure GPIO pins // configure GPIO pins
d.dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) d.configurePins()
d.resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.enPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
d.rwPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
// reset the device // reset the device
d.resetPin.High() d.resetPin.High()
@@ -278,7 +286,7 @@ func (d *Device) Data(data uint8) {
// Tx sends data to the display // Tx sends data to the display
func (d *Device) Tx(data []byte, isCommand bool) { func (d *Device) Tx(data []byte, isCommand bool) {
d.dcPin.Set(!isCommand) d.dcPin(!isCommand)
d.csPin.Low() d.csPin.Low()
d.bus.Tx(data, nil) d.bus.Tx(data, nil)
d.csPin.High() d.csPin.High()
+17 -16
View File
@@ -5,12 +5,13 @@ package st7735 // import "tinygo.org/x/drivers/st7735"
import ( import (
"image/color" "image/color"
"machine"
"time" "time"
"errors" "errors"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
"tinygo.org/x/drivers/pixel" "tinygo.org/x/drivers/pixel"
) )
@@ -39,10 +40,10 @@ type Device = DeviceOf[pixel.RGB565BE]
// formats. // formats.
type DeviceOf[T Color] struct { type DeviceOf[T Color] struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
resetPin machine.Pin resetPin pin.OutputFunc
csPin machine.Pin csPin pin.OutputFunc
blPin machine.Pin blPin pin.OutputFunc
width int16 width int16
height int16 height int16
columnOffset int16 columnOffset int16
@@ -65,23 +66,23 @@ type Config struct {
} }
// New creates a new ST7735 connection. The SPI wire must already be configured. // New creates a new ST7735 connection. The SPI wire must already be configured.
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device { func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin) return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
} }
// NewOf creates a new ST7735 connection with a particular pixel format. The SPI // NewOf creates a new ST7735 connection with a particular pixel format. The SPI
// wire must already be configured. // wire must already be configured.
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) DeviceOf[T] { func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) DeviceOf[T] {
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(resetPin)
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(blPin)
return DeviceOf[T]{ return DeviceOf[T]{
bus: bus, bus: bus,
dcPin: dcPin, dcPin: dcPin.Set,
resetPin: resetPin, resetPin: resetPin.Set,
csPin: csPin, csPin: csPin.Set,
blPin: blPin, blPin: blPin.Set,
} }
} }
@@ -423,7 +424,7 @@ func (d *DeviceOf[T]) Data(data uint8) {
// Tx sends data to the display // Tx sends data to the display
func (d *DeviceOf[T]) Tx(data []byte, isCommand bool) { func (d *DeviceOf[T]) Tx(data []byte, isCommand bool) {
d.dcPin.Set(!isCommand) d.dcPin(!isCommand)
d.bus.Tx(data, nil) d.bus.Tx(data, nil)
} }
+22 -17
View File
@@ -7,13 +7,14 @@ package st7789 // import "tinygo.org/x/drivers/st7789"
import ( import (
"image/color" "image/color"
"machine"
"math" "math"
"time" "time"
"errors" "errors"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
"tinygo.org/x/drivers/pixel" "tinygo.org/x/drivers/pixel"
) )
@@ -46,10 +47,10 @@ type Device = DeviceOf[pixel.RGB565BE]
// formats. // formats.
type DeviceOf[T Color] struct { type DeviceOf[T Color] struct {
bus drivers.SPI bus drivers.SPI
dcPin machine.Pin dcPin pin.OutputFunc
resetPin machine.Pin resetPin pin.OutputFunc
csPin machine.Pin csPin pin.OutputFunc
blPin machine.Pin blPin pin.OutputFunc
width int16 width int16
height int16 height int16
columnOffsetCfg int16 columnOffsetCfg int16
@@ -83,23 +84,27 @@ type Config struct {
} }
// New creates a new ST7789 connection. The SPI wire must already be configured. // New creates a new ST7789 connection. The SPI wire must already be configured.
func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) Device { func New(bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) Device {
return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin) return NewOf[pixel.RGB565BE](bus, resetPin, dcPin, csPin, blPin)
} }
// NewOf creates a new ST7789 connection with a particular pixel format. The SPI // NewOf creates a new ST7789 connection with a particular pixel format. The SPI
// wire must already be configured. // wire must already be configured.
func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin machine.Pin) DeviceOf[T] { func NewOf[T Color](bus drivers.SPI, resetPin, dcPin, csPin, blPin pin.Output) DeviceOf[T] {
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
resetPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(resetPin)
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
blPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(blPin)
var cs pin.OutputFunc
if !legacy.PinIsNoPin(csPin) {
cs = csPin.Set
}
return DeviceOf[T]{ return DeviceOf[T]{
bus: bus, bus: bus,
dcPin: dcPin, dcPin: dcPin.Set,
resetPin: resetPin, resetPin: resetPin.Set,
csPin: csPin, csPin: cs,
blPin: blPin, blPin: blPin.Set,
} }
} }
@@ -229,7 +234,7 @@ func (d *DeviceOf[T]) sendCommand(command uint8, data []byte) error {
// startWrite must be called at the beginning of all exported methods to set the // startWrite must be called at the beginning of all exported methods to set the
// chip select pin low. // chip select pin low.
func (d *DeviceOf[T]) startWrite() { func (d *DeviceOf[T]) startWrite() {
if d.csPin != machine.NoPin { if d.csPin != nil {
d.csPin.Low() d.csPin.Low()
} }
} }
@@ -237,7 +242,7 @@ func (d *DeviceOf[T]) startWrite() {
// endWrite must be called at the end of all exported methods to set the chip // endWrite must be called at the end of all exported methods to set the chip
// select pin high. // select pin high.
func (d *DeviceOf[T]) endWrite() { func (d *DeviceOf[T]) endWrite() {
if d.csPin != machine.NoPin { if d.csPin != nil {
d.csPin.High() d.csPin.High()
} }
} }
+2
View File
@@ -1,3 +1,5 @@
//go:build tinygo
package sx127x package sx127x
import ( import (
+4 -4
View File
@@ -6,10 +6,10 @@ package sx127x
import ( import (
"errors" "errors"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/pin"
"tinygo.org/x/drivers/lora" "tinygo.org/x/drivers/lora"
) )
@@ -22,7 +22,7 @@ const (
// Device wraps an SPI connection to a SX127x device. // Device wraps an SPI connection to a SX127x device.
type Device struct { type Device struct {
spi drivers.SPI // SPI bus for module communication spi drivers.SPI // SPI bus for module communication
rstPin machine.Pin // GPIO for reset rstPin pin.OutputFunc // GPIO for reset
radioEventChan chan lora.RadioEvent // Channel for Receiving events radioEventChan chan lora.RadioEvent // Channel for Receiving events
loraConf lora.Config // Current Lora configuration loraConf lora.Config // Current Lora configuration
controller RadioController // to manage interactions with the radio controller RadioController // to manage interactions with the radio
@@ -43,10 +43,10 @@ func (d *Device) GetRadioEventChan() chan lora.RadioEvent {
} }
// New creates a new SX127x connection. The SPI bus must already be configured. // New creates a new SX127x connection. The SPI bus must already be configured.
func New(spi drivers.SPI, rstPin machine.Pin) *Device { func New(spi drivers.SPI, rstPin pin.Output) *Device {
k := Device{ k := Device{
spi: spi, spi: spi,
rstPin: rstPin, rstPin: rstPin.Set,
radioEventChan: make(chan lora.RadioEvent, RADIOEVENTCHAN_SIZE), radioEventChan: make(chan lora.RadioEvent, RADIOEVENTCHAN_SIZE),
spiTxBuf: make([]byte, SPI_BUFFER_SIZE), spiTxBuf: make([]byte, SPI_BUFFER_SIZE),
spiRxBuf: make([]byte, SPI_BUFFER_SIZE), spiRxBuf: make([]byte, SPI_BUFFER_SIZE),
-5
View File
@@ -50,12 +50,7 @@ type Device struct {
type Speed uint8 type Speed uint8
// New returns a new uc8151 driver. Pass in a fully configured SPI bus. // New returns a new uc8151 driver. Pass in a fully configured SPI bus.
// Pins passed in must be configured beforehand.
func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device { func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
// For backwards compatibility.
// This driver used to configure pins,
// so leave in to not break users.
// May be removed in future so try not to depend on it!
legacy.ConfigurePinOut(csPin) legacy.ConfigurePinOut(csPin)
legacy.ConfigurePinOut(dcPin) legacy.ConfigurePinOut(dcPin)
legacy.ConfigurePinOut(rstPin) legacy.ConfigurePinOut(rstPin)
+32 -23
View File
@@ -12,6 +12,9 @@ import (
"image/color" "image/color"
"machine" "machine"
"time" "time"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Config struct { type Config struct {
@@ -22,14 +25,14 @@ type Config struct {
} }
type Device struct { type Device struct {
bus *machine.SPI bus *machine.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
configurePins func()
buffer []uint8 buffer []uint8
rotation Rotation rotation Rotation
} }
type Rotation uint8 type Rotation uint8
@@ -79,22 +82,28 @@ var partialRefresh = [159]uint8{
} }
// New returns a new epd1in54 driver. Pass in a fully configured SPI bus. // New returns a new epd1in54 driver. Pass in a fully configured SPI bus.
func New(bus *machine.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device { func New(bus *machine.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
return Device{ return Device{
buffer: make([]uint8, (uint32(Width)*uint32(Height))/8), buffer: make([]uint8, (uint32(Width)*uint32(Height))/8),
bus: bus, bus: bus,
cs: csPin, cs: csPin.Set,
dc: dcPin, dc: dcPin.Set,
rst: rstPin, rst: rstPin.Set,
busy: busyPin, isBusy: busyPin.Get,
configurePins: func() {
legacy.ConfigurePinOut(csPin)
legacy.ConfigurePinOut(dcPin)
legacy.ConfigurePinOut(rstPin)
legacy.ConfigurePinInput(busyPin)
},
} }
} }
func (d *Device) LDirInit(cfg Config) { func (d *Device) LDirInit(cfg Config) {
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.configurePins == nil {
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput}) panic(legacy.ErrConfigBeforeInstantiated)
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput}) }
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput}) d.configurePins()
d.bus.Configure(machine.SPIConfig{ d.bus.Configure(machine.SPIConfig{
Frequency: 2000000, Frequency: 2000000,
@@ -150,10 +159,10 @@ func (d *Device) LDirInit(cfg Config) {
} }
func (d *Device) HDirInit(cfg Config) { func (d *Device) HDirInit(cfg Config) {
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput}) if d.configurePins == nil {
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput}) panic(legacy.ErrConfigBeforeInstantiated)
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput}) }
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput}) d.configurePins()
d.bus.Configure(machine.SPIConfig{ d.bus.Configure(machine.SPIConfig{
Frequency: 2000000, Frequency: 2000000,
@@ -369,7 +378,7 @@ func (d *Device) Clear() {
// WaitUntilIdle waits until the display is ready // WaitUntilIdle waits until the display is ready
func (d *Device) WaitUntilIdle() { func (d *Device) WaitUntilIdle() {
for d.busy.Get() { for d.isBusy() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
@@ -377,7 +386,7 @@ func (d *Device) WaitUntilIdle() {
// IsBusy returns the busy status of the display // IsBusy returns the busy status of the display
func (d *Device) IsBusy() bool { func (d *Device) IsBusy() bool {
return d.busy.Get() return d.isBusy()
} }
// ClearBuffer sets the buffer to 0xFF (white) // ClearBuffer sets the buffer to 0xFF (white)
+18 -17
View File
@@ -6,10 +6,11 @@ package epd2in13 // import "tinygo.org/x/drivers/waveshare-epd/epd2in13"
import ( import (
"errors" "errors"
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Config struct { type Config struct {
@@ -21,10 +22,10 @@ type Config struct {
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
logicalWidth int16 logicalWidth int16
width int16 width int16
height int16 height int16
@@ -53,17 +54,17 @@ var lutPartialUpdate = [30]uint8{
} }
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus. // New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device { func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(rstPin)
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput}) legacy.ConfigurePinInput(busyPin)
return Device{ return Device{
bus: bus, bus: bus,
cs: csPin, cs: csPin.Set,
dc: dcPin, dc: dcPin.Set,
rst: rstPin, rst: rstPin.Set,
busy: busyPin, isBusy: busyPin.Get,
} }
} }
@@ -298,14 +299,14 @@ func (d *Device) setMemoryPointer(x int16, y int16) {
// WaitUntilIdle waits until the display is ready // WaitUntilIdle waits until the display is ready
func (d *Device) WaitUntilIdle() { func (d *Device) WaitUntilIdle() {
for d.busy.Get() { for d.isBusy() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
} }
// IsBusy returns the busy status of the display // IsBusy returns the busy status of the display
func (d *Device) IsBusy() bool { func (d *Device) IsBusy() bool {
return d.busy.Get() return d.isBusy()
} }
// ClearBuffer sets the buffer to 0xFF (white) // ClearBuffer sets the buffer to 0xFF (white)
+18 -17
View File
@@ -6,10 +6,11 @@ package epd2in13x // import "tinygo.org/x/drivers/waveshare-epd/epd2in13x"
import ( import (
"errors" "errors"
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Config struct { type Config struct {
@@ -20,10 +21,10 @@ type Config struct {
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
width int16 width int16
height int16 height int16
buffer [][]uint8 buffer [][]uint8
@@ -33,17 +34,17 @@ type Device struct {
type Color uint8 type Color uint8
// New returns a new epd2in13x driver. Pass in a fully configured SPI bus. // New returns a new epd2in13x driver. Pass in a fully configured SPI bus.
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device { func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(rstPin)
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput}) legacy.ConfigurePinInput(busyPin)
return Device{ return Device{
bus: bus, bus: bus,
cs: csPin, cs: csPin.Set,
dc: dcPin, dc: dcPin.Set,
rst: rstPin, rst: rstPin.Set,
busy: busyPin, isBusy: busyPin.Get,
} }
} }
@@ -277,14 +278,14 @@ func (d *Device) ClearDisplay() {
// WaitUntilIdle waits until the display is ready // WaitUntilIdle waits until the display is ready
func (d *Device) WaitUntilIdle() { func (d *Device) WaitUntilIdle() {
for !d.busy.Get() { for !d.isBusy() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
} }
// IsBusy returns the busy status of the display // IsBusy returns the busy status of the display
func (d *Device) IsBusy() bool { func (d *Device) IsBusy() bool {
return d.busy.Get() return d.isBusy()
} }
// ClearBuffer sets the buffer to 0xFF (white) // ClearBuffer sets the buffer to 0xFF (white)
+23 -25
View File
@@ -5,10 +5,11 @@ package epd2in66b
import ( import (
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
const ( const (
@@ -18,20 +19,12 @@ const (
const Baudrate = 4_000_000 // 4 MHz const Baudrate = 4_000_000 // 4 MHz
type Config struct {
ResetPin machine.Pin
DataPin machine.Pin
ChipSelectPin machine.Pin
BusyPin machine.Pin
}
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
blackBuffer []byte blackBuffer []byte
redBuffer []byte redBuffer []byte
} }
@@ -50,18 +43,23 @@ func New(bus drivers.SPI) Device {
} }
} }
type Config struct {
ResetPin pin.Output
DataPin pin.Output
ChipSelectPin pin.Output
BusyPin pin.Input
}
// Configure configures the device and its pins. // Configure configures the device and its pins.
func (d *Device) Configure(c Config) error { func (d *Device) Configure(c Config) error {
d.cs = c.ChipSelectPin d.cs = c.ChipSelectPin.Set
d.dc = c.DataPin d.dc = c.DataPin.Set
d.rst = c.ResetPin d.rst = c.ResetPin.Set
d.busy = c.BusyPin d.isBusy = c.BusyPin.Get
legacy.ConfigurePinOut(c.ChipSelectPin)
d.cs.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(c.DataPin)
d.dc.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(c.ResetPin)
d.rst.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinInput(c.BusyPin)
d.busy.Configure(machine.PinConfig{Mode: machine.PinInput})
return nil return nil
} }
@@ -229,7 +227,7 @@ func (d *Device) WaitUntilIdle() {
// give it some time to get busy // give it some time to get busy
time.Sleep(50 * time.Millisecond) time.Sleep(50 * time.Millisecond)
for d.busy.Get() { // high = busy for d.isBusy() { // high = busy
time.Sleep(10 * time.Millisecond) time.Sleep(10 * time.Millisecond)
} }
+18 -17
View File
@@ -13,10 +13,11 @@ package epd2in9 // import "tinygo.org/x/drivers/waveshare-epd/epd2in9"
import ( import (
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Config struct { type Config struct {
@@ -28,10 +29,10 @@ type Config struct {
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
logicalWidth int16 logicalWidth int16
width int16 width int16
height int16 height int16
@@ -61,17 +62,17 @@ var lutPartialUpdate = [30]uint8{
} }
// New returns a new epd2in9 driver. Pass in a fully configured SPI bus. // New returns a new epd2in9 driver. Pass in a fully configured SPI bus.
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device { func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(rstPin)
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput}) legacy.ConfigurePinInput(busyPin)
return Device{ return Device{
bus: bus, bus: bus,
cs: csPin, cs: csPin.Set,
dc: dcPin, dc: dcPin.Set,
rst: rstPin, rst: rstPin.Set,
busy: busyPin, isBusy: busyPin.Get,
} }
} }
@@ -245,14 +246,14 @@ func (d *Device) setMemoryPointer(x int16, y int16) {
// WaitUntilIdle waits until the display is ready // WaitUntilIdle waits until the display is ready
func (d *Device) WaitUntilIdle() { func (d *Device) WaitUntilIdle() {
for d.busy.Get() { for d.isBusy() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
} }
// IsBusy returns the busy status of the display // IsBusy returns the busy status of the display
func (d *Device) IsBusy() bool { func (d *Device) IsBusy() bool {
return d.busy.Get() return d.isBusy()
} }
// ClearBuffer sets the buffer to 0xFF (white) // ClearBuffer sets the buffer to 0xFF (white)
+18 -17
View File
@@ -10,10 +10,11 @@ package epd4in2
import ( import (
"image/color" "image/color"
"machine"
"time" "time"
"tinygo.org/x/drivers" "tinygo.org/x/drivers"
"tinygo.org/x/drivers/internal/legacy"
"tinygo.org/x/drivers/internal/pin"
) )
type Config struct { type Config struct {
@@ -25,10 +26,10 @@ type Config struct {
type Device struct { type Device struct {
bus drivers.SPI bus drivers.SPI
cs machine.Pin cs pin.OutputFunc
dc machine.Pin dc pin.OutputFunc
rst machine.Pin rst pin.OutputFunc
busy machine.Pin isBusy pin.InputFunc
logicalWidth int16 logicalWidth int16
width int16 width int16
height int16 height int16
@@ -40,17 +41,17 @@ type Device struct {
type Rotation uint8 type Rotation uint8
// New returns a new epd4in2 driver. Pass in a fully configured SPI bus. // New returns a new epd4in2 driver. Pass in a fully configured SPI bus.
func New(bus drivers.SPI, csPin, dcPin, rstPin, busyPin machine.Pin) Device { func New(bus drivers.SPI, csPin, dcPin, rstPin pin.Output, busyPin pin.Input) Device {
csPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(csPin)
dcPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(dcPin)
rstPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) legacy.ConfigurePinOut(rstPin)
busyPin.Configure(machine.PinConfig{Mode: machine.PinInput}) legacy.ConfigurePinInput(busyPin)
return Device{ return Device{
bus: bus, bus: bus,
cs: csPin, cs: csPin.Set,
dc: dcPin, dc: dcPin.Set,
rst: rstPin, rst: rstPin.Set,
busy: busyPin, isBusy: busyPin.Get,
} }
} }
@@ -311,14 +312,14 @@ func (d *Device) ClearDisplay() {
// WaitUntilIdle waits until the display is ready // WaitUntilIdle waits until the display is ready
func (d *Device) WaitUntilIdle() { func (d *Device) WaitUntilIdle() {
for d.busy.Get() { for d.isBusy() {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
} }
// IsBusy returns the busy status of the display // IsBusy returns the busy status of the display
func (d *Device) IsBusy() bool { func (d *Device) IsBusy() bool {
return d.busy.Get() return d.isBusy()
} }
// ClearBuffer sets the buffer to 0xFF (white) // ClearBuffer sets the buffer to 0xFF (white)