@@ -70,6 +70,7 @@ type USBCDC struct {
7070 rxBuffer * rxRingBuffer
7171 txBuffer * txRingBuffer
7272 waitTxc bool
73+ dev usb.Controller
7374}
7475
7576var (
@@ -88,7 +89,7 @@ func (usbcdc *USBCDC) Configure(config machine.UARTConfig) error {
8889func (usbcdc * USBCDC ) Flush () {
8990 mask := interrupt .Disable ()
9091 if b , ok := usbcdc .txBuffer .Get (); ok {
91- machine .SendUSBInPacket (cdcEndpointIn , b )
92+ usbcdc . dev .SendUSBInPacket (cdcEndpointIn , b )
9293 } else {
9394 usbcdc .waitTxc = false
9495 }
@@ -123,15 +124,15 @@ func (usbcdc *USBCDC) RTS() bool {
123124 return (usbLineInfo .lineState & usb_CDC_LINESTATE_RTS ) > 0
124125}
125126
126- func cdcCallbackRx (b []byte ) {
127+ func ( usbcdc * USBCDC ) Rx (b []byte ) {
127128 for i := range b {
128- USB .Receive (b [i ])
129+ usbcdc .Receive (b [i ])
129130 }
130131}
131132
132133var cdcSetupBuff [cdcLineInfoSize ]byte
133134
134- func cdcSetup (setup usb.Setup ) bool {
135+ func ( usbcdc * USBCDC ) Setup (setup usb.Setup ) bool {
135136 if setup .BmRequestType == usb_REQUEST_DEVICETOHOST_CLASS_INTERFACE {
136137 if setup .BRequest == usb_CDC_GET_LINE_CODING {
137138 cdcSetupBuff [0 ] = byte (usbLineInfo .dwDTERate )
@@ -142,14 +143,14 @@ func cdcSetup(setup usb.Setup) bool {
142143 cdcSetupBuff [5 ] = byte (usbLineInfo .bParityType )
143144 cdcSetupBuff [6 ] = byte (usbLineInfo .bDataBits )
144145
145- machine .SendUSBInPacket (0 , cdcSetupBuff [:])
146+ usbcdc . dev .SendUSBInPacket (0 , cdcSetupBuff [:])
146147 return true
147148 }
148149 }
149150
150151 if setup .BmRequestType == usb_REQUEST_HOSTTODEVICE_CLASS_INTERFACE {
151152 if setup .BRequest == usb_CDC_SET_LINE_CODING {
152- b , err := machine .ReceiveUSBControlPacket ()
153+ b , err := usbcdc . dev .ReceiveUSBControlPacket ()
153154 if err != nil {
154155 return false
155156 }
@@ -171,21 +172,22 @@ func cdcSetup(setup usb.Setup) bool {
171172 } else {
172173 // TODO: cancel any reset
173174 }
174- machine .SendZlp ()
175+ usbcdc . dev .SendZlp ()
175176 }
176177
177178 if setup .BRequest == usb_CDC_SEND_BREAK {
178179 // TODO: something with this value?
179180 // breakValue = ((uint16_t)setup.wValueH << 8) | setup.wValueL;
180181 // return false;
181- machine .SendZlp ()
182+ usbcdc . dev .SendZlp ()
182183 }
183184 return true
184185 }
185186 return false
186187}
187188
188189func EnableUSBCDC () {
189- machine .USBCDC = New ()
190- machine .EnableCDC (USB .Flush , cdcCallbackRx , cdcSetup )
190+ c := New ()
191+ machine .USBCDC = c
192+ machine .EnableCDC (c .Flush , c .Rx , c .Setup )
191193}
0 commit comments