rp2040: change volatile access to dpsram
Этот коммит содержится в:
родитель
15a9e2313a
коммит
a1d7cab080
1 изменённых файлов: 30 добавлений и 29 удалений
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче