第一章 寄存器解析
? ? ? ?要想深入理解并灵活运行mentor提供的这套controller,需要我们对里面的每个寄存器都深入理解。本文详细解释了每个寄存器以及使用方法和注意事项。
提示:以下是本篇文章正文内容,下面案例可供参考
ADDR | name | 描述 | 其他 |
00 | Faddr | 功能地址寄存器 | |
01 | power | power管理寄存器 | |
02.03 | IntrTX | 中断寄存器endpoint0以及TX endpoint1到15 | |
04.05 | IntrRx | 中断寄存器 RX endpoint1到15 | |
06.07 | IntrTxE | TX的中断使能 | |
08.09 | IntrRxE | RX的中断使能 | |
0a | IntrUSB | common usb 中断 | |
0b | IntrUSBE | common usb中断使能 | |
0c.0d | Frame | 帧number | |
0e | index | index寄存器 | |
0f | testmode | enable the usb 2.0 test modes | |
10.11 | TxMaxP | TX endpoint1-15的最大包长 | |
12.13 | CSR0 | endpoint0的控制状态寄存器 | |
TxCSR | TX endpoint1-15的控制状态寄存器 | ||
14.15 | RxMaxP | RX endpoint1-15的最大包长 | |
16.17 | RxCSR | RX endpoint1-15的控制状态寄存器 | |
18.19 | Count0 | endpoint0 fifo接收的byte数 | |
RxCount | endpoint1-15 fifo接收的byte数 | ||
1a | TxTpye | TX endpoint的传输包类型以及使用的endpoint1-15 | 只有host |
1b | NAKL | 设置no ack响应 | 只有host |
1c | RxType | RX endpoint的传输包类型以及使用的endpoint1-15 | |
1d | |||
20-5F | FIFOs | endpoint0-15的fifo地址 | |
60 | DevCtl | OTG device相关的配置 | |
62 | Txfifosz | tx endpoint fifo大小 | |
63 | Rxfifosz | rx endpoint fifo大小 | |
64.65 | Txfifoadd | tx endpoint fifo address | |
66.67 | Rxfifoadd | rx endpoint fifo address | |
bit | name | function |
D7 | - | reserved |
D6-D0 | func addr | the function address |
作为host:需要在set address过程中通过设置该寄存器来选中device
作为device:需要根据set address过程接收到的function address来更新该地址,作为后续接收包的mapping地址
D7 | ISO update | ||
D6 | soft conn | device cpu设置,建立连接,配置该bit为1 后,USB的DP/DM lines会被enabled,配置该bit为0,DP/DM就会变成三态 | |
D5 | HS enable | CPU配置,HS使能控制 | |
D4 | HS mode | CPU只读,表示当前处于HS模式 | |
D3 | Reset | host CPU设置,表示发送reset,拉高一段时间后CPU拉低 | |
D2 | Resume | CPU配置,用于主动唤醒suspendm | |
D1 | suspend mode | host:软件配置进入suspendm device:硬件根据DP/DM进suspend,CPU只读 | |
D0 | suspend mode enable | CPU配置是否运行进suspendm |
D15- D4 | ... | ||
D3 | EP3 Tx | Tx endpoint 3对应的中断 | 所有端点3的TxCSR里面的merge结果 |
D2 | EP2 Tx | Tx endpoint 2对应的中断 | 所有端点2的TxCSR里面的merge结果 |
D1 | EP1 Tx | Tx endpoint 1对应的中断 | 所有端点1的TxCSR里面的merge结果 |
D0 | EP0 | endpoint0对应的中断 | 所有端点0 merge的结果 |
D15- D4 | ... | ||
D3 | EP3 Rx | Rx endpoint 3对应的中断 | 所有端点3的RxCSR里面的merge结果 |
D2 | EP2 Rx | Rx endpoint 2对应的中断 | 所有端点2的RxCSR里面的merge结果 |
D1 | EP1 Rx | Rx endpoint 1对应的中断 | 所有端点1的RxCSR里面的merge结果 |
D0 |
D15- D4 | ... | ||
D3 | EP3 Tx | Tx endpoint 3对应的中断使能 | |
D2 | EP2 Tx | Tx endpoint 2对应的中断使能 | |
D1 | EP1 Tx | Tx endpoint 1对应的中断使能 | |
D0 | EP0 | endpoint0对应的中断使能 |
D15- D4 | ... | ||
D3 | EP3 Rx | Rx endpoint 3对应的中断使能 | |
D2 | EP2 Rx | Rx endpoint 2对应的中断使能 | |
D1 | EP1 Rx | Rx endpoint 1对应的中断使能 | |
D0 |
8bit只读的common中断状态,读清
D7 | Vbus Error | ||
D6 | Sess Req | 只有host有效,表示检测到session 请求 | |
D5 | discon | host:检测到device断开了 device:当一个session结束,即session电压降到? | |
D4 | conn | 只有host,当检测到device连接上 | |
D3 | sof | 每帧都会产生,表示有帧头信息 | |
D2 | reset babble | host:?? device:检测到host发送过来的reset | |
D1 | resume | 在suspendm模式下检测到resume事件 | |
D0 | suspend | 只有device:检测到bus上有suspendm |
D7 | Vbus Error | 中断使能 | |
D6 | Sess Req | 中断使能 | |
D5 | discon | 中断使能 | |
D4 | conn | 中断使能 | |
D3 | sof | 中断使能 | |
D2 | reset babble | 中断使能 | |
D1 | resume | 中断使能 | |
D0 | suspend | 中断使能 |
? ?CPU只读寄存器
D10-D0 | frame num | 表示上一次接收到的帧号 |
? ?每一个TX/RX endpoint除了有一套共用的寄存器,他们还有各个独立的控制和状态寄存器,再使用各自独立的寄存器时,可以先set index,表示选择当前endpoint,进行后续配置。
D10-D0 | frame num | 表示上一次接收到的帧号 |
D7 | B-device | 指示是host还是device | cpu RO |
D6 | FSdev | 只有host:指示是否有HS/FS设备接入,进一步区分HS/FS需要 靠chirpK | cpu RO |
D5 | LSdev | 只有host:指示是否有LS设备接入 | cpu RO |
D4-D3 | VBUS | 指示当前VBUS处于什么电位 00:VBUS below sessionend 01:above sessionend,below Avalid 10:above avalid,below VBUS valid 11:above VBUS valid | cpu RO |
D2 | Host? Mode | 指示当前处于host模式 | cpu RO |
D1 | Host Req | OTG功能进行HNP协议时,device发送请求host身份 | cpu RW |
D0 | session | host:CPU来配置开启session device:USB controller硬件根据session start/end来更新该bit | cpu RW |
以下都是index的寄存器:就是配置端点时用各个的寄存器,而非common寄存器。
专门为endpoint0提供控制和状态寄存器。
下表为Device端看到的寄存器:
D8 | FlushFifo | CPU写1来清除待发送的数据 | |
D7 | serviced SetupEnd | 清D4,该bit硬件自清 | |
D6 | serviced RxPktRdy | 清D0,该bit硬件自清 | |
D5 | SendStall | CPU写该bit来终止当前的传输,该bit硬件自清 | |
D4 | SetupEnd | 当发送完控制包后,在发送D3之前,该bit由硬件置位? 此时会产生中断并flush掉fifo,CPU通过写D7来清除该bit | |
D3 | DataEnd | 三种场景需要CPU设置该bit: 1. 当为最后一笔data包设置txpktrdy时 2. 当取走最后一笔data包清除rxpktrdy时 3. 为0长度的data包设置txpktrdy时 | 该bit硬件自清 |
D2 | SentStall | ?? | |
D1 | TxPktRdy | cpu填完tx fifo后设置该bit开始发,发完并收到ack后硬件清掉, 同时产生中断 | |
D0 | RxPktRdy | 当收到data包时置1,同时会产生中断,CPU写D6清该bit |
下表为Host端看到的寄存器:
D11 | dis ping | cpu通过该bit来控制在HS下在发送data包前,不要发布ping包 | |
D10-D9 | |||
D8 | FlushFifo | CPU写1来清除待发送的数据 | |
D7 | NAK timeout | 接收不到ack会置位该bit,CPU清,有个专门的timeout寄存器配置时长 | |
D6 | statuspkt | 用于发送DATA1包,需要CPU同时置txpktrdy和reqpkt | |
D5 | ReqPkt | host的IN包请求,CPU写,当rxpktrdy有效后该bit硬件自动清掉 | |
D4 | Error | 当连续三次尝试都收不到device的ack,就会置1,同时上报中断,CPU清该bit | |
D3 | SetupPkt | CPU通过设置该bit以及TxPktrdy来发送setup包 | |
D2 | RxStall | 当接收到STALL帧时,硬件置位,CPU清 | |
D1 | TxPktRdy | cpu填完tx fifo后设置该bit开始发,发完并收到ack后硬件清掉, 同时产生中断 | |
D0 | RxPktRdy | 当收到data包时置1,同时产生中断,一旦CPU读fifo就会自动清除该bit |
D6-D0 | Rx Count | 当rxpktrdy有效时,该count才有意义 |
D4-D0 | timeout | endpoint0 NAK对应的timeout时间 |
除了endpoint0,其他的endpoint1-15,单次传输最大包长,最大1024 byte
对于每一个endpoint1-15,都有各自的TXCSR寄存器,里面涉及到中断的bit或起来后组成INTRTX里面的相应的端点中断。
对于device:
D15 | AutoSet | 自动设置txpktrdy | |
D14 | ISO | ISO传输 | |
D13 | Mode | 控制当前端点为TX还是RX | |
D12 | DMAreq enab | DMA请求使能 | |
D11 | FrcData Tog | CPU通过该bit来force发送toggle的data | |
D10 | DMAreq mode | DMA请求的模式配置 | |
D9-D8 | |||
D7 | incomp TX | 用于拆分包 | |
D6 | clrdata tog | CPU通过该bit来复位endpoint,一直发0 | |
D5 | sentstall | 当USB收到sendstall包时会置位 | |
D4 | sendstall | CPU通过写该bit来发stall命令 | |
D3 | flush fifo | CPU通过该bit来清 endpoint的tx fifo | |
D2 | under run | 当CPU没有设txpktrdy时,host发送了IN包请求,该bit会被置位 | |
D1 | FIFO not empty | 当txfifo中至少有一个数据时,说明没有空 | |
D0 | TxPktRdy | cpu填完tx fifo后设置该bit开始发,发完并收到ack后硬件清掉, 同时产生中断 |
对于host:
D15 | AutoSet | 自动设置txpktrdy | |
D14 | |||
D13 | Mode | 控制当前端点为TX还是RX | |
D12 | DMAreq enab | DMA请求使能 | |
D11 | FrcData Tog | CPU通过该bit来force发送toggle的data | |
D10 | DMAreq mode | DMA请求的模式配置 | |
D9-D8 | |||
D7 | incomp TX | 用于拆分包 | |
D6 | clrdata tog | CPU通过该bit来复位endpoint,一直发0 | |
D5 | rxstall | 当接收到STALL帧时,硬件置位,CPU清 | |
D4 | |||
D3 | flush fifo | CPU通过该bit来清 endpoint的tx fifo | |
D2 | error | 连续三次尝试都收不到ack | |
D1 | FIFO not empty | 当txfifo中至少有一个数据时,说明没有空 | |
D0 | TxPktRdy | cpu填完tx fifo后设置该bit开始发,发完并收到ack后硬件清掉, 同时产生中断 |
除了endpoint0,其他的endpoint1-15,单次传输最大包长,最大1024 byte
对于每一个endpoint1-15,都有各自的RXCSR寄存器,里面涉及到中断的bit或起来后组成INTRRX里面的相应的端点中断。
对于device:
D15 | Autoclr | ||
D14 | ISO | ||
D13 | DMAreq enab | ||
D12 | disNyet PID error | ||
D11 | DMAreq mode | ||
D10-D9 | |||
D8 | incomp Rx | ||
D7 | clrdata Tog | ||
D6 | sentstall | ||
D5 | sendstall | ||
D4 | flush fifo | ||
D3 | data error | ||
D2 | over run | 当rxfifo已经满了,host还在发out包,该bit会被置位 | |
D1 | FIFO full | rxfifo已经满了 | |
D0 | RxPktRdy | 表示接收到了包 |
对于host:
D15 | Autoclr | ||
D14 | autoreq | ||
D13 | DMAreq enab | ||
D12 | PID error | ||
D11 | DMAreq mode | ||
D10-D9 | |||
D8 | incomp RX | ||
D7 | clrdata tog | ||
D6 | rxstall | ||
D5 | reqpkt | ||
D4 | flush fifo | ||
D3 | NAK time out | ||
D2 | error | ||
D1 | FIFO full | ||
D0 | RxPktRdy |
除了endpoint0,其他的endpoint1-15,单次传输最大包长,最大4096?byte
除了endpoint0,其他的endpoint1-15,只有host
D5-D4 | protocol | cpu控制 TX endpoint: 00:illegal 01:ISO 10:BULK包 11:Interrupt传输 | |
D3-D0 | Target Endpoint Num | host要访问的device端点号 |
除了endpoint0,其他的endpoint1-15,只有host
D5-D4 | protocol | cpu控制 RX endpoint: 00:illegal 01:ISO 10:BULK包 11:Interrupt传输 | |
D3-D0 | Target Endpoint Num | host要访问的device端点号 |
除了endpoint0,其他的endpoint1-15
D7-D4 | RX fifo size | 2^N | RO |
D3-D0 | TX fifo size | 2^N | RO |
除了endpoint0,其他的endpoint1-15
TX/RX
D4 | DPB | 是否是双buffer | |
D3-D0 | SZ | 0000:8byte 0001:16byte 0010:32byte ... 1001:4096byte 如果是双buffer,实际fifo大小是这个配置的两倍 |
TX/RX ADDR
D13 | |||
D12-D0 | AD | 0000:起始地址0000 0001:起始地址0008 0010:起始地址0010 ... 1FFF:起始地址FFF8 | 8byte对齐 |
? ? ? ?以上内容对寄存器做了详细的解析,并对一些关键的寄存器bit做了备注,在实际使用过程中需要软件特别的注意。寄存器的定义对应了每个功能,只有详细了解每个寄存器的物理含义以及使用说明,才能更好的实现相关的功能。