Add inverted serial support on GPIO4 and add FLIR Tau command helper

This commit is contained in:
Bertold Van den Bergh 2023-10-24 18:11:54 +02:00
parent 22ddf782f5
commit 6a644ede3f
7 changed files with 98 additions and 43 deletions

View file

@ -41,6 +41,7 @@ var CLI struct {
I2CTransfer I2CTransfer `cmd name:"i2c-txfr" help:"Perform I2C transfer."` I2CTransfer I2CTransfer `cmd name:"i2c-txfr" help:"Perform I2C transfer."`
UARTTx UARTTx `cmd name:"uart-tx" help:"Transmit data over UART."` UARTTx UARTTx `cmd name:"uart-tx" help:"Transmit data over UART."`
FlirTX FlirTX `cmd name:"flir-tx" help:"Transmit FLIR Tau(2) command over UART."`
GPIOSet GPIOSet `cmd name:"gpio-set" help:"Set GPIO pin value and direction."` GPIOSet GPIOSet `cmd name:"gpio-set" help:"Set GPIO pin value and direction."`
GPIOGet GPIOGet `cmd name:"gpio-get" help:"Get GPIO values."` GPIOGet GPIOGet `cmd name:"gpio-get" help:"Get GPIO values."`

View file

@ -1,12 +1,16 @@
package main package main
import ( import (
"encoding/binary"
"encoding/hex" "encoding/hex"
"github.com/sigurn/crc16"
) )
type UARTTx struct { type UARTTx struct {
Data string `arg name:"data" help:"Hex string to write to device"` Data string `arg name:"data" help:"Hex string to write to device"`
Baud int `optional help:"Data rate in bits per second" default:"57600"` Invert bool `optional help:"Use RS232 polarity instead of TTL" default:"false"`
Baud int `optional help:"Data rate in bits per second" default:"57600"`
} }
func (l *UARTTx) Run(c *Context) error { func (l *UARTTx) Run(c *Context) error {
@ -15,5 +19,32 @@ func (l *UARTTx) Run(c *Context) error {
return err return err
} }
return c.hal.UARTTransmit(l.Baud, buf) return c.hal.UARTTransmit(l.Baud, buf, l.Invert)
}
type FlirTX struct {
Func int `arg name:"func" type:"hex" help:"Function to call"`
Params string `optional name:"data" help:"Parameters as hex string"`
}
func flirTauEncodeCommand(cmd byte, param []byte) []byte {
var crcTab = crc16.MakeTable(crc16.CRC16_XMODEM)
result := []byte{0x6E, 0, 0, cmd, 0, 0, 0, 0}
binary.BigEndian.PutUint16(result[4:], uint16(len(param)))
binary.BigEndian.PutUint16(result[6:], crc16.Update(0, result[:6], crcTab))
result = append(result, param...)
result = binary.BigEndian.AppendUint16(result, crc16.Update(0, result[8:], crcTab))
return result
}
func (l *FlirTX) Run(c *Context) error {
param, err := hex.DecodeString(l.Params)
if err != nil {
return err
}
return c.hal.UARTTransmit(56700, flirTauEncodeCommand(uint8(l.Func), param), true)
} }

1
go.mod
View file

@ -6,6 +6,7 @@ require (
github.com/alecthomas/kong v0.2.17 github.com/alecthomas/kong v0.2.17
github.com/fatih/color v1.12.0 github.com/fatih/color v1.12.0
github.com/inancgumus/screen v0.0.0-20190314163918-06e984b86ed3 github.com/inancgumus/screen v0.0.0-20190314163918-06e984b86ed3
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 // indirect
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4 github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1

2
go.sum
View file

@ -13,6 +13,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3 h1:aQKxg3+2p+IFXXg97McgDGT5zcMrQoi0EICZs8Pgchs=
github.com/sigurn/crc16 v0.0.0-20211026045750-20ab5afb07e3/go.mod h1:9/etS5gpQq9BJsJMWg1wpLbfuSnkm8dPF6FdW2JXVhA=
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4 h1:hczfXYN39SDj4FcN5J7sgHBtJm4U7ef2nvlonn6NvVU= github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4 h1:hczfXYN39SDj4FcN5J7sgHBtJm4U7ef2nvlonn6NvVU=
github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4/go.mod h1:JwBz6izP5UGcbYDU5VGeLkqpRIpSBDPtCB5/XnVXz9Q= github.com/sstallion/go-hid v0.0.0-20190621001400-1cf4630be9f4/go.mod h1:JwBz6izP5UGcbYDU5VGeLkqpRIpSBDPtCB5/XnVXz9Q=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

View file

@ -1,50 +1,56 @@
.FLAG PIN, P2.2 .FLAG PIN, P2.4
.FLAG DIR, P3.2 .EQU BAUD0, 126
.EQU BAUD0, 120 .EQU BAUD1, 127
.EQU BAUD1, 121
.EQU PDIR, 122
MOV BAUD0, R5 ;Save baud rate param PUSH BAUD0
MOV BAUD1, R6 PUSH BAUD1
MOV PDIR, P3
CLR DIR
more:
MOVX A, @DPTR MOVX A, @DPTR
INC DPTR INC DPTR
MOV BAUD0, A
MOVX A, @DPTR
MOV BAUD1, A
more:
MOV R0, #8 ;Send 8 bits from A MOV R0, #8 ;Send 8 bits from A
CLR PIN ;Send start bit INC DPTR
MOV R5, BAUD0 ;Delay between bits MOV A, R6
MOV R6, BAUD1 RRC A
MOV PIN,C ;Send start bit
MOV R1, BAUD0 ;Delay between bits
MOV R2, BAUD1
d1: d1:
DJNZ R5, d1 DJNZ R1, d1
DJNZ R6, d1 DJNZ R2, d1
MOVX A, @DPTR
bits: bits:
RRC A ;Rotate bits via carry RRC A ;Rotate bits via carry
MOV PIN,C ;Output bits MOV PIN,C ;Output bits
MOV R5, BAUD0 ;Delay between bits MOV R1, BAUD0 ;Delay between bits
MOV R6, BAUD1 MOV R2, BAUD1
d2: d2:
DJNZ R5, d2 DJNZ R1, d2
DJNZ R6, d2 DJNZ R2, d2
DJNZ R0, bits ;Send all bits DJNZ R0, bits ;Send all bits
RRC A ;Not needed, but makes timing equal MOV A, R6
SETB PIN ;Send stop bit RLC A
MOV PIN,C ;Send stop bit
MOV R5, BAUD0 ;Delay between bits MOV R1, BAUD0 ;Delay between bits
MOV R6, BAUD1 MOV R2, BAUD1
d3: d3:
DJNZ R5, d3 DJNZ R1, d3
DJNZ R6, d3 DJNZ R2, d3
DJNZ R7, more ;Send all characters DJNZ R7, more ;Send all characters
MOV P3, PDIR POP BAUD0
POP BAUD1
RET RET

View file

@ -1 +1 @@
峹巠叞z虏啵x垄瓁畒蔺撄挗瓁畒蔺撄伢尧瓁畒蔺撄哓厇<E59393>" À~Àà£õ~àõx£î’¤©~ªÙþÚüà’¤©~ªÙþÚüØóî3¤©~ªÙþÚüßÕÐ~Ð"

View file

@ -1,21 +1,35 @@
package mshal package mshal
import ( import "encoding/binary"
"encoding/binary"
)
func (h *HAL) UARTTransmit(baud int, buf []byte) error { func (h *HAL) UARTTransmit(baud int, data []byte, invert bool) error {
region := h.MemoryRegionGet(MemoryRegionUserRAM) if _, _, err := h.GPIOUpdate(0, 0, 1>>4, 0); err != nil {
parent, addr := region.GetParent()
addr += region.GetLength() - len(buf)
if _, err := parent.Access(true, addr, buf); err != nil {
return err return err
} }
var div [2]byte region := h.MemoryRegionGet(MemoryRegionUserRAM)
binary.LittleEndian.PutUint16(div[:], uint16((1.0/float64(baud))/108.125e-9)) parent, addr := region.GetParent()
_, err := h.PatchExecFunc(false, h.patchCallAddrs[4], PatchExecFuncRequest{DPTR: uint16(addr), R5: div[0] + 1, R6: div[1] + 1, R7_A: uint8(len(buf))}) params := make([]byte, 2+len(data))
addr += region.GetLength() - len(params)
binary.LittleEndian.PutUint16(params[:], uint16((1.0/float64(baud))/108.125e-9))
params[0] += 1
params[1] += 1
copy(params[2:], data)
ssbit := byte(0x80)
if invert {
ssbit = 0x01
for i := range data {
params[2+i] ^= 0xFF
}
}
if _, err := parent.Access(true, addr, params); err != nil {
return err
}
_, err := h.PatchExecFunc(false, h.patchCallAddrs[4], PatchExecFuncRequest{DPTR: uint16(addr), R6: ssbit, R7_A: uint8(len(data))})
return err return err
} }