iCE40 USB Core Memory Map ========================= Global CSRs ----------- ### Control (Read / Write addr `0x000`) ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | p | / | cs| ce| (rsvd) | addr | '--------------------------------------------------------------' ``` * `p`: Enables DP pull-up * `cs`: Control Endpoint Lockout - State [Read Only] * `ce`: Control Endpoint Lockout - Enable * `addr`: Configure address matching ### Action ( Write addr `0x01` ) ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | rsvd | cr| (rsvd) | '--------------------------------------------------------------' ``` * `cr`: Control Endpoint Lockout - Release ### Events (Read addr `0x02`) This contains info about the generated events from the transaction microcode. It can either contain info about the last event only along with a count of events since last read, or it can be a FIFO depending on the core configuration. Count mode (`EVENT_DEPTH = 0/1`) : ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | cnt | event | '--------------------------------------------------------------' ``` * `cnt`: Counter of events since last read * `event`: Last recorded event data (see below) FIFO mode (`EVENT_DEPTH > 1`) : ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | v | o | rsvd | event | '--------------------------------------------------------------' ``` * `v`: Valid (i.e. FIFO is not empty and `event` is valid) * `o`: FIFO Overflow * `event`: event data (see below) Event format: ``` ,----------------------------------------------, | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |----------------------------------------------| | ucnc | endp | d | s | b | / | '----------------------------------------------' ``` * `ucnc`: Notification code * `endp`: Endpoint # * `d`: Direction (1=IN, 0=OUT/SETUP) * `s`: Is SETUP ? * `b`: Buffer Descriptor index EP Status --------- ### Address: ``` ,-----------------------------------------------, | b | a | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |-----------------------------------------------| | 1 0 0 0 | ep_num |dir| 0 0 0 | '-----------------------------------------------' ``` ### Data: ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | | t | b | bdm | | EP type | '--------------------------------------------------------------' ``` * `t`: Data Toggle (if relevant for EP type) * `b`: Buffer Descriptor index * 'bdm': Buffer descriptor mode - `00` - Single Buffer (index 0 only) - `01` - Double Buffer - `10` - Special Control EP mode (index 0=data, 1=setup) * EP Type: (`h` indicates if this EP is halted) - `000`: Non-existant - `001`: Isochronous - `01h`: Interrupt - `10h`: Bulk - `11h`: Control Buffer Descriptor ----------------- ### Address: ``` ,-----------------------------------------------, | b | a | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |-----------------------------------------------| | 1 0 0 0 | ep_num |dir| 1 | i | w | '-----------------------------------------------' ``` * `i`: BD Index (0/1) * `w`: Word select ### Word 0: ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | state | s | rsvd | Buffer Length | '--------------------------------------------------------------' ``` * `s`: Transactions was setup * BD State: - `000`: Empty / Unused - `010`: Valid, ready for Tx/RX data - `011`: Valid, issue STALL (and drop data) - `100`: Used - Success - `1xx`: Used - Error with xx=01/10/11 error code ### Word 1: ``` ,--------------------------------------------------------------, | f | e | d | c | b | a | 9 | 8| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |--------------------------------------------------------------| | (rsvd) | Buffer Pointer | '--------------------------------------------------------------' ```