mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
100 lines
1.9 KiB
Go
100 lines
1.9 KiB
Go
package rtl8720dn
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
var (
|
|
headerBuf [4]byte
|
|
readBuf [4]byte
|
|
startWriteMessageBuf [1024]byte
|
|
payload [2048]byte
|
|
)
|
|
|
|
const (
|
|
xVersion = 1
|
|
)
|
|
|
|
func startWriteMessage(msgType, service, requestNumber, sequence uint32) []byte {
|
|
startWriteMessageBuf[0] = byte(msgType)
|
|
startWriteMessageBuf[1] = byte(requestNumber)
|
|
startWriteMessageBuf[2] = byte(service)
|
|
startWriteMessageBuf[3] = byte(xVersion)
|
|
|
|
startWriteMessageBuf[4] = byte(sequence)
|
|
startWriteMessageBuf[5] = byte(sequence >> 8)
|
|
startWriteMessageBuf[6] = byte(sequence >> 16)
|
|
startWriteMessageBuf[7] = byte(sequence >> 24)
|
|
|
|
return startWriteMessageBuf[:8]
|
|
}
|
|
|
|
func (r *rtl8720dn) performRequest(msg []byte) {
|
|
crc := computeCRC16(msg)
|
|
headerBuf[0] = byte(len(msg))
|
|
headerBuf[1] = byte(len(msg) >> 8)
|
|
headerBuf[2] = byte(crc)
|
|
headerBuf[3] = byte(crc >> 8)
|
|
|
|
if r.debug {
|
|
fmt.Printf("tx : %2d : ", len(headerBuf))
|
|
dumpHex(headerBuf[:])
|
|
fmt.Printf("\r\n")
|
|
}
|
|
|
|
r.uart.Write(headerBuf[:])
|
|
|
|
if r.debug {
|
|
fmt.Printf("tx : %2d : ", len(msg))
|
|
dumpHex(msg)
|
|
fmt.Printf("\r\n")
|
|
}
|
|
r.uart.Write(msg)
|
|
}
|
|
|
|
func dumpHex(b []byte) {
|
|
for i := range b {
|
|
if i == 0 {
|
|
fmt.Printf("%02X", b[i])
|
|
} else {
|
|
fmt.Printf(" %02X", b[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *rtl8720dn) read() {
|
|
for {
|
|
n, _ := io.ReadFull(r.uart, readBuf[:4])
|
|
if n == 0 {
|
|
continue
|
|
}
|
|
|
|
if r.debug {
|
|
fmt.Printf("rx : %2d : ", n)
|
|
dumpHex(readBuf[:n])
|
|
fmt.Printf("\r\n")
|
|
}
|
|
|
|
length := uint16(readBuf[0]) + uint16(readBuf[1])<<8
|
|
crc := uint16(readBuf[2]) + uint16(readBuf[3])<<8
|
|
|
|
n, _ = io.ReadFull(r.uart, payload[:length])
|
|
if r.debug {
|
|
fmt.Printf("rx : %2d : ", length)
|
|
dumpHex(payload[0:n])
|
|
fmt.Printf("\r\n")
|
|
}
|
|
|
|
n = int(length)
|
|
|
|
crcNew := computeCRC16(payload[:n])
|
|
if g, e := crcNew, crc; g != e {
|
|
fmt.Printf("err CRC16: got %04X want %04X\r\n", g, e)
|
|
}
|
|
if payload[0] == 0x02 || payload[0] == 0x00 {
|
|
return
|
|
}
|
|
}
|
|
}
|