rp2040: change volatile access to dpsram

Этот коммит содержится в:
sago35 2022-07-14 22:02:43 +09:00 коммит произвёл Ron Evans
родитель 15a9e2313a
коммит a1d7cab080

Просмотреть файл

@ -8,6 +8,7 @@ import (
"device/rp" "device/rp"
"machine/usb" "machine/usb"
"runtime/interrupt" "runtime/interrupt"
"runtime/volatile"
"unsafe" "unsafe"
) )
@ -135,24 +136,24 @@ func initEndpoint(ep, config uint32) {
switch config { switch config {
case usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn: case usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointIn:
val |= usbEpControlEndpointTypeInterrupt val |= usbEpControlEndpointTypeInterrupt
usbDPSRAM.EPxControl[ep].In = val usbDPSRAM.EPxControl[ep].In.Set(val)
case usb.ENDPOINT_TYPE_BULK | usb.EndpointOut: case usb.ENDPOINT_TYPE_BULK | usb.EndpointOut:
val |= usbEpControlEndpointTypeBulk val |= usbEpControlEndpointTypeBulk
usbDPSRAM.EPxControl[ep].Out = val usbDPSRAM.EPxControl[ep].Out.Set(val)
usbDPSRAM.EPxBufferControl[ep].Out = USBBufferLen & usbBuf0CtrlLenMask usbDPSRAM.EPxBufferControl[ep].Out.Set(USBBufferLen & usbBuf0CtrlLenMask)
usbDPSRAM.EPxBufferControl[ep].Out |= usbBuf0CtrlAvail usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlAvail)
case usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointOut: case usb.ENDPOINT_TYPE_INTERRUPT | usb.EndpointOut:
// TODO: not really anything, seems like... // TODO: not really anything, seems like...
case usb.ENDPOINT_TYPE_BULK | usb.EndpointIn: case usb.ENDPOINT_TYPE_BULK | usb.EndpointIn:
val |= usbEpControlEndpointTypeBulk val |= usbEpControlEndpointTypeBulk
usbDPSRAM.EPxControl[ep].In = val usbDPSRAM.EPxControl[ep].In.Set(val)
case usb.ENDPOINT_TYPE_CONTROL: case usb.ENDPOINT_TYPE_CONTROL:
val |= usbEpControlEndpointTypeControl val |= usbEpControlEndpointTypeControl
usbDPSRAM.EPxBufferControl[ep].Out = usbBuf0CtrlAvail usbDPSRAM.EPxBufferControl[ep].Out.Set(usbBuf0CtrlAvail)
} }
} }
@ -210,18 +211,18 @@ func ReceiveUSBControlPacket() ([cdcLineInfoSize]byte, error) {
} }
func handleEndpointRx(ep uint32) []byte { func handleEndpointRx(ep uint32) []byte {
ctrl := usbDPSRAM.EPxBufferControl[ep].Out ctrl := usbDPSRAM.EPxBufferControl[ep].Out.Get()
usbDPSRAM.EPxBufferControl[ep].Out = USBBufferLen & usbBuf0CtrlLenMask usbDPSRAM.EPxBufferControl[ep].Out.Set(USBBufferLen & usbBuf0CtrlLenMask)
sz := ctrl & usbBuf0CtrlLenMask sz := ctrl & usbBuf0CtrlLenMask
buf := make([]byte, sz) buf := make([]byte, sz)
copy(buf, usbDPSRAM.EPxBuffer[ep].Buffer0[:sz]) copy(buf, usbDPSRAM.EPxBuffer[ep].Buffer0[:sz])
epXdata0[ep] = !epXdata0[ep] epXdata0[ep] = !epXdata0[ep]
if epXdata0[ep] { if epXdata0[ep] {
usbDPSRAM.EPxBufferControl[ep].Out |= usbBuf0CtrlData1Pid usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlData1Pid)
} }
usbDPSRAM.EPxBufferControl[ep].Out |= usbBuf0CtrlAvail usbDPSRAM.EPxBufferControl[ep].Out.SetBits(usbBuf0CtrlAvail)
return buf return buf
} }
@ -244,7 +245,7 @@ func sendViaEPIn(ep uint32, data []byte, count int) {
val |= usbBuf0CtrlFull val |= usbBuf0CtrlFull
copy(usbDPSRAM.EPxBuffer[ep&0x7F].Buffer0[:], data[:count]) copy(usbDPSRAM.EPxBuffer[ep&0x7F].Buffer0[:], data[:count])
usbDPSRAM.EPxBufferControl[ep&0x7F].In = val usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
} }
func sendStallViaEPIn(ep uint32) { func sendStallViaEPIn(ep uint32) {
@ -253,9 +254,9 @@ func sendStallViaEPIn(ep uint32) {
rp.USBCTRL_REGS.EP_STALL_ARM.Set(rp.USBCTRL_REGS_EP_STALL_ARM_EP0_IN) rp.USBCTRL_REGS.EP_STALL_ARM.Set(rp.USBCTRL_REGS_EP_STALL_ARM_EP0_IN)
} }
val := uint32(usbBuf0CtrlFull) val := uint32(usbBuf0CtrlFull)
usbDPSRAM.EPxBufferControl[ep&0x7F].In = val usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
val |= uint32(usbBuf0CtrlStall) val |= uint32(usbBuf0CtrlStall)
usbDPSRAM.EPxBufferControl[ep&0x7F].In = val usbDPSRAM.EPxBufferControl[ep&0x7F].In.Set(val)
} }
// EnterBootloader should perform a system reset in preparation // EnterBootloader should perform a system reset in preparation
@ -278,12 +279,12 @@ type USBDPSRAM struct {
} }
type USBEndpointControlRegister struct { type USBEndpointControlRegister struct {
In uint32 In volatile.Register32
Out uint32 Out volatile.Register32
} }
type USBBufferControlRegister struct { type USBBufferControlRegister struct {
In uint32 In volatile.Register32
Out uint32 Out volatile.Register32
} }
type USBBuffer struct { type USBBuffer struct {
@ -299,24 +300,24 @@ var (
func (d *USBDPSRAM) setupBytes() []byte { func (d *USBDPSRAM) setupBytes() []byte {
var buf [8]byte var buf [8]byte
buf[0] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In) buf[0] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get())
buf[1] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In >> 8) buf[1] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 8)
buf[2] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In >> 16) buf[2] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 16)
buf[3] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In >> 24) buf[3] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].In.Get() >> 24)
buf[4] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out) buf[4] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get())
buf[5] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out >> 8) buf[5] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 8)
buf[6] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out >> 16) buf[6] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 16)
buf[7] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out >> 24) buf[7] = byte(d.EPxControl[usb.CONTROL_ENDPOINT].Out.Get() >> 24)
return buf[:] return buf[:]
} }
func (d *USBDPSRAM) clear() { func (d *USBDPSRAM) clear() {
for i := 0; i < len(d.EPxControl); i++ { for i := 0; i < len(d.EPxControl); i++ {
d.EPxControl[i].In = 0 d.EPxControl[i].In.Set(0)
d.EPxControl[i].Out = 0 d.EPxControl[i].Out.Set(0)
d.EPxBufferControl[i].In = 0 d.EPxBufferControl[i].In.Set(0)
d.EPxBufferControl[i].Out = 0 d.EPxBufferControl[i].Out.Set(0)
} }
} }