ninafw: Adding init options to enable customizing hardware
This commit is contained in:
parent
bf647ecd57
commit
f100ba6eb2
5 changed files with 95 additions and 20 deletions
4
Makefile
4
Makefile
|
@ -42,6 +42,10 @@ smoketest-tinygo:
|
||||||
@md5sum test.hex
|
@md5sum test.hex
|
||||||
$(TINYGO) build -o test.uf2 -size=short -target=nano-rp2040 ./examples/advertisement
|
$(TINYGO) build -o test.uf2 -size=short -target=nano-rp2040 ./examples/advertisement
|
||||||
@md5sum test.hex
|
@md5sum test.hex
|
||||||
|
$(TINYGO) build -o test.uf2 -size=short -target=feather-m4 -tags="ninafw ninafw_featherwing_init" ./examples/advertisement
|
||||||
|
@md5sum test.hex
|
||||||
|
$(TINYGO) build -o test.uf2 -size=short -target=pybadge ./examples/advertisement
|
||||||
|
@md5sum test.hex
|
||||||
|
|
||||||
smoketest-linux:
|
smoketest-linux:
|
||||||
# Test on Linux.
|
# Test on Linux.
|
||||||
|
|
|
@ -284,6 +284,10 @@ For example, this command can be used to compile and flash an Arduino Nano RP204
|
||||||
|
|
||||||
tinygo flash -target nano-rp2040 ./examples/heartrate
|
tinygo flash -target nano-rp2040 ./examples/heartrate
|
||||||
|
|
||||||
|
When using the AirLift WiFi Featherwing with one of Adafruit's feather boards, you can use `ninafw ninafw_featherwing_init` build tags to set up the hardware using the default pins. Make sure to [connect the solder pads on the underside of the board](https://learn.adafruit.com/adafruit-airlift-featherwing-esp32-wifi-co-processor-featherwing/pinouts#spi-and-control-pins-3029450) in order to enable BLE support (see "Optional Control Pins" section).
|
||||||
|
|
||||||
|
To use ninafw with other boards, you will need to use the `ninafw` build tag as well as configure the pins and UART for communicating with the ESP32 module by configuring the `AdapterConfig` package variable before calling `DefaultAdapter.Enable()`. See [`adapter_ninafw-featherwing.go`](adapter_ninafw-featherwing.go) for an example of setting the hardware configuration options.
|
||||||
|
|
||||||
If you want more information about the `nina-fw` firmware, or want to add support for other ESP32-equipped boards, please see https://github.com/arduino/nina-fw
|
If you want more information about the `nina-fw` firmware, or want to add support for other ESP32-equipped boards, please see https://github.com/arduino/nina-fw
|
||||||
|
|
||||||
## API stability
|
## API stability
|
||||||
|
|
22
adapter_ninafw-featherwing.go
Normal file
22
adapter_ninafw-featherwing.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
//go:build ninafw && ninafw_featherwing_init
|
||||||
|
|
||||||
|
package bluetooth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"machine"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
AdapterConfig = NINAConfig{
|
||||||
|
UART: machine.DefaultUART,
|
||||||
|
CS: machine.D13,
|
||||||
|
ACK: machine.D11,
|
||||||
|
GPIO0: machine.D10,
|
||||||
|
RESETN: machine.D12,
|
||||||
|
CTS: machine.D11, // same as ACK
|
||||||
|
RTS: machine.D10, // same as GPIO0
|
||||||
|
BaudRate: 115200,
|
||||||
|
ResetInverted: true,
|
||||||
|
SoftFlowControl: true,
|
||||||
|
}
|
||||||
|
}
|
22
adapter_ninafw-machine.go
Normal file
22
adapter_ninafw-machine.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
//go:build ninafw && ninafw_machine_init
|
||||||
|
|
||||||
|
package bluetooth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"machine"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
AdapterConfig = NINAConfig{
|
||||||
|
UART: machine.UART_NINA,
|
||||||
|
CS: machine.NINA_CS,
|
||||||
|
ACK: machine.NINA_ACK,
|
||||||
|
GPIO0: machine.NINA_GPIO0,
|
||||||
|
RESETN: machine.NINA_RESETN,
|
||||||
|
CTS: machine.NINA_CTS,
|
||||||
|
RTS: machine.NINA_RTS,
|
||||||
|
BaudRate: machine.NINA_BAUDRATE,
|
||||||
|
ResetInverted: machine.NINA_RESET_INVERTED,
|
||||||
|
SoftFlowControl: machine.NINA_SOFT_FLOWCONTROL,
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,29 @@ import (
|
||||||
|
|
||||||
const maxConnections = 1
|
const maxConnections = 1
|
||||||
|
|
||||||
|
// NINAConfig encapsulates the hardware options for the NINA firmware
|
||||||
|
type NINAConfig struct {
|
||||||
|
UART *machine.UART
|
||||||
|
|
||||||
|
CS machine.Pin
|
||||||
|
ACK machine.Pin
|
||||||
|
GPIO0 machine.Pin
|
||||||
|
RESETN machine.Pin
|
||||||
|
|
||||||
|
TX machine.Pin
|
||||||
|
RX machine.Pin
|
||||||
|
CTS machine.Pin
|
||||||
|
RTS machine.Pin
|
||||||
|
|
||||||
|
BaudRate uint32
|
||||||
|
ResetInverted bool
|
||||||
|
SoftFlowControl bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdapterConfig is used to set the hardware options for the NINA adapter prior
|
||||||
|
// to calling DefaultAdapter.Enable()
|
||||||
|
var AdapterConfig NINAConfig
|
||||||
|
|
||||||
// Adapter represents the UART connection to the NINA fw.
|
// Adapter represents the UART connection to the NINA fw.
|
||||||
type Adapter struct {
|
type Adapter struct {
|
||||||
hci *hci
|
hci *hci
|
||||||
|
@ -40,37 +63,37 @@ var DefaultAdapter = &Adapter{
|
||||||
// Bluetooth-related calls (unless otherwise indicated).
|
// Bluetooth-related calls (unless otherwise indicated).
|
||||||
func (a *Adapter) Enable() error {
|
func (a *Adapter) Enable() error {
|
||||||
// reset the NINA in BLE mode
|
// reset the NINA in BLE mode
|
||||||
machine.NINA_CS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
AdapterConfig.CS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
machine.NINA_CS.Low()
|
AdapterConfig.CS.Low()
|
||||||
|
|
||||||
if machine.NINA_RESET_INVERTED {
|
if AdapterConfig.ResetInverted {
|
||||||
resetNINAInverted()
|
resetNINAInverted()
|
||||||
} else {
|
} else {
|
||||||
resetNINA()
|
resetNINA()
|
||||||
}
|
}
|
||||||
|
|
||||||
// serial port for nina chip
|
// serial port for nina chip
|
||||||
uart := machine.UART_NINA
|
uart := AdapterConfig.UART
|
||||||
cfg := machine.UARTConfig{
|
cfg := machine.UARTConfig{
|
||||||
TX: machine.NINA_TX,
|
TX: AdapterConfig.TX,
|
||||||
RX: machine.NINA_RX,
|
RX: AdapterConfig.RX,
|
||||||
BaudRate: machine.NINA_BAUDRATE,
|
BaudRate: AdapterConfig.BaudRate,
|
||||||
}
|
}
|
||||||
if !machine.NINA_SOFT_FLOWCONTROL {
|
if !AdapterConfig.SoftFlowControl {
|
||||||
cfg.CTS = machine.NINA_CTS
|
cfg.CTS = AdapterConfig.CTS
|
||||||
cfg.RTS = machine.NINA_RTS
|
cfg.RTS = AdapterConfig.RTS
|
||||||
}
|
}
|
||||||
|
|
||||||
uart.Configure(cfg)
|
uart.Configure(cfg)
|
||||||
|
|
||||||
a.hci, a.att = newBLEStack(uart)
|
a.hci, a.att = newBLEStack(uart)
|
||||||
if machine.NINA_SOFT_FLOWCONTROL {
|
if AdapterConfig.SoftFlowControl {
|
||||||
a.hci.softRTS = machine.NINA_RTS
|
a.hci.softRTS = AdapterConfig.RTS
|
||||||
a.hci.softRTS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
a.hci.softRTS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
a.hci.softRTS.High()
|
a.hci.softRTS.High()
|
||||||
|
|
||||||
a.hci.softCTS = machine.NINA_CTS
|
a.hci.softCTS = AdapterConfig.CTS
|
||||||
machine.NINA_CTS.Configure(machine.PinConfig{Mode: machine.PinInput})
|
AdapterConfig.CTS.Configure(machine.PinConfig{Mode: machine.PinInput})
|
||||||
}
|
}
|
||||||
|
|
||||||
a.hci.start()
|
a.hci.start()
|
||||||
|
@ -133,20 +156,20 @@ func makeNINAAddress(mac MAC) [6]uint8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetNINA() {
|
func resetNINA() {
|
||||||
machine.NINA_RESETN.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
AdapterConfig.RESETN.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
|
|
||||||
machine.NINA_RESETN.High()
|
AdapterConfig.RESETN.High()
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
machine.NINA_RESETN.Low()
|
AdapterConfig.RESETN.Low()
|
||||||
time.Sleep(1000 * time.Millisecond)
|
time.Sleep(1000 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetNINAInverted() {
|
func resetNINAInverted() {
|
||||||
machine.NINA_RESETN.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
AdapterConfig.RESETN.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
|
|
||||||
machine.NINA_RESETN.Low()
|
AdapterConfig.RESETN.Low()
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
machine.NINA_RESETN.High()
|
AdapterConfig.RESETN.High()
|
||||||
time.Sleep(1000 * time.Millisecond)
|
time.Sleep(1000 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue