sforkowany z mirror/meshtastic-firmware
commit
aba05ba5ce
|
@ -23,4 +23,4 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
pip install -U adafruit-nrfutil
|
pip install -U adafruit-nrfutil
|
||||||
- name: Build
|
- name: Build
|
||||||
run: platformio run -e tbeam -e heltec -e nrf52840dk -e rak815
|
run: platformio run -e tbeam -e heltec -e lora-relay-v1
|
||||||
|
|
|
@ -17,3 +17,5 @@ Thumbs.db
|
||||||
.cproject
|
.cproject
|
||||||
.idea/*
|
.idea/*
|
||||||
.vagrant
|
.vagrant
|
||||||
|
|
||||||
|
flash.uf2
|
||||||
|
|
|
@ -8,7 +8,11 @@ COUNTRIES="US EU433 EU865 CN JP"
|
||||||
#COUNTRIES=US
|
#COUNTRIES=US
|
||||||
#COUNTRIES=CN
|
#COUNTRIES=CN
|
||||||
|
|
||||||
BOARDS="tlora-v2 tlora-v1 tlora-v2-1-1.6 tbeam heltec tbeam0.7"
|
BOARDS_ESP32="tlora-v2 tlora-v1 tlora-v2-1-1.6 tbeam heltec tbeam0.7"
|
||||||
|
|
||||||
|
# FIXME note nrf52840dk build is for some reason only generating a BIN file but not a HEX file nrf52840dk-geeksville is fine
|
||||||
|
BOARDS_NRF52="lora-relay-v1"
|
||||||
|
BOARDS="$BOARDS_ESP32 $BOARDS_NRF52"
|
||||||
#BOARDS=tbeam
|
#BOARDS=tbeam
|
||||||
|
|
||||||
OUTDIR=release/latest
|
OUTDIR=release/latest
|
||||||
|
@ -23,20 +27,17 @@ rm -f $OUTDIR/bins/*
|
||||||
|
|
||||||
# build the named environment and copy the bins to the release directory
|
# build the named environment and copy the bins to the release directory
|
||||||
function do_build {
|
function do_build {
|
||||||
ENV_NAME=$1
|
echo "Building for $BOARD with $PLATFORMIO_BUILD_FLAGS"
|
||||||
echo "Building for $ENV_NAME with $PLATFORMIO_BUILD_FLAGS"
|
rm -f .pio/build/$BOARD/firmware.*
|
||||||
SRCBIN=.pio/build/$ENV_NAME/firmware.bin
|
|
||||||
SRCELF=.pio/build/$ENV_NAME/firmware.elf
|
|
||||||
rm -f $SRCBIN
|
|
||||||
|
|
||||||
# The shell vars the build tool expects to find
|
# The shell vars the build tool expects to find
|
||||||
export HW_VERSION="1.0-$COUNTRY"
|
export HW_VERSION="1.0-$COUNTRY"
|
||||||
export APP_VERSION=$VERSION
|
export APP_VERSION=$VERSION
|
||||||
export COUNTRY
|
export COUNTRY
|
||||||
|
|
||||||
pio run --jobs 4 --environment $ENV_NAME # -v
|
pio run --jobs 4 --environment $BOARD # -v
|
||||||
cp $SRCBIN $OUTDIR/bins/firmware-$ENV_NAME-$COUNTRY-$VERSION.bin
|
SRCELF=.pio/build/$BOARD/firmware.elf
|
||||||
cp $SRCELF $OUTDIR/elfs/firmware-$ENV_NAME-$COUNTRY-$VERSION.elf
|
cp $SRCELF $OUTDIR/elfs/firmware-$BOARD-$COUNTRY-$VERSION.elf
|
||||||
}
|
}
|
||||||
|
|
||||||
# Make sure our submodules are current
|
# Make sure our submodules are current
|
||||||
|
@ -49,6 +50,18 @@ for COUNTRY in $COUNTRIES; do
|
||||||
for BOARD in $BOARDS; do
|
for BOARD in $BOARDS; do
|
||||||
do_build $BOARD
|
do_build $BOARD
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "Copying ESP32 bin files"
|
||||||
|
for BOARD in $BOARDS_ESP32; do
|
||||||
|
SRCBIN=.pio/build/$BOARD/firmware.bin
|
||||||
|
cp $SRCBIN $OUTDIR/bins/firmware-$BOARD-$COUNTRY-$VERSION.bin
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Generating NRF52 uf2 files"
|
||||||
|
for BOARD in $BOARDS_NRF52; do
|
||||||
|
SRCHEX=.pio/build/$BOARD/firmware.hex
|
||||||
|
bin/uf2conv.py $SRCHEX -c -o $OUTDIR/bins/firmware-$BOARD-$COUNTRY-$VERSION.uf2 -f 0xADA52840
|
||||||
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
# keep the bins in archive also
|
# keep the bins in archive also
|
||||||
|
|
|
@ -0,0 +1,314 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import struct
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
UF2_MAGIC_START0 = 0x0A324655 # "UF2\n"
|
||||||
|
UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected
|
||||||
|
UF2_MAGIC_END = 0x0AB16F30 # Ditto
|
||||||
|
|
||||||
|
families = {
|
||||||
|
'SAMD21': 0x68ed2b88,
|
||||||
|
'SAML21': 0x1851780a,
|
||||||
|
'SAMD51': 0x55114460,
|
||||||
|
'NRF52': 0x1b57745f,
|
||||||
|
'STM32F0': 0x647824b6,
|
||||||
|
'STM32F1': 0x5ee21072,
|
||||||
|
'STM32F2': 0x5d1a0a2e,
|
||||||
|
'STM32F3': 0x6b846188,
|
||||||
|
'STM32F4': 0x57755a57,
|
||||||
|
'STM32F7': 0x53b80f00,
|
||||||
|
'STM32G0': 0x300f5633,
|
||||||
|
'STM32G4': 0x4c71240a,
|
||||||
|
'STM32H7': 0x6db66082,
|
||||||
|
'STM32L0': 0x202e3a91,
|
||||||
|
'STM32L1': 0x1e1f432d,
|
||||||
|
'STM32L4': 0x00ff6919,
|
||||||
|
'STM32L5': 0x04240bdf,
|
||||||
|
'STM32WB': 0x70d16653,
|
||||||
|
'STM32WL': 0x21460ff0,
|
||||||
|
'ATMEGA32': 0x16573617,
|
||||||
|
'MIMXRT10XX': 0x4FB2D5BD
|
||||||
|
}
|
||||||
|
|
||||||
|
INFO_FILE = "/INFO_UF2.TXT"
|
||||||
|
|
||||||
|
appstartaddr = 0x2000
|
||||||
|
familyid = 0x0
|
||||||
|
|
||||||
|
|
||||||
|
def is_uf2(buf):
|
||||||
|
w = struct.unpack("<II", buf[0:8])
|
||||||
|
return w[0] == UF2_MAGIC_START0 and w[1] == UF2_MAGIC_START1
|
||||||
|
|
||||||
|
def is_hex(buf):
|
||||||
|
try:
|
||||||
|
w = buf[0:30].decode("utf-8")
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
return False
|
||||||
|
if w[0] == ':' and re.match(b"^[:0-9a-fA-F\r\n]+$", buf):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def convert_from_uf2(buf):
|
||||||
|
global appstartaddr
|
||||||
|
numblocks = len(buf) // 512
|
||||||
|
curraddr = None
|
||||||
|
outp = b""
|
||||||
|
for blockno in range(numblocks):
|
||||||
|
ptr = blockno * 512
|
||||||
|
block = buf[ptr:ptr + 512]
|
||||||
|
hd = struct.unpack(b"<IIIIIIII", block[0:32])
|
||||||
|
if hd[0] != UF2_MAGIC_START0 or hd[1] != UF2_MAGIC_START1:
|
||||||
|
print("Skipping block at " + ptr + "; bad magic")
|
||||||
|
continue
|
||||||
|
if hd[2] & 1:
|
||||||
|
# NO-flash flag set; skip block
|
||||||
|
continue
|
||||||
|
datalen = hd[4]
|
||||||
|
if datalen > 476:
|
||||||
|
assert False, "Invalid UF2 data size at " + ptr
|
||||||
|
newaddr = hd[3]
|
||||||
|
if curraddr == None:
|
||||||
|
appstartaddr = newaddr
|
||||||
|
curraddr = newaddr
|
||||||
|
padding = newaddr - curraddr
|
||||||
|
if padding < 0:
|
||||||
|
assert False, "Block out of order at " + ptr
|
||||||
|
if padding > 10*1024*1024:
|
||||||
|
assert False, "More than 10M of padding needed at " + ptr
|
||||||
|
if padding % 4 != 0:
|
||||||
|
assert False, "Non-word padding size at " + ptr
|
||||||
|
while padding > 0:
|
||||||
|
padding -= 4
|
||||||
|
outp += b"\x00\x00\x00\x00"
|
||||||
|
outp += block[32 : 32 + datalen]
|
||||||
|
curraddr = newaddr + datalen
|
||||||
|
return outp
|
||||||
|
|
||||||
|
def convert_to_carray(file_content):
|
||||||
|
outp = "const unsigned char bindata[] __attribute__((aligned(16))) = {"
|
||||||
|
for i in range(len(file_content)):
|
||||||
|
if i % 16 == 0:
|
||||||
|
outp += "\n"
|
||||||
|
outp += "0x%02x, " % ord(file_content[i])
|
||||||
|
outp += "\n};\n"
|
||||||
|
return outp
|
||||||
|
|
||||||
|
def convert_to_uf2(file_content):
|
||||||
|
global familyid
|
||||||
|
datapadding = b""
|
||||||
|
while len(datapadding) < 512 - 256 - 32 - 4:
|
||||||
|
datapadding += b"\x00\x00\x00\x00"
|
||||||
|
numblocks = (len(file_content) + 255) // 256
|
||||||
|
outp = b""
|
||||||
|
for blockno in range(numblocks):
|
||||||
|
ptr = 256 * blockno
|
||||||
|
chunk = file_content[ptr:ptr + 256]
|
||||||
|
flags = 0x0
|
||||||
|
if familyid:
|
||||||
|
flags |= 0x2000
|
||||||
|
hd = struct.pack(b"<IIIIIIII",
|
||||||
|
UF2_MAGIC_START0, UF2_MAGIC_START1,
|
||||||
|
flags, ptr + appstartaddr, 256, blockno, numblocks, familyid)
|
||||||
|
while len(chunk) < 256:
|
||||||
|
chunk += b"\x00"
|
||||||
|
block = hd + chunk + datapadding + struct.pack(b"<I", UF2_MAGIC_END)
|
||||||
|
assert len(block) == 512
|
||||||
|
outp += block
|
||||||
|
return outp
|
||||||
|
|
||||||
|
class Block:
|
||||||
|
def __init__(self, addr):
|
||||||
|
self.addr = addr
|
||||||
|
self.bytes = bytearray(256)
|
||||||
|
|
||||||
|
def encode(self, blockno, numblocks):
|
||||||
|
global familyid
|
||||||
|
flags = 0x0
|
||||||
|
if familyid:
|
||||||
|
flags |= 0x2000
|
||||||
|
hd = struct.pack("<IIIIIIII",
|
||||||
|
UF2_MAGIC_START0, UF2_MAGIC_START1,
|
||||||
|
flags, self.addr, 256, blockno, numblocks, familyid)
|
||||||
|
hd += self.bytes[0:256]
|
||||||
|
while len(hd) < 512 - 4:
|
||||||
|
hd += b"\x00"
|
||||||
|
hd += struct.pack("<I", UF2_MAGIC_END)
|
||||||
|
return hd
|
||||||
|
|
||||||
|
def convert_from_hex_to_uf2(buf):
|
||||||
|
global appstartaddr
|
||||||
|
appstartaddr = None
|
||||||
|
upper = 0
|
||||||
|
currblock = None
|
||||||
|
blocks = []
|
||||||
|
for line in buf.split('\n'):
|
||||||
|
if line[0] != ":":
|
||||||
|
continue
|
||||||
|
i = 1
|
||||||
|
rec = []
|
||||||
|
while i < len(line) - 1:
|
||||||
|
rec.append(int(line[i:i+2], 16))
|
||||||
|
i += 2
|
||||||
|
tp = rec[3]
|
||||||
|
if tp == 4:
|
||||||
|
upper = ((rec[4] << 8) | rec[5]) << 16
|
||||||
|
elif tp == 2:
|
||||||
|
upper = ((rec[4] << 8) | rec[5]) << 4
|
||||||
|
assert (upper & 0xffff) == 0
|
||||||
|
elif tp == 1:
|
||||||
|
break
|
||||||
|
elif tp == 0:
|
||||||
|
addr = upper | (rec[1] << 8) | rec[2]
|
||||||
|
if appstartaddr == None:
|
||||||
|
appstartaddr = addr
|
||||||
|
i = 4
|
||||||
|
while i < len(rec) - 1:
|
||||||
|
if not currblock or currblock.addr & ~0xff != addr & ~0xff:
|
||||||
|
currblock = Block(addr & ~0xff)
|
||||||
|
blocks.append(currblock)
|
||||||
|
currblock.bytes[addr & 0xff] = rec[i]
|
||||||
|
addr += 1
|
||||||
|
i += 1
|
||||||
|
numblocks = len(blocks)
|
||||||
|
resfile = b""
|
||||||
|
for i in range(0, numblocks):
|
||||||
|
resfile += blocks[i].encode(i, numblocks)
|
||||||
|
return resfile
|
||||||
|
|
||||||
|
def to_str(b):
|
||||||
|
return b.decode("utf-8")
|
||||||
|
|
||||||
|
def get_drives():
|
||||||
|
drives = []
|
||||||
|
if sys.platform == "win32":
|
||||||
|
r = subprocess.check_output(["wmic", "PATH", "Win32_LogicalDisk",
|
||||||
|
"get", "DeviceID,", "VolumeName,",
|
||||||
|
"FileSystem,", "DriveType"])
|
||||||
|
for line in to_str(r).split('\n'):
|
||||||
|
words = re.split('\s+', line)
|
||||||
|
if len(words) >= 3 and words[1] == "2" and words[2] == "FAT":
|
||||||
|
drives.append(words[0])
|
||||||
|
else:
|
||||||
|
rootpath = "/media"
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
rootpath = "/Volumes"
|
||||||
|
elif sys.platform == "linux":
|
||||||
|
tmp = rootpath + "/" + os.environ["USER"]
|
||||||
|
if os.path.isdir(tmp):
|
||||||
|
rootpath = tmp
|
||||||
|
for d in os.listdir(rootpath):
|
||||||
|
drives.append(os.path.join(rootpath, d))
|
||||||
|
|
||||||
|
|
||||||
|
def has_info(d):
|
||||||
|
try:
|
||||||
|
return os.path.isfile(d + INFO_FILE)
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return list(filter(has_info, drives))
|
||||||
|
|
||||||
|
|
||||||
|
def board_id(path):
|
||||||
|
with open(path + INFO_FILE, mode='r') as file:
|
||||||
|
file_content = file.read()
|
||||||
|
return re.search("Board-ID: ([^\r\n]*)", file_content).group(1)
|
||||||
|
|
||||||
|
|
||||||
|
def list_drives():
|
||||||
|
for d in get_drives():
|
||||||
|
print(d, board_id(d))
|
||||||
|
|
||||||
|
|
||||||
|
def write_file(name, buf):
|
||||||
|
with open(name, "wb") as f:
|
||||||
|
f.write(buf)
|
||||||
|
print("Wrote %d bytes to %s" % (len(buf), name))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global appstartaddr, familyid
|
||||||
|
def error(msg):
|
||||||
|
print(msg)
|
||||||
|
sys.exit(1)
|
||||||
|
parser = argparse.ArgumentParser(description='Convert to UF2 or flash directly.')
|
||||||
|
parser.add_argument('input', metavar='INPUT', type=str, nargs='?',
|
||||||
|
help='input file (HEX, BIN or UF2)')
|
||||||
|
parser.add_argument('-b' , '--base', dest='base', type=str,
|
||||||
|
default="0x2000",
|
||||||
|
help='set base address of application for BIN format (default: 0x2000)')
|
||||||
|
parser.add_argument('-o' , '--output', metavar="FILE", dest='output', type=str,
|
||||||
|
help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible')
|
||||||
|
parser.add_argument('-d' , '--device', dest="device_path",
|
||||||
|
help='select a device path to flash')
|
||||||
|
parser.add_argument('-l' , '--list', action='store_true',
|
||||||
|
help='list connected devices')
|
||||||
|
parser.add_argument('-c' , '--convert', action='store_true',
|
||||||
|
help='do not flash, just convert')
|
||||||
|
parser.add_argument('-D' , '--deploy', action='store_true',
|
||||||
|
help='just flash, do not convert')
|
||||||
|
parser.add_argument('-f' , '--family', dest='family', type=str,
|
||||||
|
default="0x0",
|
||||||
|
help='specify familyID - number or name (default: 0x0)')
|
||||||
|
parser.add_argument('-C' , '--carray', action='store_true',
|
||||||
|
help='convert binary file to a C array, not UF2')
|
||||||
|
args = parser.parse_args()
|
||||||
|
appstartaddr = int(args.base, 0)
|
||||||
|
|
||||||
|
if args.family.upper() in families:
|
||||||
|
familyid = families[args.family.upper()]
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
familyid = int(args.family, 0)
|
||||||
|
except ValueError:
|
||||||
|
error("Family ID needs to be a number or one of: " + ", ".join(families.keys()))
|
||||||
|
|
||||||
|
if args.list:
|
||||||
|
list_drives()
|
||||||
|
else:
|
||||||
|
if not args.input:
|
||||||
|
error("Need input file")
|
||||||
|
with open(args.input, mode='rb') as f:
|
||||||
|
inpbuf = f.read()
|
||||||
|
from_uf2 = is_uf2(inpbuf)
|
||||||
|
ext = "uf2"
|
||||||
|
if args.deploy:
|
||||||
|
outbuf = inpbuf
|
||||||
|
elif from_uf2:
|
||||||
|
outbuf = convert_from_uf2(inpbuf)
|
||||||
|
ext = "bin"
|
||||||
|
elif is_hex(inpbuf):
|
||||||
|
outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8"))
|
||||||
|
elif args.carray:
|
||||||
|
outbuf = convert_to_carray(inpbuf)
|
||||||
|
ext = "h"
|
||||||
|
else:
|
||||||
|
outbuf = convert_to_uf2(inpbuf)
|
||||||
|
print("Converting to %s, output size: %d, start address: 0x%x" %
|
||||||
|
(ext, len(outbuf), appstartaddr))
|
||||||
|
if args.convert or ext != "uf2":
|
||||||
|
drives = []
|
||||||
|
if args.output == None:
|
||||||
|
args.output = "flash." + ext
|
||||||
|
else:
|
||||||
|
drives = get_drives()
|
||||||
|
|
||||||
|
if args.output:
|
||||||
|
write_file(args.output, outbuf)
|
||||||
|
else:
|
||||||
|
if len(drives) == 0:
|
||||||
|
error("No drive to deploy.")
|
||||||
|
for d in drives:
|
||||||
|
print("Flashing %s (%s)" % (d, board_id(d)))
|
||||||
|
write_file(d + "/NEW.UF2", outbuf)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
echo "Converting to uf2 for NRF52 Adafruit bootloader"
|
||||||
|
bin/uf2conv.py .pio/build/lora-relay-v1/firmware.hex -f 0xADA52840
|
||||||
|
# cp flash.uf2 /media/kevinh/FTH*BOOT/
|
|
@ -0,0 +1,46 @@
|
||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino": {
|
||||||
|
"ldscript": "nrf52840_s140_v6.ld"
|
||||||
|
},
|
||||||
|
"core": "nRF5",
|
||||||
|
"cpu": "cortex-m4",
|
||||||
|
"extra_flags": "-DARDUINO_NRF52840_LORA_RELAY_V1 -DNRF52840_XXAA",
|
||||||
|
"f_cpu": "64000000L",
|
||||||
|
"hwids": [["0x239A", "0x4404"]],
|
||||||
|
"usb_product": "LORA_RELAY",
|
||||||
|
"mcu": "nrf52840",
|
||||||
|
"variant": "lora_relay_v1",
|
||||||
|
"variants_dir": "variants",
|
||||||
|
"bsp": {
|
||||||
|
"name": "adafruit"
|
||||||
|
},
|
||||||
|
"softdevice": {
|
||||||
|
"sd_flags": "-DS140",
|
||||||
|
"sd_name": "s140",
|
||||||
|
"sd_version": "6.1.1",
|
||||||
|
"sd_fwid": "0x00B6"
|
||||||
|
},
|
||||||
|
"bootloader": {
|
||||||
|
"settings_addr": "0xFF000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"connectivity": ["bluetooth"],
|
||||||
|
"debug": {
|
||||||
|
"jlink_device": "nRF52840_xxAA",
|
||||||
|
"onboard_tools": ["jlink"],
|
||||||
|
"svd_path": "nrf52840.svd"
|
||||||
|
},
|
||||||
|
"frameworks": ["arduino"],
|
||||||
|
"name": "Meshtastic Lora Relay V1 (Adafruit BSP)",
|
||||||
|
"upload": {
|
||||||
|
"maximum_ram_size": 248832,
|
||||||
|
"maximum_size": 815104,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 115200,
|
||||||
|
"protocol": "jlink",
|
||||||
|
"protocols": ["jlink", "nrfjprog", "stlink"]
|
||||||
|
},
|
||||||
|
"url": "https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay",
|
||||||
|
"vendor": "BigCorvus"
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Notes on @BigCorvus boards
|
||||||
|
|
||||||
|
## Board version 1.1
|
||||||
|
|
||||||
|
variant name lora_relay_v1
|
||||||
|
|
||||||
|
### Remaining TODOs
|
||||||
|
|
||||||
|
- power hold for the ST7735
|
||||||
|
- look at example sketch
|
||||||
|
- turn on xmit boost
|
||||||
|
|
||||||
|
## Recommendations for future boards
|
||||||
|
|
||||||
|
@BigCorvus your board is **really** nice. Here's some ideas for the future:
|
||||||
|
|
||||||
|
- make the SWDIO header more standard (the small ARM 2x5 micro footprint?) or at least througholes so it is easy to solder a header
|
||||||
|
|
||||||
|
## How to program bootloader
|
||||||
|
|
||||||
|
Download from here: https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases
|
||||||
|
|
||||||
|
```
|
||||||
|
nrfjprog -f nrf52 --eraseall
|
||||||
|
Erasing user available code and UICR flash areas.
|
||||||
|
Applying system reset.
|
||||||
|
|
||||||
|
nrfjprog -f nrf52 --program feather_nrf52840_express_bootloader-0.3.2_s140_6.1.1.hex
|
||||||
|
Parsing hex file.
|
||||||
|
Reading flash area to program to guarantee it is erased.
|
||||||
|
Checking that the area to write is not protected.
|
||||||
|
Programming device.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reboot the board, if all went well it now shows up as a mountable filesystem on your USB bus.
|
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 12 KiB |
|
@ -9,7 +9,7 @@
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[platformio]
|
[platformio]
|
||||||
default_envs = tbeam
|
default_envs = tbeam # lora-relay-v1
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
; common is not currently used
|
; common is not currently used
|
||||||
|
@ -186,6 +186,9 @@ board = nrf52840_dk
|
||||||
[env:nrf52840dk-geeksville]
|
[env:nrf52840dk-geeksville]
|
||||||
extends = nrf52_base
|
extends = nrf52_base
|
||||||
board = nrf52840_dk_modified
|
board = nrf52840_dk_modified
|
||||||
|
# add our variants files to the include and src paths
|
||||||
|
build_flags = ${nrf52_base.build_flags} -Ivariants/pca10056-rc-clock
|
||||||
|
src_filter = ${nrf52_base.src_filter} +<../variants/pca10056-rc-clock>
|
||||||
|
|
||||||
; Note: By default no lora device is created for this build - it uses a simulated interface
|
; Note: By default no lora device is created for this build - it uses a simulated interface
|
||||||
[env:feather_nrf52832]
|
[env:feather_nrf52832]
|
||||||
|
@ -212,6 +215,19 @@ lib_deps =
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
UC1701
|
UC1701
|
||||||
|
|
||||||
|
; The https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay board by @BigCorvus
|
||||||
|
[env:lora-relay-v1]
|
||||||
|
extends = nrf52_base
|
||||||
|
board = lora-relay-v1
|
||||||
|
# add our variants files to the include and src paths
|
||||||
|
build_flags = ${nrf52_base.build_flags} -Ivariants/lora_relay_v1
|
||||||
|
src_filter = ${nrf52_base.src_filter} +<../variants/lora_relay_v1>
|
||||||
|
lib_deps =
|
||||||
|
${env.lib_deps}
|
||||||
|
SparkFun BQ27441 LiPo Fuel Gauge Arduino Library
|
||||||
|
TFT_eSPI
|
||||||
|
# Adafruit ST7735 and ST7789 Library
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,339 @@
|
||||||
|
// This file is used to set TFT/eInk preferences for the TFT.cpp driver
|
||||||
|
|
||||||
|
#include <variant.h>
|
||||||
|
|
||||||
|
// USER DEFINED SETTINGS
|
||||||
|
// Set driver type, fonts to be loaded, pins used and SPI control method etc
|
||||||
|
//
|
||||||
|
// See the User_Setup_Select.h file if you wish to be able to define multiple
|
||||||
|
// setups and then easily select which setup file is used by the compiler.
|
||||||
|
//
|
||||||
|
// If this file is edited correctly then all the library example sketches should
|
||||||
|
// run without the need to make any more changes for a particular hardware setup!
|
||||||
|
// Note that some sketches are designed for a particular TFT pixel width/height
|
||||||
|
|
||||||
|
|
||||||
|
// ##################################################################################
|
||||||
|
//
|
||||||
|
// Section 1. Call up the right driver file and any options for it
|
||||||
|
//
|
||||||
|
// ##################################################################################
|
||||||
|
|
||||||
|
// Define STM32 to invoke optimised processor support (only for STM32)
|
||||||
|
//#define STM32
|
||||||
|
|
||||||
|
// Defining the STM32 board allows the library to optimise the performance
|
||||||
|
// for UNO compatible "MCUfriend" style shields
|
||||||
|
//#define NUCLEO_64_TFT
|
||||||
|
//#define NUCLEO_144_TFT
|
||||||
|
|
||||||
|
// STM32 8 bit parallel only:
|
||||||
|
// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7
|
||||||
|
// then this will improve rendering performance by a factor of ~8x
|
||||||
|
//#define STM_PORTA_DATA_BUS
|
||||||
|
//#define STM_PORTA_DATA_BUS
|
||||||
|
|
||||||
|
// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
|
||||||
|
//#define TFT_PARALLEL_8_BIT
|
||||||
|
|
||||||
|
// Display type - only define if RPi display
|
||||||
|
//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI
|
||||||
|
|
||||||
|
// Only define one driver, the other ones must be commented out
|
||||||
|
//#define ILI9341_DRIVER
|
||||||
|
#define ST7735_DRIVER // Define additional parameters below for this display
|
||||||
|
//#define ILI9163_DRIVER // Define additional parameters below for this display
|
||||||
|
//#define S6D02A1_DRIVER
|
||||||
|
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
|
||||||
|
//#define HX8357D_DRIVER
|
||||||
|
//#define ILI9481_DRIVER
|
||||||
|
//#define ILI9486_DRIVER
|
||||||
|
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
|
||||||
|
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
|
||||||
|
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
|
||||||
|
//#define R61581_DRIVER
|
||||||
|
//#define RM68140_DRIVER
|
||||||
|
//#define ST7796_DRIVER
|
||||||
|
//#define SSD1963_480_DRIVER // Untested
|
||||||
|
//#define SSD1963_800_DRIVER // Untested
|
||||||
|
//#define SSD1963_800ALT_DRIVER // Untested
|
||||||
|
|
||||||
|
// Some displays support SPI reads via the MISO pin, other displays have a single
|
||||||
|
// bi-directional SDA pin and the library will try to read this via the MOSI line.
|
||||||
|
// To use the SDA line for reading data from the TFT uncomment the following line:
|
||||||
|
|
||||||
|
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
|
||||||
|
|
||||||
|
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
|
||||||
|
// Try ONE option at a time to find the correct colour order for your display
|
||||||
|
|
||||||
|
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
|
||||||
|
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
|
||||||
|
|
||||||
|
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
|
||||||
|
|
||||||
|
// #define M5STACK
|
||||||
|
|
||||||
|
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
|
||||||
|
#define TFT_WIDTH 80
|
||||||
|
// #define TFT_WIDTH 128
|
||||||
|
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
|
||||||
|
#define TFT_HEIGHT 160
|
||||||
|
// #define TFT_HEIGHT 128
|
||||||
|
// #define TFT_HEIGHT 240 // ST7789 240 x 240
|
||||||
|
// #define TFT_HEIGHT 320 // ST7789 240 x 320
|
||||||
|
|
||||||
|
// For ST7735 ONLY, define the type of display, originally this was based on the
|
||||||
|
// colour of the tab on the screen protector film but this is not always true, so try
|
||||||
|
// out the different options below if the screen does not display graphics correctly,
|
||||||
|
// e.g. colours wrong, mirror images, or tray pixels at the edges.
|
||||||
|
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
|
||||||
|
// this User_Setup file, then rebuild and upload the sketch to the board again:
|
||||||
|
|
||||||
|
// #define ST7735_INITB
|
||||||
|
#define ST7735_GREENTAB
|
||||||
|
// #define ST7735_GREENTAB2
|
||||||
|
// #define ST7735_GREENTAB3
|
||||||
|
// #define ST7735_GREENTAB128 // For 128 x 128 display
|
||||||
|
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
|
||||||
|
// #define ST7735_REDTAB
|
||||||
|
// #define ST7735_BLACKTAB
|
||||||
|
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
|
||||||
|
|
||||||
|
// If colours are inverted (white shows as black) then uncomment one of the next
|
||||||
|
// 2 lines try both options, one of the options should correct the inversion.
|
||||||
|
|
||||||
|
// #define TFT_INVERSION_ON
|
||||||
|
// #define TFT_INVERSION_OFF
|
||||||
|
|
||||||
|
|
||||||
|
// ##################################################################################
|
||||||
|
//
|
||||||
|
// Section 2. Define the pins that are used to interface with the display here
|
||||||
|
//
|
||||||
|
// ##################################################################################
|
||||||
|
|
||||||
|
// If a backlight control signal is available then define the TFT_BL pin in Section 2
|
||||||
|
// below. The backlight will be turned ON when tft.begin() is called, but the library
|
||||||
|
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
|
||||||
|
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
|
||||||
|
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
|
||||||
|
|
||||||
|
#define TFT_BL ST7735_BACKLIGHT_EN // LED back-light control pin
|
||||||
|
#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
|
||||||
|
// Typical setup for ESP8266 NodeMCU ESP-12 is :
|
||||||
|
//
|
||||||
|
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
|
||||||
|
// Display LED to NodeMCU pin VIN (or 5V, see below)
|
||||||
|
// Display SCK to NodeMCU pin D5
|
||||||
|
// Display SDI/MOSI to NodeMCU pin D7
|
||||||
|
// Display DC (RS/AO)to NodeMCU pin D3
|
||||||
|
// Display RESET to NodeMCU pin D4 (or RST, see below)
|
||||||
|
// Display CS to NodeMCU pin D8 (or GND, see below)
|
||||||
|
// Display GND to NodeMCU pin GND (0V)
|
||||||
|
// Display VCC to NodeMCU 5V or 3.3V
|
||||||
|
//
|
||||||
|
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
|
||||||
|
//
|
||||||
|
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
|
||||||
|
//
|
||||||
|
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
|
||||||
|
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
|
||||||
|
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
|
||||||
|
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
|
||||||
|
//
|
||||||
|
// The NodeMCU D0 pin can be used for RST
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
|
||||||
|
// If 5V is not available at a pin you can use 3.3V but backlight brightness
|
||||||
|
// will be lower.
|
||||||
|
|
||||||
|
|
||||||
|
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
|
||||||
|
|
||||||
|
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
|
||||||
|
#define TFT_CS ST7735_CS // Chip select control pin D8
|
||||||
|
#define TFT_DC ST7735_RS // Data Command control pin
|
||||||
|
#define TFT_RST ST7735_RESET // Reset pin (could connect to NodeMCU RST, see next line)
|
||||||
|
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
|
||||||
|
|
||||||
|
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
|
||||||
|
|
||||||
|
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
|
||||||
|
|
||||||
|
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
|
||||||
|
|
||||||
|
|
||||||
|
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
|
||||||
|
|
||||||
|
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
|
||||||
|
// but saves pins for other functions. It is best not to connect MISO as some displays
|
||||||
|
// do not tristate that line wjen chip select is high!
|
||||||
|
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
|
||||||
|
// On NodeMCU V3 S0 =MISO, S1 =MOSI, S2 =SCLK
|
||||||
|
// In ESP8266 overlap mode the following must be defined
|
||||||
|
|
||||||
|
//#define TFT_SPI_OVERLAP
|
||||||
|
|
||||||
|
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
|
||||||
|
//#define TFT_CS PIN_D3
|
||||||
|
//#define TFT_DC PIN_D5 // Data Command control pin
|
||||||
|
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
|
||||||
|
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
|
||||||
|
|
||||||
|
|
||||||
|
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
|
||||||
|
|
||||||
|
// For ESP32 Dev board (only tested with ILI9341 display)
|
||||||
|
// The hardware SPI can be mapped to any pins
|
||||||
|
|
||||||
|
//#define TFT_MISO 19
|
||||||
|
//#define TFT_MOSI 23
|
||||||
|
//#define TFT_SCLK 18
|
||||||
|
//#define TFT_CS 15 // Chip select control pin
|
||||||
|
//#define TFT_DC 2 // Data Command control pin
|
||||||
|
//#define TFT_RST 4 // Reset pin (could connect to RST pin)
|
||||||
|
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
|
||||||
|
|
||||||
|
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
|
||||||
|
|
||||||
|
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
|
||||||
|
|
||||||
|
// For the M5Stack module use these #define lines
|
||||||
|
//#define TFT_MISO 19
|
||||||
|
//#define TFT_MOSI 23
|
||||||
|
//#define TFT_SCLK 18
|
||||||
|
//#define TFT_CS 14 // Chip select control pin
|
||||||
|
//#define TFT_DC 27 // Data Command control pin
|
||||||
|
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
|
||||||
|
//#define TFT_BL 32 // LED back-light (required for M5Stack)
|
||||||
|
|
||||||
|
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
|
||||||
|
|
||||||
|
// The library supports 8 bit parallel TFTs with the ESP32, the pin
|
||||||
|
// selection below is compatible with ESP32 boards in UNO format.
|
||||||
|
// Wemos D32 boards need to be modified, see diagram in Tools folder.
|
||||||
|
// Only ILI9481 and ILI9341 based displays have been tested!
|
||||||
|
|
||||||
|
// Parallel bus is only supported for the STM32 and ESP32
|
||||||
|
// Example below is for ESP32 Parallel interface with UNO displays
|
||||||
|
|
||||||
|
// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
|
||||||
|
//#define TFT_PARALLEL_8_BIT
|
||||||
|
|
||||||
|
// The ESP32 and TFT the pins used for testing are:
|
||||||
|
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
|
||||||
|
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
|
||||||
|
//#define TFT_RST 32 // Reset pin, toggles on startup
|
||||||
|
|
||||||
|
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
|
||||||
|
//#define TFT_RD 2 // Read strobe control pin
|
||||||
|
|
||||||
|
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
|
||||||
|
//#define TFT_D1 13 // so a single register write sets/clears all bits.
|
||||||
|
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
|
||||||
|
//#define TFT_D3 25 // TFT screen update performance.
|
||||||
|
//#define TFT_D4 17
|
||||||
|
//#define TFT_D5 16
|
||||||
|
//#define TFT_D6 27
|
||||||
|
//#define TFT_D7 14
|
||||||
|
|
||||||
|
// ###### EDIT THE PINs BELOW TO SUIT YOUR STM32 SPI TFT SETUP ######
|
||||||
|
|
||||||
|
// The TFT can be connected to SPI port 1 or 2
|
||||||
|
//#define TFT_SPI_PORT 1 // SPI port 1 maximum clock rate is 55MHz
|
||||||
|
//#define TFT_MOSI PA7
|
||||||
|
//#define TFT_MISO PA6
|
||||||
|
//#define TFT_SCLK PA5
|
||||||
|
|
||||||
|
//#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz
|
||||||
|
//#define TFT_MOSI PB15
|
||||||
|
//#define TFT_MISO PB14
|
||||||
|
//#define TFT_SCLK PB13
|
||||||
|
|
||||||
|
// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select
|
||||||
|
//#define TFT_CS D5 // Chip select control pin to TFT CS
|
||||||
|
//#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select)
|
||||||
|
//#define TFT_RST D7 // Reset pin to TFT RST (or RESET)
|
||||||
|
// OR alternatively, we can use STM32 port reference names PXnn
|
||||||
|
//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5
|
||||||
|
//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6
|
||||||
|
//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7
|
||||||
|
|
||||||
|
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset
|
||||||
|
// Use an Arduino pin for initial testing as connecting to processor reset
|
||||||
|
// may not work (pulse too short at power up?)
|
||||||
|
|
||||||
|
// ##################################################################################
|
||||||
|
//
|
||||||
|
// Section 3. Define the fonts that are to be used here
|
||||||
|
//
|
||||||
|
// ##################################################################################
|
||||||
|
|
||||||
|
// Comment out the #defines below with // to stop that font being loaded
|
||||||
|
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
|
||||||
|
// normally necessary. If all fonts are loaded the extra FLASH space required is
|
||||||
|
// about 17Kbytes. To save FLASH space only enable the fonts you need!
|
||||||
|
|
||||||
|
//#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
|
||||||
|
//#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
|
||||||
|
//#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
|
||||||
|
//#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
|
||||||
|
//#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
|
||||||
|
//#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
|
||||||
|
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
|
||||||
|
//#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
|
||||||
|
|
||||||
|
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
|
||||||
|
// this will save ~20kbytes of FLASH
|
||||||
|
//#define SMOOTH_FONT
|
||||||
|
|
||||||
|
|
||||||
|
// ##################################################################################
|
||||||
|
//
|
||||||
|
// Section 4. Other options
|
||||||
|
//
|
||||||
|
// ##################################################################################
|
||||||
|
|
||||||
|
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
|
||||||
|
// fast and the TFT driver will not keep up and display corruption appears.
|
||||||
|
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
|
||||||
|
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
|
||||||
|
// With an ILI9163 display 27 MHz works OK.
|
||||||
|
|
||||||
|
// #define SPI_FREQUENCY 1000000
|
||||||
|
// #define SPI_FREQUENCY 5000000
|
||||||
|
// #define SPI_FREQUENCY 10000000
|
||||||
|
// #define SPI_FREQUENCY 20000000
|
||||||
|
#define SPI_FREQUENCY 27000000
|
||||||
|
// #define SPI_FREQUENCY 40000000
|
||||||
|
// #define SPI_FREQUENCY 55000000 // STM32 SPI1 only (SPI2 maximum is 27MHz)
|
||||||
|
// #define SPI_FREQUENCY 80000000
|
||||||
|
|
||||||
|
// Optional reduced SPI frequency for reading TFT
|
||||||
|
#define SPI_READ_FREQUENCY 20000000
|
||||||
|
|
||||||
|
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
|
||||||
|
#define SPI_TOUCH_FREQUENCY 2500000
|
||||||
|
|
||||||
|
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
|
||||||
|
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
|
||||||
|
// then uncomment the following line:
|
||||||
|
//#define USE_HSPI_PORT
|
||||||
|
|
||||||
|
// Comment out the following #define if "SPI Transactions" do not need to be
|
||||||
|
// supported. When commented out the code size will be smaller and sketches will
|
||||||
|
// run slightly faster, so leave it commented out unless you need it!
|
||||||
|
|
||||||
|
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
|
||||||
|
// Transaction support is required if other SPI devices are connected.
|
||||||
|
|
||||||
|
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
|
||||||
|
// so changing it here has no effect
|
||||||
|
|
||||||
|
// #define SUPPORT_TRANSACTIONS
|
|
@ -339,8 +339,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
// Debug printing to segger console
|
// Debug printing to segger console
|
||||||
#define SEGGER_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
|
#define SEGGER_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
|
||||||
|
|
||||||
// nrf52 gets its settings via variant files
|
// If we are not on a NRF52840 (which has built in USB-ACM serial support) and we don't have serial pins hooked up, then we MUST
|
||||||
#ifndef PIN_SERIAL_RX
|
// use SEGGER for debug output
|
||||||
|
#if !defined(PIN_SERIAL_RX) && !defined(NRF52840_XXAA)
|
||||||
// No serial ports on this board - ONLY use segger in memory console
|
// No serial ports on this board - ONLY use segger in memory console
|
||||||
#define USE_SEGGER
|
#define USE_SEGGER
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#include "configuration.h"
|
||||||
|
|
||||||
|
#ifdef ST7735_CS
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
|
||||||
|
|
||||||
|
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
|
||||||
|
|
||||||
|
void TFTinit()
|
||||||
|
{
|
||||||
|
tft.init();
|
||||||
|
tft.setRotation(1);
|
||||||
|
tft.fillScreen(TFT_BLUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
void TFTinit();
|
|
@ -12,6 +12,11 @@ SX1262Interface::SX1262Interface(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RA
|
||||||
/// \return true if initialisation succeeded.
|
/// \return true if initialisation succeeded.
|
||||||
bool SX1262Interface::init()
|
bool SX1262Interface::init()
|
||||||
{
|
{
|
||||||
|
#ifdef SX1262_POWER_EN
|
||||||
|
digitalWrite(SX1262_POWER_EN, HIGH);
|
||||||
|
pinMode(SX1262_POWER_EN, OUTPUT);
|
||||||
|
#endif
|
||||||
|
|
||||||
RadioLibInterface::init();
|
RadioLibInterface::init();
|
||||||
|
|
||||||
#ifdef SX1262_RXEN // set not rx or tx mode
|
#ifdef SX1262_RXEN // set not rx or tx mode
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "NRF52Bluetooth.h"
|
#include "NRF52Bluetooth.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include "graphics/TFT.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ble_gap.h>
|
#include <ble_gap.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
@ -98,4 +99,9 @@ void nrf52Setup()
|
||||||
// randomSeed(r);
|
// randomSeed(r);
|
||||||
DEBUG_MSG("FIXME, call randomSeed\n");
|
DEBUG_MSG("FIXME, call randomSeed\n");
|
||||||
// ::printf("TESTING PRINTF\n");
|
// ::printf("TESTING PRINTF\n");
|
||||||
|
|
||||||
|
// Setup TFT display - FIXME do somewhere else
|
||||||
|
#ifdef ST7735_CS
|
||||||
|
TFTinit();
|
||||||
|
#endif
|
||||||
}
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "variant.h"
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "wiring_constants.h"
|
||||||
|
#include "wiring_digital.h"
|
||||||
|
|
||||||
|
const uint32_t g_ADigitalPinMap[] = {
|
||||||
|
// D0 .. D13
|
||||||
|
25, // D0 is P0.25 (UART TX)
|
||||||
|
24, // D1 is P0.24 (UART RX
|
||||||
|
10, // D2 is P0.10 (NFC2)
|
||||||
|
47, // D3 is P1.15 (LED1)
|
||||||
|
42, // D4 is P1.10 (LED2)
|
||||||
|
40, // D5 is P1.08
|
||||||
|
7, // D6 is P0.07
|
||||||
|
34, // D7 is P1.02 (Button)
|
||||||
|
16, // D8 is P0.16 (NeoPixel)
|
||||||
|
26, // D9 is P0.26 D_RS (IPS data/command control)
|
||||||
|
27, // D10 is P0.27
|
||||||
|
6, // D11 is P0.06 D_RES (IPS display reset)
|
||||||
|
8, // D12 is P0.08 D_CS (IPS display chip select)
|
||||||
|
41, // D13 is P1.09 BLT (IPS display backlight)
|
||||||
|
4, // D14 is P0.04 SX1262 RXEN
|
||||||
|
5, // D15 is P0.05 BOOST_EN (5V buck converter enable for the the radio power)
|
||||||
|
|
||||||
|
// D14 .. D21 (aka A0 .. A7)
|
||||||
|
30, // D16 is P0.30 (A0)
|
||||||
|
28, // D17 is P0.28 (A1)
|
||||||
|
2, // D18 is P0.02 (A2)
|
||||||
|
3, // D19 is P0.03 (A3)
|
||||||
|
29, // D20 is P0.29 (A4, Battery)
|
||||||
|
31, // D21 is P0.31 (A5, ARef)
|
||||||
|
|
||||||
|
// D22 .. D23 (aka I2C pins)
|
||||||
|
12, // D22 is P0.12 (SDA)
|
||||||
|
11, // D23 is P0.11 (SCL)
|
||||||
|
|
||||||
|
// D24 .. D26 (aka SPI pins)
|
||||||
|
15, // D24 is P0.15 (SPI MISO)
|
||||||
|
13, // D25 is P0.13 (SPI MOSI)
|
||||||
|
14, // D26 is P0.14 (SPI SCK )
|
||||||
|
|
||||||
|
// QSPI pins (not exposed via any header / test point)
|
||||||
|
// 19, // P0.19 (QSPI CLK)
|
||||||
|
// 20, // P0.20 (QSPI CS)
|
||||||
|
// 17, // P0.17 (QSPI Data 0)
|
||||||
|
// 22, // P0.22 (QSPI Data 1)
|
||||||
|
// 23, // P0.23 (QSPI Data 2)
|
||||||
|
// 21, // P0.21 (QSPI Data 3)
|
||||||
|
|
||||||
|
// The remaining NFC pin
|
||||||
|
9, // D27 P0.09 (NFC1, exposed only via test point on bottom of board)
|
||||||
|
|
||||||
|
// The following pins were never listed as they were considered unusable
|
||||||
|
// 0, // P0.00 is XL1 (attached to 32.768kHz crystal) Never expose as GPIOs
|
||||||
|
// 1, // P0.01 is XL2 (attached to 32.768kHz crystal)
|
||||||
|
18, // D28 P0.18 is RESET (attached to switch)
|
||||||
|
// 32, // P1.00 is SWO (attached to debug header)
|
||||||
|
|
||||||
|
// D29-D43
|
||||||
|
27, // D29 P0.27 E22-SX1262 DIO1
|
||||||
|
28, // D30 P0.28 E22-SX1262 DIO2
|
||||||
|
30, // D31 P0.30 E22-SX1262 TXEN
|
||||||
|
35, // D32 P1.03 E22-SX1262 NSS
|
||||||
|
32 + 8, // D33 P1.08 E22-SX1262 BUSY
|
||||||
|
32 + 12, // D34 P1.12 E22-SX1262 RESET
|
||||||
|
32 + 1, // P1.01 BTN_UP
|
||||||
|
32 + 2, // P1.02 SWITCH
|
||||||
|
32 + 14, // D37 P1.14 is not connected per schematic
|
||||||
|
36, // P1.04 is not connected per schematic
|
||||||
|
37, // P1.05 is not connected per schematic
|
||||||
|
38, // P1.06 is not connected per schematic
|
||||||
|
39, // P1.07 is not connected per schematic
|
||||||
|
43, // P1.11 is not connected per schematic
|
||||||
|
45, // P1.13 is not connected per schematic
|
||||||
|
};
|
||||||
|
|
||||||
|
void initVariant()
|
||||||
|
{
|
||||||
|
// LED1 & LED2
|
||||||
|
pinMode(PIN_LED1, OUTPUT);
|
||||||
|
ledOff(PIN_LED1);
|
||||||
|
|
||||||
|
pinMode(PIN_LED2, OUTPUT);
|
||||||
|
ledOff(PIN_LED2);
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2014-2015 Arduino LLC. All right reserved.
|
||||||
|
Copyright (c) 2016 Sandeep Mistry All right reserved.
|
||||||
|
Copyright (c) 2018, Adafruit Industries (adafruit.com)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU Lesser General Public License for more details.
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _VARIANT_LORA_RELAY_V1_
|
||||||
|
#define _VARIANT_LORA_RELAY_V1_
|
||||||
|
|
||||||
|
/** Master clock frequency */
|
||||||
|
#define VARIANT_MCK (64000000ul)
|
||||||
|
|
||||||
|
#define USE_LFXO // Board uses 32khz crystal for LF
|
||||||
|
// define USE_LFRC // Board uses RC for LF
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Headers
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "WVariant.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
// Number of pins defined in PinDescription array
|
||||||
|
#define PINS_COUNT (43)
|
||||||
|
#define NUM_DIGITAL_PINS (43)
|
||||||
|
#define NUM_ANALOG_INPUTS (6) // A6 is used for battery, A7 is analog reference
|
||||||
|
#define NUM_ANALOG_OUTPUTS (0)
|
||||||
|
|
||||||
|
// LEDs
|
||||||
|
#define PIN_LED1 (3)
|
||||||
|
#define PIN_LED2 (4)
|
||||||
|
#define PIN_NEOPIXEL (8)
|
||||||
|
|
||||||
|
#define LED_BUILTIN PIN_LED1
|
||||||
|
#define LED_CONN PIN_LED2
|
||||||
|
|
||||||
|
#define LED_RED PIN_LED1
|
||||||
|
#define LED_BLUE PIN_LED2
|
||||||
|
|
||||||
|
#define LED_STATE_ON 1 // State when LED is litted
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Buttons
|
||||||
|
*/
|
||||||
|
#define PIN_BUTTON1 (7)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Analog pins
|
||||||
|
*/
|
||||||
|
#define PIN_A0 (16)
|
||||||
|
#define PIN_A1 (17)
|
||||||
|
#define PIN_A2 (18)
|
||||||
|
#define PIN_A3 (19)
|
||||||
|
#define PIN_A4 (20)
|
||||||
|
#define PIN_A5 (21)
|
||||||
|
|
||||||
|
static const uint8_t A0 = PIN_A0;
|
||||||
|
static const uint8_t A1 = PIN_A1;
|
||||||
|
static const uint8_t A2 = PIN_A2;
|
||||||
|
static const uint8_t A3 = PIN_A3;
|
||||||
|
static const uint8_t A4 = PIN_A4;
|
||||||
|
static const uint8_t A5 = PIN_A5;
|
||||||
|
#define ADC_RESOLUTION 14
|
||||||
|
|
||||||
|
// Other pins
|
||||||
|
#define PIN_AREF PIN_A5
|
||||||
|
#define PIN_VBAT PIN_A4
|
||||||
|
#define PIN_NFC1 (33)
|
||||||
|
#define PIN_NFC2 (2)
|
||||||
|
#define PIN_PIEZO (37)
|
||||||
|
static const uint8_t AREF = PIN_AREF;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial interfaces
|
||||||
|
*/
|
||||||
|
#define PIN_SERIAL1_RX (1)
|
||||||
|
#define PIN_SERIAL1_TX (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SPI Interfaces
|
||||||
|
*/
|
||||||
|
#define SPI_INTERFACES_COUNT 1
|
||||||
|
|
||||||
|
#define PIN_SPI_MISO (24)
|
||||||
|
#define PIN_SPI_MOSI (25)
|
||||||
|
#define PIN_SPI_SCK (26)
|
||||||
|
|
||||||
|
static const uint8_t SS = (5);
|
||||||
|
static const uint8_t MOSI = PIN_SPI_MOSI;
|
||||||
|
static const uint8_t MISO = PIN_SPI_MISO;
|
||||||
|
static const uint8_t SCK = PIN_SPI_SCK;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wire Interfaces
|
||||||
|
*/
|
||||||
|
#define WIRE_INTERFACES_COUNT 1
|
||||||
|
|
||||||
|
#define PIN_WIRE_SDA (22)
|
||||||
|
#define PIN_WIRE_SCL (23)
|
||||||
|
|
||||||
|
// I2C device addresses
|
||||||
|
#define I2C_ADDR_BQ27441 0x55 // Battery gauge
|
||||||
|
|
||||||
|
// CUSTOM GPIOs the SX1262
|
||||||
|
#define SX1262_CS (32)
|
||||||
|
#define SX1262_DIO1 (29)
|
||||||
|
#define SX1262_DIO2 (30)
|
||||||
|
#define SX1262_BUSY (33) // Supposed to be P0.18 but because of reworks, now on P0.31 (18)
|
||||||
|
#define SX1262_RESET (34)
|
||||||
|
// #define SX1262_ANT_SW (32 + 10)
|
||||||
|
#define SX1262_RXEN (14)
|
||||||
|
#define SX1262_TXEN (31)
|
||||||
|
#define SX1262_POWER_EN \
|
||||||
|
(15) // FIXME, see warning hre https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay/blob/master/LORA_RELAY_NRF52840.ino
|
||||||
|
#define SX1262_E22 // Indicates this SX1262 is inside of an ebyte E22 module and special config should be done for that
|
||||||
|
|
||||||
|
#define ST7735_RESET (11) // Output
|
||||||
|
#define ST7735_CS (12)
|
||||||
|
#define ST7735_BACKLIGHT_EN (13)
|
||||||
|
#define ST7735_RS (9)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Arduino objects - C++ only
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#endif
|
Ładowanie…
Reference in New Issue