rp2040: add support for EnterBootloader()

This commit is contained in:
sago35
2022-07-14 22:04:31 +09:00
committed by Ron Evans
parent a1d7cab080
commit f370cd18fc
3 changed files with 72 additions and 13 deletions
+18 -13
View File
@@ -4,7 +4,6 @@
package machine
import (
"device/arm"
"device/rp"
"machine/usb"
"runtime/interrupt"
@@ -153,7 +152,8 @@ func initEndpoint(ep, config uint32) {
case usb.ENDPOINT_TYPE_CONTROL:
val |= usbEpControlEndpointTypeControl
usbDPSRAM.EPxBufferControl[ep].Out.Set(usbBuf0CtrlAvail)
usbDPSRAM.EPxBufferControl[ep].Out.Set(usbBuf0CtrlData1Pid)
usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlAvail)
}
}
@@ -207,6 +207,21 @@ func sendUSBPacket(ep uint32, data []byte, maxsize uint16) {
func ReceiveUSBControlPacket() ([cdcLineInfoSize]byte, error) {
var b [cdcLineInfoSize]byte
ep := 0
for !usbDPSRAM.EPxBufferControl[ep].Out.HasBits(usbBuf0CtrlFull) {
// TODO: timeout
}
ctrl := usbDPSRAM.EPxBufferControl[ep].Out.Get()
usbDPSRAM.EPxBufferControl[ep].Out.Set(USBBufferLen & usbBuf0CtrlLenMask)
sz := ctrl & usbBuf0CtrlLenMask
copy(b[:], usbDPSRAM.EPxBuffer[ep].Buffer0[:sz])
usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlData1Pid)
usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlAvail)
return b, nil
}
@@ -218,7 +233,7 @@ func handleEndpointRx(ep uint32) []byte {
copy(buf, usbDPSRAM.EPxBuffer[ep].Buffer0[:sz])
epXdata0[ep] = !epXdata0[ep]
if epXdata0[ep] {
if epXdata0[ep] || ep == 0 {
usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlData1Pid)
}
@@ -259,16 +274,6 @@ func sendStallViaEPIn(ep uint32) {
usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
}
// EnterBootloader should perform a system reset in preparation
// to switch to the bootloader to flash new firmware.
func EnterBootloader() {
arm.DisableInterrupts()
// TODO: Perform magic reset into bootloader
arm.SystemReset()
}
type USBDPSRAM struct {
// Note that EPxControl[0] is not EP0Control but 8-byte setup data.
EPxControl [16]USBEndpointControlRegister