User Tools

Site Tools


en:pfw:usb_cdc_driver_for_rp2040

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:pfw:usb_cdc_driver_for_rp2040 [2025-12-27 13:58] – [Pseudo code] willemen:pfw:usb_cdc_driver_for_rp2040 [2026-01-13 18:16] (current) – [The idea] willem
Line 37: Line 37:
 Reserve 64 bytes RAM as scratchpad area Reserve 64 bytes RAM as scratchpad area
  
-Function: EP0 +Function: EP0   ( -- a ) 
-Function: EP1 +Function: EP1   ( -- a ) 
-Function: EP2 +Function: EP2   ( -- a ) 
-Function: EP3+Function: EP3   ( -- a )
 Seven cells data structures to control endpoint-0, 1, 2 & 3 Seven cells data structures to control endpoint-0, 1, 2 & 3
 The first four cells a variable data The first four cells a variable data
 The three cells thereafter contain USB pointers & register addresses The three cells thereafter contain USB pointers & register addresses
  
-...+Function: @VAL   ( -- +n ) 
 +Read the wValue from any eight bytes setup packet 
 +Function: @LEN   ( -- +n ) 
 +Read the wLength from any eight bytes setup packet 
 + 
 +Function: >UNI   ( a1 u -- a2 ) 
 +Store the ASCII string to a unicode string tailored for USB 
 + 
 +Function: >CNT    \ Offset 00 
 +Function: >ORG    \ Offset 04 
 +Function: >PKT    \ Offset 08 
 +Function: >PID    \ Offset 12 
 +Function: >ICTRL  \ Offset 16 
 +Function: >OCTRL  \ Offset 20 
 +Function: >BUF    \ Offset 24 
 +Seven functions that calculate the address of each field in the  
 +endpoint data structures 
 + 
 +Function: EP-IN    ( ep -- org buf pkt ) 
 +Calculate data to send for 'ep'
 + 
 +Function: PREPARE  ( a u ep -- ) 
 +Prepare data packet from address 'a' with the length 'u' to send tp 'ep'
 + 
 +Function: >NEXT    ( ep -- pkt ) 
 +Get next packet size for 'ep' x, when 'pkt' is zero there is no more  
 +data to send 
 + 
 +Function: !PKT     ( pkt ep -- ictrl ) 
 +Store next packet to send for 'ep' x  
 + 
 +Function: PREP-RCV ( ep -- ) 
 +Enable endpoint 'ep' x  to receive a data packet 
 + 
 +Function: GONE?    ( ep -- f ) 
 +Leave true when the data in 'ep' x was sent 
 + 
 +Function: USB?     ( -- +n ) 
 +Leave three when the host & device are connected 
 + 
 +Function: USB-SEND ( ep -- ) 
 +Transmit the prepared data packet to 'ep'
 + 
 +Function: USB-RCV  ( pid ep -- ) 
 +Enable the receiving of a data packet on 'ep' x starting with the 'pid'  
 +from the stack 
 + 
 +Function: BUS=RESET ( -- ) 
 +Handle a USB bus reset, clearing the device address to zero, the USB  
 +state to zero, reinitialise the receiving & transmitting endpoints 
 + 
 +Function: SETUP>   ( a u -- ) 
 +Handle the answer data  packet 'a' 'u' for all setup packages 
 +When done wait for a ZLP from the host to signal a correct answer 
 + 
 +Function: XTABLE 
 +    Define an execution table entry for '+n' request actions 
 +    Define:  ( +n "name" -- ) 
 +        Create a table with "name" for '+n' actions 
 +    Action:  ( request -- ) 
 +        Execute the action for 'request' or generate a stall 
 +        when the 'request' is not available 
 +         
 +Function: ZLP>     ( -- ) 
 +Send a zero length package through endpoint zeroThis is used  
 +to signal the handling of a request that sends no data back 
 + 
 +Define four action in front that leave their execution tokens on the stack 
 +0302 action xt 
 +0300 action xt 
 +0200 action xt 
 +0100 action xt 
 +Function: HANDLE-SETUP ( req0 .. req3 4 -- ) 
 + 
 +2221 action xt 
 +21A1 action xt 
 +2021 action xt 
 +0900 action xt 
 +0880 action xt 
 +0680 action xt 
 +0500 action xt 
 +Function: HANDLE-REQ)  ( req0 .. req6 7 -- ) 
 + 
 +Function: HANDLE-REQ   ( -- ) 
 +Reset setup request interrupt, read bmrequest type and do HANDLE-REQ) 
 + 
 +Function: #L           ( -- +n ) 
 +Ring buffer size, must be a power of two 
 +Function: #R           ( -- +n ) 
 +this is equal to #L - 1 
 + 
 +Function: #RX          ( -- +n ) 
 +Leave number of characters in receive buffer 
 +Function: #TX          ( -- +n ) 
 +Leave number of characters in transmit buffer 
 + 
 +Function: >RX          ( c -- ) 
 +Store character 'c' in RX ring buffer 
 +Function: >TX          ( c -- ) 
 +Store character 'c' in TX ring buffer 
 + 
 +Function: RX>          ( -- c ) 
 +Read character 'c' from RX ring buffer 
 +Function: TX>          ( -- c ) 
 +Read character 'c' from TX ring buffer 
 + 
 +Function: IFLAG    
 +Reserve one cell space for receive interrupt flag 
 + 
 +Function: ENDPOINTS    ( -- ) 
 +Handle EP1 & EP3 endpoints, save received data interrupt flag in IFLAG 
 +Release all interrupt flags 
 + 
 +Function: REQUESTS     ( -- ) 
 +Handle all USB interrupts, that are the USB bus reset, setup requests & endpoints 
 + 
 +Function: USB-HANDLER  ( -- ) 
 +Handle the receiving of the RX data using iFLAG and use the low level USB 
 +ACK/NAK handshake to move data from an endpoint to the RX ring buffer in a controlled way. 
 +Handle the transmitting of TX data, but only when a connection is made. Before filling 
 +the TX endpoint check if the previous data packet was sent too. 
 + 
 +Function: USB-KEY?     ( -- flag ) 
 +Leave true flag when there is data in the RX ring buffer, otherwise false 
 +Call the USB-HANDLER once too 
 + 
 +Function: USB-KEY      ( -- c ) 
 +Leave character 'c' when there is data in the RX ring buffer 
 +Call the USB-HANDLER waiting for space in the RX ring buffer 
 + 
 +Function: USB-EMIT     ( c -- ) 
 +Store character 'c' when there is space in the TX ring buffer 
 +Call the USB-HANDLER waiting for space in the TX ring buffer 
 + 
 +Function: USB-ON 
 +Initialise the USB DPRAM, call START-USB, clear USB-STATE & IFLAG 
 +finally initialse the KEY?, KEY and EMIT vectors of the used system.
  
 </code> </code>
  
-===== Implementation example =====+===== Generic Forth implementation example =====
  
 <code forth> <code forth>
Line 286: Line 422:
 </code> </code>
  
 +===== Implementations =====
 +
 +[[https://github.com/WillemOuwerkerk/noForth-T-hardware-examples-RP2040/tree/main/USB-CDC|Different noForth implementations for the USB-CDC driver]]
en/pfw/usb_cdc_driver_for_rp2040.1766840324.txt.gz · Last modified: 2025-12-27 13:58 by willem