mirror of
https://github.com/hybridgroup/gobot.git
synced 2025-04-29 13:49:14 +08:00
i2c/spi: remove offensive terminology
This commit is contained in:
parent
c159228f48
commit
baafed367c
@ -37,7 +37,7 @@ func getSyscallFuncImpl(
|
|||||||
system.I2C_FUNC_SMBUS_WRITE_WORD_DATA
|
system.I2C_FUNC_SMBUS_WRITE_WORD_DATA
|
||||||
}
|
}
|
||||||
// set address
|
// set address
|
||||||
if (trap == system.Syscall_SYS_IOCTL) && (a2 == system.I2C_SLAVE) {
|
if (trap == system.Syscall_SYS_IOCTL) && (a2 == system.I2C_TARGET) {
|
||||||
if errorMask&0x02 == 0x02 {
|
if errorMask&0x02 == 0x02 {
|
||||||
return 0, 0, 1
|
return 0, 0, 1
|
||||||
}
|
}
|
||||||
|
@ -19,17 +19,17 @@ import (
|
|||||||
// Wiring
|
// Wiring
|
||||||
// PWR Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)
|
// PWR Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)
|
||||||
// GPIO-SPI Tinkerboard (same as SPI2): 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0)
|
// GPIO-SPI Tinkerboard (same as SPI2): 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0)
|
||||||
// MFRC522 plate: VCC, GND, SCK (CLK), MOSI (->TXD), MISO (->RXD), NSS/SDA (CSN0/CSN1?)
|
// MFRC522 plate: VCC, GND, SCK (CLK), SDO (->TXD), SDI (->RXD), NCS/SDA (CSN0/CSN1?)
|
||||||
const (
|
const (
|
||||||
sclk = "23"
|
sclk = "23"
|
||||||
nss = "24"
|
ncs = "24"
|
||||||
mosi = "19"
|
sdo = "19"
|
||||||
miso = "21"
|
sdi = "21"
|
||||||
speedHz = 5000 // more than 15kHz is not possible with GPIO's, so we choose 5kHz
|
speedHz = 5000 // more than 15kHz is not possible with GPIO's, so we choose 5kHz
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
a := tinkerboard.NewAdaptor(adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso))
|
a := tinkerboard.NewAdaptor(adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi))
|
||||||
d := spi.NewMFRC522Driver(a, spi.WithSpeed(speedHz))
|
d := spi.NewMFRC522Driver(a, spi.WithSpeed(speedHz))
|
||||||
|
|
||||||
wasCardDetected := false
|
wasCardDetected := false
|
||||||
|
@ -19,7 +19,7 @@ import (
|
|||||||
// PWR Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)
|
// PWR Tinkerboard: 1 (+3.3V, VCC), 2(+5V), 6, 9, 14, 20 (GND)
|
||||||
// SPI0 Tinkerboard (not working with armbian): 11 (CLK), 13 (TXD), 15 (RXD), 29 (CSN0), 31 (CSN1, n.c.)
|
// SPI0 Tinkerboard (not working with armbian): 11 (CLK), 13 (TXD), 15 (RXD), 29 (CSN0), 31 (CSN1, n.c.)
|
||||||
// SPI2 Tinkerboard: 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0), 26 (CSN1, n.c.)
|
// SPI2 Tinkerboard: 23 (CLK), 19 (TXD), 21 (RXD), 24 (CSN0), 26 (CSN1, n.c.)
|
||||||
// MFRC522 plate: VCC, GND, SCK (CLK), MOSI (->TXD), MISO (->RXD), NSS/SDA (CSN0/CSN1?)
|
// MFRC522 plate: VCC, GND, SCK (CLK), SDO (->TXD), SDI (->RXD), NCS/SDA (CSN0/CSN1?)
|
||||||
func main() {
|
func main() {
|
||||||
a := tinkerboard.NewAdaptor()
|
a := tinkerboard.NewAdaptor()
|
||||||
d := spi.NewMFRC522Driver(a, spi.WithBusNumber(2))
|
d := spi.NewMFRC522Driver(a, spi.WithBusNumber(2))
|
||||||
|
@ -63,9 +63,9 @@ func WithGpiodAccess() func(DigitalPinsOptioner) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.
|
// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.
|
||||||
func WithSpiGpioAccess(sclkPin, nssPin, mosiPin, misoPin string) func(DigitalPinsOptioner) {
|
func WithSpiGpioAccess(sclkPin, ncsPin, sdoPin, sdiPin string) func(DigitalPinsOptioner) {
|
||||||
return func(o DigitalPinsOptioner) {
|
return func(o DigitalPinsOptioner) {
|
||||||
o.setDigitalPinsForSystemSpi(sclkPin, nssPin, mosiPin, misoPin)
|
o.setDigitalPinsForSystemSpi(sclkPin, ncsPin, sdoPin, sdiPin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ import (
|
|||||||
type DigitalPinsOptioner interface {
|
type DigitalPinsOptioner interface {
|
||||||
setDigitalPinInitializer(initializer digitalPinInitializer)
|
setDigitalPinInitializer(initializer digitalPinInitializer)
|
||||||
setDigitalPinsForSystemGpiod()
|
setDigitalPinsForSystemGpiod()
|
||||||
setDigitalPinsForSystemSpi(sclkPin, nssPin, mosiPin, misoPin string)
|
setDigitalPinsForSystemSpi(sclkPin, ncsPin, sdoPin, sdiPin string)
|
||||||
prepareDigitalPinsActiveLow(pin string, otherPins ...string)
|
prepareDigitalPinsActiveLow(pin string, otherPins ...string)
|
||||||
prepareDigitalPinsPullDown(pin string, otherPins ...string)
|
prepareDigitalPinsPullDown(pin string, otherPins ...string)
|
||||||
prepareDigitalPinsPullUp(pin string, otherPins ...string)
|
prepareDigitalPinsPullUp(pin string, otherPins ...string)
|
||||||
@ -37,8 +37,8 @@ func (a *DigitalPinsAdaptor) setDigitalPinsForSystemGpiod() {
|
|||||||
system.WithDigitalPinGpiodAccess()(a.sys)
|
system.WithDigitalPinGpiodAccess()(a.sys)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DigitalPinsAdaptor) setDigitalPinsForSystemSpi(sclkPin, nssPin, mosiPin, misoPin string) {
|
func (a *DigitalPinsAdaptor) setDigitalPinsForSystemSpi(sclkPin, ncsPin, sdoPin, sdiPin string) {
|
||||||
system.WithSpiGpioAccess(a, sclkPin, nssPin, mosiPin, misoPin)(a.sys)
|
system.WithSpiGpioAccess(a, sclkPin, ncsPin, sdoPin, sdiPin)(a.sys)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *DigitalPinsAdaptor) prepareDigitalPinsActiveLow(id string, otherIDs ...string) {
|
func (a *DigitalPinsAdaptor) prepareDigitalPinsActiveLow(id string, otherIDs ...string) {
|
||||||
|
@ -60,7 +60,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewAdaptor(opts ...interface{}) *Adaptor {
|
func NewAdaptor(opts ...interface{}) *Adaptor {
|
||||||
|
@ -16,7 +16,7 @@ type PocketBeagleAdaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewPocketBeagleAdaptor(opts ...interface{}) *PocketBeagleAdaptor {
|
func NewPocketBeagleAdaptor(opts ...interface{}) *PocketBeagleAdaptor {
|
||||||
|
@ -41,7 +41,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewAdaptor(opts ...interface{}) *Adaptor {
|
func NewAdaptor(opts ...interface{}) *Adaptor {
|
||||||
|
@ -339,7 +339,7 @@ void spi_init(littleWire* lwHandle);
|
|||||||
void spi_sendMessage(littleWire* lwHandle, unsigned char * sendBuffer, unsigned char * inputBuffer, unsigned char length ,unsigned char mode);
|
void spi_sendMessage(littleWire* lwHandle, unsigned char * sendBuffer, unsigned char * inputBuffer, unsigned char length ,unsigned char mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send one byte SPI message over MOSI pin. Slightly slower than the actual one.
|
* Send one byte SPI message over SDO pin. Slightly slower than the actual one.
|
||||||
* \n There isn't any chip select control involved. Useful for debug console app
|
* \n There isn't any chip select control involved. Useful for debug console app
|
||||||
*
|
*
|
||||||
* @param lwHandle littleWire device pointer
|
* @param lwHandle littleWire device pointer
|
||||||
@ -376,7 +376,7 @@ void i2c_init(littleWire* lwHandle);
|
|||||||
* Start the i2c communication
|
* Start the i2c communication
|
||||||
*
|
*
|
||||||
* @param lwHandle littleWire device pointer
|
* @param lwHandle littleWire device pointer
|
||||||
* @param address 7 bit slave address.
|
* @param address 7 bit target address.
|
||||||
* @param direction ( \b READ or \b WRITE )
|
* @param direction ( \b READ or \b WRITE )
|
||||||
* @return 1 if received ACK
|
* @return 1 if received ACK
|
||||||
*/
|
*/
|
||||||
|
@ -49,7 +49,7 @@ var fixedPins = map[string]int{
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
func NewAdaptor(opts ...func(adaptors.DigitalPinsOptioner)) *Adaptor {
|
func NewAdaptor(opts ...func(adaptors.DigitalPinsOptioner)) *Adaptor {
|
||||||
sys := system.NewAccesser()
|
sys := system.NewAccesser()
|
||||||
c := &Adaptor{
|
c := &Adaptor{
|
||||||
|
@ -86,13 +86,13 @@ func (imu *IMUDriver) Start() error {
|
|||||||
// Halt stops the IMUDriver
|
// Halt stops the IMUDriver
|
||||||
func (imu *IMUDriver) Halt() error { return nil }
|
func (imu *IMUDriver) Halt() error { return nil }
|
||||||
|
|
||||||
// Name returns the IMUDriver's name
|
// Name returns the IMUDrivers name
|
||||||
func (imu *IMUDriver) Name() string { return imu.name }
|
func (imu *IMUDriver) Name() string { return imu.name }
|
||||||
|
|
||||||
// SetName sets the IMUDriver'ss name
|
// SetName sets the IMUDrivers name
|
||||||
func (imu *IMUDriver) SetName(n string) { imu.name = n }
|
func (imu *IMUDriver) SetName(n string) { imu.name = n }
|
||||||
|
|
||||||
// Connection returns the IMUDriver's Connection
|
// Connection returns the IMUDrivers Connection
|
||||||
func (imu *IMUDriver) Connection() gobot.Connection { return imu.connection }
|
func (imu *IMUDriver) Connection() gobot.Connection { return imu.connection }
|
||||||
|
|
||||||
// ReadAccelerometer calls the Curie's built-in accelerometer. The result will
|
// ReadAccelerometer calls the Curie's built-in accelerometer. The result will
|
||||||
|
@ -33,7 +33,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewAdaptor(opts ...interface{}) *Adaptor {
|
func NewAdaptor(opts ...interface{}) *Adaptor {
|
||||||
|
@ -41,7 +41,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewAdaptor(opts ...interface{}) *Adaptor {
|
func NewAdaptor(opts ...interface{}) *Adaptor {
|
||||||
|
@ -451,7 +451,7 @@ const (
|
|||||||
MAV_CMD_DO_PARACHUTE = 208 // Mission command to trigger a parachute | action (0=disable, 1=enable, 2=release, for some systems see PARACHUTE_ACTION enum, not in general message set.) | Empty | Empty | Empty | Empty | Empty | Empty |
|
MAV_CMD_DO_PARACHUTE = 208 // Mission command to trigger a parachute | action (0=disable, 1=enable, 2=release, for some systems see PARACHUTE_ACTION enum, not in general message set.) | Empty | Empty | Empty | Empty | Empty | Empty |
|
||||||
MAV_CMD_DO_INVERTED_FLIGHT = 210 // Change to/from inverted flight | inverted (0=normal, 1=inverted) | Empty | Empty | Empty | Empty | Empty | Empty |
|
MAV_CMD_DO_INVERTED_FLIGHT = 210 // Change to/from inverted flight | inverted (0=normal, 1=inverted) | Empty | Empty | Empty | Empty | Empty | Empty |
|
||||||
MAV_CMD_DO_MOUNT_CONTROL_QUAT = 220 // Mission command to control a camera or antenna mount, using a quaternion as reference. | q1 - quaternion param #1, w (1 in null-rotation) | q2 - quaternion param #2, x (0 in null-rotation) | q3 - quaternion param #3, y (0 in null-rotation) | q4 - quaternion param #4, z (0 in null-rotation) | Empty | Empty | Empty |
|
MAV_CMD_DO_MOUNT_CONTROL_QUAT = 220 // Mission command to control a camera or antenna mount, using a quaternion as reference. | q1 - quaternion param #1, w (1 in null-rotation) | q2 - quaternion param #2, x (0 in null-rotation) | q3 - quaternion param #3, y (0 in null-rotation) | q4 - quaternion param #4, z (0 in null-rotation) | Empty | Empty | Empty |
|
||||||
MAV_CMD_DO_GUIDED_MASTER = 221 // set id of master controller | System ID | Component ID | Empty | Empty | Empty | Empty | Empty |
|
MAV_CMD_DO_GUIDED_CONTROLLER = 221 // set id of the controller | System ID | Component ID | Empty | Empty | Empty | Empty | Empty |
|
||||||
MAV_CMD_DO_GUIDED_LIMITS = 222 // set limits for external control | timeout - maximum time (in seconds) that external controller will be allowed to control vehicle. 0 means no timeout | absolute altitude min (in meters, WGS84) - if vehicle moves below this alt, the command will be aborted and the mission will continue. 0 means no lower altitude limit | absolute altitude max (in meters)- if vehicle moves above this alt, the command will be aborted and the mission will continue. 0 means no upper altitude limit | horizontal move limit (in meters, WGS84) - if vehicle moves more than this distance from it's location at the moment the command was executed, the command will be aborted and the mission will continue. 0 means no horizontal altitude limit | Empty | Empty | Empty |
|
MAV_CMD_DO_GUIDED_LIMITS = 222 // set limits for external control | timeout - maximum time (in seconds) that external controller will be allowed to control vehicle. 0 means no timeout | absolute altitude min (in meters, WGS84) - if vehicle moves below this alt, the command will be aborted and the mission will continue. 0 means no lower altitude limit | absolute altitude max (in meters)- if vehicle moves above this alt, the command will be aborted and the mission will continue. 0 means no upper altitude limit | horizontal move limit (in meters, WGS84) - if vehicle moves more than this distance from it's location at the moment the command was executed, the command will be aborted and the mission will continue. 0 means no horizontal altitude limit | Empty | Empty | Empty |
|
||||||
MAV_CMD_DO_LAST = 240 // NOP - This command is only used to mark the upper limit of the DO commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty |
|
MAV_CMD_DO_LAST = 240 // NOP - This command is only used to mark the upper limit of the DO commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty |
|
||||||
MAV_CMD_PREFLIGHT_CALIBRATION = 241 // Trigger calibration. This command will be only accepted if in pre-flight mode. | Gyro calibration: 0: no, 1: yes | Magnetometer calibration: 0: no, 1: yes | Ground pressure: 0: no, 1: yes | Radio calibration: 0: no, 1: yes | Accelerometer calibration: 0: no, 1: yes | Compass/Motor interference calibration: 0: no, 1: yes | Empty |
|
MAV_CMD_PREFLIGHT_CALIBRATION = 241 // Trigger calibration. This command will be only accepted if in pre-flight mode. | Gyro calibration: 0: no, 1: yes | Magnetometer calibration: 0: no, 1: yes | Ground pressure: 0: no, 1: yes | Radio calibration: 0: no, 1: yes | Accelerometer calibration: 0: no, 1: yes | Compass/Motor interference calibration: 0: no, 1: yes | Empty |
|
||||||
@ -879,7 +879,7 @@ func (m *SysStatus) Decode(buf []byte) {
|
|||||||
//
|
//
|
||||||
// MAVLINK_MSG_ID_SYSTEM_TIME_CRC 137
|
// MAVLINK_MSG_ID_SYSTEM_TIME_CRC 137
|
||||||
type SystemTime struct {
|
type SystemTime struct {
|
||||||
TIME_UNIX_USEC uint64 // Timestamp of the master clock in microseconds since UNIX epoch.
|
TIME_UNIX_USEC uint64 // Timestamp of the primary reference clock in microseconds since UNIX epoch.
|
||||||
TIME_BOOT_MS uint32 // Timestamp of the component clock since boot time in milliseconds.
|
TIME_BOOT_MS uint32 // Timestamp of the component clock since boot time in milliseconds.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
||||||
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
||||||
// adaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior
|
// adaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior
|
||||||
|
@ -8,8 +8,8 @@ var neoGpioPins = map[string]gpioPinDefinition{
|
|||||||
"13": {sysfs: 2, cdev: cdevPin{chip: 0, line: 2}}, // UART2_RTS/GPIOA2
|
"13": {sysfs: 2, cdev: cdevPin{chip: 0, line: 2}}, // UART2_RTS/GPIOA2
|
||||||
"15": {sysfs: 3, cdev: cdevPin{chip: 0, line: 3}}, // UART2_CTS/GPIOA3
|
"15": {sysfs: 3, cdev: cdevPin{chip: 0, line: 3}}, // UART2_CTS/GPIOA3
|
||||||
"12": {sysfs: 6, cdev: cdevPin{chip: 0, line: 6}}, // GPIOA6
|
"12": {sysfs: 6, cdev: cdevPin{chip: 0, line: 6}}, // GPIOA6
|
||||||
"19": {sysfs: 64, cdev: cdevPin{chip: 0, line: 64}}, // SPI0_MOSI/GPIOC0
|
"19": {sysfs: 64, cdev: cdevPin{chip: 0, line: 64}}, // SPI0_SDO/GPIOC0
|
||||||
"21": {sysfs: 65, cdev: cdevPin{chip: 0, line: 65}}, // SPI0_MISO/GPIOC1
|
"21": {sysfs: 65, cdev: cdevPin{chip: 0, line: 65}}, // SPI0_SDI/GPIOC1
|
||||||
"23": {sysfs: 66, cdev: cdevPin{chip: 0, line: 66}}, // SPI0_CLK/GPIOC2
|
"23": {sysfs: 66, cdev: cdevPin{chip: 0, line: 66}}, // SPI0_CLK/GPIOC2
|
||||||
"24": {sysfs: 67, cdev: cdevPin{chip: 0, line: 67}}, // SPI0_CS/GPIOC3
|
"24": {sysfs: 67, cdev: cdevPin{chip: 0, line: 67}}, // SPI0_CS/GPIOC3
|
||||||
"8": {sysfs: 198, cdev: cdevPin{chip: 0, line: 198}}, // UART1_TX/GPIOG6
|
"8": {sysfs: 198, cdev: cdevPin{chip: 0, line: 198}}, // UART1_TX/GPIOG6
|
||||||
|
@ -48,7 +48,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
||||||
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
||||||
// adaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior
|
// adaptors.WithGpiosOpenDrain/Source(pin's): sets the output behavior
|
||||||
|
@ -42,7 +42,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of the default sysfs (NOT work on RockPi4C+!)
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of the default sysfs (NOT work on RockPi4C+!)
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
||||||
func NewAdaptor(opts ...func(adaptors.DigitalPinsOptioner)) *Adaptor {
|
func NewAdaptor(opts ...func(adaptors.DigitalPinsOptioner)) *Adaptor {
|
||||||
sys := system.NewAccesser()
|
sys := system.NewAccesser()
|
||||||
|
@ -61,7 +61,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs (still used by default)
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
// adaptors.WithGpiosActiveLow(pin's): invert the pin behavior
|
||||||
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
// adaptors.WithGpiosPullUp/Down(pin's): sets the internal pull resistor
|
||||||
//
|
//
|
||||||
|
@ -55,7 +55,7 @@ type Adaptor struct {
|
|||||||
// Optional parameters:
|
// Optional parameters:
|
||||||
//
|
//
|
||||||
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
// adaptors.WithGpiodAccess(): use character device gpiod driver instead of sysfs
|
||||||
// adaptors.WithSpiGpioAccess(sclk, nss, mosi, miso): use GPIO's instead of /dev/spidev#.#
|
// adaptors.WithSpiGpioAccess(sclk, ncs, sdo, sdi): use GPIO's instead of /dev/spidev#.#
|
||||||
//
|
//
|
||||||
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
// Optional parameters for PWM, see [adaptors.NewPWMPinsAdaptor]
|
||||||
func NewAdaptor(opts ...interface{}) *Adaptor {
|
func NewAdaptor(opts ...interface{}) *Adaptor {
|
||||||
|
@ -66,8 +66,8 @@ gpiochip0 - 54 lines:
|
|||||||
...
|
...
|
||||||
line 7: "SPI_CE1_N" unused input active-high
|
line 7: "SPI_CE1_N" unused input active-high
|
||||||
line 8: "SPI_CE0_N" unused input active-high
|
line 8: "SPI_CE0_N" unused input active-high
|
||||||
line 9: "SPI_MISO" unused input active-high
|
line 9: "SPI_SDI" unused input active-high
|
||||||
line 10: "SPI_MOSI" unused input active-high
|
line 10: "SPI_SDO" unused input active-high
|
||||||
line 11: "SPI_SCLK" unused input active-high
|
line 11: "SPI_SCLK" unused input active-high
|
||||||
...
|
...
|
||||||
line 14: "TXD0" unused input active-high
|
line 14: "TXD0" unused input active-high
|
||||||
|
@ -23,7 +23,7 @@ In general there are different ioctl features for I2C
|
|||||||
> Some calls are branched by kernels [i2c-dev.c:i2cdev_ioctl()](https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-dev.c#L392)
|
> Some calls are branched by kernels [i2c-dev.c:i2cdev_ioctl()](https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-dev.c#L392)
|
||||||
> to the next listed calls.
|
> to the next listed calls.
|
||||||
|
|
||||||
Set the device address `ioctl(file, I2C_SLAVE, long addr)`. The call set the address directly to the character device.
|
Set the device address `ioctl(file, I2C_TARGET, long addr)`. The call set the address directly to the character device.
|
||||||
|
|
||||||
Query the supported functions `ioctl(file, I2C_FUNCS, unsigned long *funcs)`. The call is converted to in-kernel function
|
Query the supported functions `ioctl(file, I2C_FUNCS, unsigned long *funcs)`. The call is converted to in-kernel function
|
||||||
[i2c.h:i2c_get_functionality()](https://elixir.bootlin.com/linux/latest/source/include/linux/i2c.h#L902)
|
[i2c.h:i2c_get_functionality()](https://elixir.bootlin.com/linux/latest/source/include/linux/i2c.h#L902)
|
||||||
|
@ -16,9 +16,9 @@ const (
|
|||||||
const (
|
const (
|
||||||
// From /usr/include/linux/i2c-dev.h:
|
// From /usr/include/linux/i2c-dev.h:
|
||||||
// ioctl signals
|
// ioctl signals
|
||||||
I2C_SLAVE = 0x0703
|
I2C_TARGET = 0x0703
|
||||||
I2C_FUNCS = 0x0705
|
I2C_FUNCS = 0x0705
|
||||||
I2C_SMBUS = 0x0720
|
I2C_SMBUS = 0x0720
|
||||||
// Read/write markers
|
// Read/write markers
|
||||||
I2C_SMBUS_READ = 1
|
I2C_SMBUS_READ = 1
|
||||||
I2C_SMBUS_WRITE = 0
|
I2C_SMBUS_WRITE = 0
|
||||||
@ -371,7 +371,7 @@ func (d *i2cDevice) setAddress(address int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := d.syscallIoctl(I2C_SLAVE, nil, address, "Setting address"); err != nil {
|
if err := d.syscallIoctl(I2C_TARGET, nil, address, "Setting address"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
d.lastAddress = address
|
d.lastAddress = address
|
||||||
|
@ -34,7 +34,7 @@ func getSyscallFuncImpl(
|
|||||||
I2C_FUNC_SMBUS_WRITE_WORD_DATA
|
I2C_FUNC_SMBUS_WRITE_WORD_DATA
|
||||||
}
|
}
|
||||||
// set address
|
// set address
|
||||||
if (trap == Syscall_SYS_IOCTL) && (a2 == I2C_SLAVE) {
|
if (trap == Syscall_SYS_IOCTL) && (a2 == I2C_TARGET) {
|
||||||
if errorMask&0x02 == 0x02 {
|
if errorMask&0x02 == 0x02 {
|
||||||
return 0, 0, 1
|
return 0, 0, 1
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,9 @@ import (
|
|||||||
type spiGpioConfig struct {
|
type spiGpioConfig struct {
|
||||||
pinProvider gobot.DigitalPinnerProvider
|
pinProvider gobot.DigitalPinnerProvider
|
||||||
sclkPinID string
|
sclkPinID string
|
||||||
nssPinID string
|
ncsPinID string
|
||||||
mosiPinID string
|
sdoPinID string
|
||||||
misoPinID string
|
sdiPinID string
|
||||||
}
|
}
|
||||||
|
|
||||||
// spiGpio is the implementation of the SPI interface using GPIO's.
|
// spiGpio is the implementation of the SPI interface using GPIO's.
|
||||||
@ -23,9 +23,9 @@ type spiGpio struct {
|
|||||||
// time between clock edges (i.e. half the cycle time)
|
// time between clock edges (i.e. half the cycle time)
|
||||||
tclk time.Duration
|
tclk time.Duration
|
||||||
sclkPin gobot.DigitalPinner
|
sclkPin gobot.DigitalPinner
|
||||||
nssPin gobot.DigitalPinner
|
ncsPin gobot.DigitalPinner
|
||||||
mosiPin gobot.DigitalPinner
|
sdoPin gobot.DigitalPinner
|
||||||
misoPin gobot.DigitalPinner
|
sdiPin gobot.DigitalPinner
|
||||||
}
|
}
|
||||||
|
|
||||||
// newSpiGpio creates and returns a new SPI connection based on given GPIO's.
|
// newSpiGpio creates and returns a new SPI connection based on given GPIO's.
|
||||||
@ -60,7 +60,7 @@ func (s *spiGpio) TxRx(tx []byte, rx []byte) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := s.nssPin.Write(0); err != nil {
|
if err := s.ncsPin.Write(0); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ func (s *spiGpio) TxRx(tx []byte, rx []byte) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.nssPin.Write(1)
|
return s.ncsPin.Write(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the SPI connection. Implements gobot.SpiSystemDevicer.
|
// Close the SPI connection. Implements gobot.SpiSystemDevicer.
|
||||||
@ -85,18 +85,18 @@ func (s *spiGpio) Close() error {
|
|||||||
err = multierror.Append(err, e)
|
err = multierror.Append(err, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.mosiPin != nil {
|
if s.sdoPin != nil {
|
||||||
if e := s.mosiPin.Unexport(); e != nil {
|
if e := s.sdoPin.Unexport(); e != nil {
|
||||||
err = multierror.Append(err, e)
|
err = multierror.Append(err, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.misoPin != nil {
|
if s.sdiPin != nil {
|
||||||
if e := s.misoPin.Unexport(); e != nil {
|
if e := s.sdiPin.Unexport(); e != nil {
|
||||||
err = multierror.Append(err, e)
|
err = multierror.Append(err, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.nssPin != nil {
|
if s.ncsPin != nil {
|
||||||
if e := s.nssPin.Unexport(); e != nil {
|
if e := s.ncsPin.Unexport(); e != nil {
|
||||||
err = multierror.Append(err, e)
|
err = multierror.Append(err, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ func (s *spiGpio) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cfg *spiGpioConfig) String() string {
|
func (cfg *spiGpioConfig) String() string {
|
||||||
return fmt.Sprintf("sclk: %s, nss: %s, mosi: %s, miso: %s", cfg.sclkPinID, cfg.nssPinID, cfg.mosiPinID, cfg.misoPinID)
|
return fmt.Sprintf("sclk: %s, ncs: %s, sdo: %s, sdi: %s", cfg.sclkPinID, cfg.ncsPinID, cfg.sdoPinID, cfg.sdiPinID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// transferByte simultaneously transmit and receive a byte
|
// transferByte simultaneously transmit and receive a byte
|
||||||
@ -116,7 +116,7 @@ func (s *spiGpio) transferByte(txByte uint8) (uint8, error) {
|
|||||||
bitMask := uint8(0x80) // start at MSBit
|
bitMask := uint8(0x80) // start at MSBit
|
||||||
|
|
||||||
for i := 0; i < 8; i++ {
|
for i := 0; i < 8; i++ {
|
||||||
if err := s.mosiPin.Write(int(txByte & bitMask)); err != nil {
|
if err := s.sdoPin.Write(int(txByte & bitMask)); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ func (s *spiGpio) transferByte(txByte uint8) (uint8, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
v, err := s.misoPin.Read()
|
v, err := s.sdiPin.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@ -146,12 +146,12 @@ func (s *spiGpio) transferByte(txByte uint8) (uint8, error) {
|
|||||||
|
|
||||||
func (s *spiGpio) initializeGpios() error {
|
func (s *spiGpio) initializeGpios() error {
|
||||||
var err error
|
var err error
|
||||||
// nss is an output, negated (currently not implemented at pin level)
|
// ncs is an output, negated (currently not implemented at pin level)
|
||||||
s.nssPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.nssPinID)
|
s.ncsPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.ncsPinID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := s.nssPin.ApplyOptions(WithPinDirectionOutput(1)); err != nil {
|
if err := s.ncsPin.ApplyOptions(WithPinDirectionOutput(1)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// sclk is an output, CPOL = 0
|
// sclk is an output, CPOL = 0
|
||||||
@ -162,15 +162,15 @@ func (s *spiGpio) initializeGpios() error {
|
|||||||
if err := s.sclkPin.ApplyOptions(WithPinDirectionOutput(0)); err != nil {
|
if err := s.sclkPin.ApplyOptions(WithPinDirectionOutput(0)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// miso is an input
|
// sdi is an input
|
||||||
s.misoPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.misoPinID)
|
s.sdiPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.sdiPinID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// mosi is an output
|
// sdo is an output
|
||||||
s.mosiPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.mosiPinID)
|
s.sdoPin, err = s.cfg.pinProvider.DigitalPin(s.cfg.sdoPinID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return s.mosiPin.ApplyOptions(WithPinDirectionOutput(0))
|
return s.sdoPin.ApplyOptions(WithPinDirectionOutput(0))
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ func (sys *nativeSyscall) syscall(
|
|||||||
address uint16,
|
address uint16,
|
||||||
) (r1, r2 uintptr, err SyscallErrno) {
|
) (r1, r2 uintptr, err SyscallErrno) {
|
||||||
var errNo unix.Errno
|
var errNo unix.Errno
|
||||||
if signal == I2C_SLAVE {
|
if signal == I2C_TARGET {
|
||||||
// this is the setup for the address, it just needs to be converted to an uintptr,
|
// this is the setup for the address, it just needs to be converted to an uintptr,
|
||||||
// the given payload is not used in this case, see the comment on the function
|
// the given payload is not used in this case, see the comment on the function
|
||||||
r1, r2, errNo = unix.Syscall(trap, f.Fd(), signal, uintptr(address))
|
r1, r2, errNo = unix.Syscall(trap, f.Fd(), signal, uintptr(address))
|
||||||
|
@ -30,7 +30,7 @@ func (sys *mockSyscall) syscall(
|
|||||||
sys.lastFile = f // a character device file (e.g. file to path "/dev/i2c-1")
|
sys.lastFile = f // a character device file (e.g. file to path "/dev/i2c-1")
|
||||||
sys.lastSignal = signal // points to used function type (e.g. I2C_SMBUS, I2C_RDWR)
|
sys.lastSignal = signal // points to used function type (e.g. I2C_SMBUS, I2C_RDWR)
|
||||||
|
|
||||||
if signal == I2C_SLAVE {
|
if signal == I2C_TARGET {
|
||||||
// this is the setup for the address, it needs to be converted to an uintptr,
|
// this is the setup for the address, it needs to be converted to an uintptr,
|
||||||
// the given payload is not used in this case, see the comment on the function used for production
|
// the given payload is not used in this case, see the comment on the function used for production
|
||||||
sys.devAddress = uintptr(address)
|
sys.devAddress = uintptr(address)
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
// caller/user when creating the system access, e.g. by "NewAccesser()".
|
// caller/user when creating the system access, e.g. by "NewAccesser()".
|
||||||
type Optioner interface {
|
type Optioner interface {
|
||||||
setDigitalPinToGpiodAccess()
|
setDigitalPinToGpiodAccess()
|
||||||
setSpiToGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, nssPin, mosiPin, misoPin string)
|
setSpiToGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, ncsPin, sdoPin, sdiPin string)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithDigitalPinGpiodAccess can be used to change the default sysfs implementation for digital pins to the character
|
// WithDigitalPinGpiodAccess can be used to change the default sysfs implementation for digital pins to the character
|
||||||
@ -22,9 +22,9 @@ func WithDigitalPinGpiodAccess() func(Optioner) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.
|
// WithSpiGpioAccess can be used to switch the default SPI implementation to GPIO usage.
|
||||||
func WithSpiGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, nssPin, mosiPin, misoPin string) func(Optioner) {
|
func WithSpiGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, ncsPin, sdoPin, sdiPin string) func(Optioner) {
|
||||||
return func(s Optioner) {
|
return func(s Optioner) {
|
||||||
s.setSpiToGpioAccess(p, sclkPin, nssPin, mosiPin, misoPin)
|
s.setSpiToGpioAccess(p, sclkPin, ncsPin, sdoPin, sdiPin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,13 +42,13 @@ func (a *Accesser) setDigitalPinToGpiodAccess() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Accesser) setSpiToGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, nssPin, mosiPin, misoPin string) {
|
func (a *Accesser) setSpiToGpioAccess(p gobot.DigitalPinnerProvider, sclkPin, ncsPin, sdoPin, sdiPin string) {
|
||||||
cfg := spiGpioConfig{
|
cfg := spiGpioConfig{
|
||||||
pinProvider: p,
|
pinProvider: p,
|
||||||
sclkPinID: sclkPin,
|
sclkPinID: sclkPin,
|
||||||
nssPinID: nssPin,
|
ncsPinID: ncsPin,
|
||||||
mosiPinID: mosiPin,
|
sdoPinID: sdoPin,
|
||||||
misoPinID: misoPin,
|
sdiPinID: sdiPin,
|
||||||
}
|
}
|
||||||
gsa := &gpioSpiAccess{cfg: cfg}
|
gsa := &gpioSpiAccess{cfg: cfg}
|
||||||
if gsa.isSupported() {
|
if gsa.isSupported() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user