本文转自公众号,欢迎关注基于dwc2的usb驱动开发-发送相关的寄存器dma寄存器详解 (qq.com)
前言上一篇我们介绍了in端点,发送,dma相关的两个寄存器,这一篇继续讲另外的几个寄存器。
diepctli偏移地址 0x900+i*20
该寄存器控制端点的属性,使能等,是端点操作的核心寄存器
传输使能与禁能bit31和bit30
其实这里名字enable和disable取的并不合适,这里实际并不是指的端点的使能和禁能,更确切的说应该是启动和停止dma对描述符连链表,dma缓冲数据的处理,启动和停止端点数据的传输。
端点的使能也就是激活应该是bit15。
软件在准备好描述符( scatter/gather dma )即diepdmai以及描述符链表后,置位该位,硬件就会开始处理该描述符。对于非scatter/gather dma 的dma则是准备好dma对应的缓冲区也是配置diepdmai后使能该位硬件开始dma处理。当然这里dma处理描述符和dma缓冲区实际就是搬运数据到txfifo中去,所以要txfifo有空闲才会进行。
注意硬件在发送完数据后产生相应的中断时会自动清除该位即setup的完成,数据发送完成时,即相当于自动流控,发送完后硬件自动disable,软件重新配置相应的描述符和dma再重新enable。否则不disable此时软件还没准备好描述符和dma就会没有数据可发。
另外手动置位epdis时 epena也会清零,两者互斥。
而epdis表示停止传输,软件只能在epena之前置位过才能置位该位,在停止中断中硬件自动清除该位。
注意置位后不是一定数据传输马上就停止了,要到停止中断才能确认是停止了。
即diepinti寄存器的bit1 epdisbld为1.
端点激活硬件收到复位信号后清除该位(ep0的不置位,因为ep0要默认使能,用于控制传输进行枚举),软件在设置配置,设置接口的标准请求时置位该位。
pid设置设置pid,注意scatter-gather dma模式是在描述符中设置pid的,所以这里保留
bit16可以查看当前的pid状态
nack操作软件设置snak该位以发送nack用于流控
注意硬件在setup完成后也会置位改位,所以软件在开启新的传输时需要置位cnak和epena以停止nack和启动传输。
diepinti的bit6 inepnakeff置位表示snak设置nack生效。
bit17 naksts表示当前是否出于nak状态
发送fifo号shared fifo模式非周期端点共用一个发送fifo所以这里必须为0,
只有独立发送fifo模式,或者周期端点,则每个发送in端点可以对应一个独立的txfifo
stall软件置位该为以产生stall的ack
端点类型
下一个端点shared fifo模式才有,必须要dma模式才有(slave
模式不需要)
对于每个发送端点独立fifo模式也不需要,因为都是独立控制的,
只有shared fifo模式共享fifo所以才需要链表告诉dma下一个处理哪个端点
端点最大包大小
diepinti****中断状态这里是某个端点详细的中断原因,其中中断的使能是总的中断使能控制daintmsk,即控制哪一个端点的中断使能,
其中bit0 xfercompl表示发送完,是最重要的中断状态
dieptsizi发送大小寄存器
一个微帧发送包数mc注意scatter-gather dma在描述中配置,不使用该寄存器的mc
该位只有内部dma的非scatter-gather dma模式使用
包数注意每搬运完一个包到txfifo,该值会递减,所以可以看该寄存器看已经搬运完的包数
同样注意scatter-gather dma在描述中配置,也不使用该寄存器
传输大小指定一次dma传输的大小
同样注意scatter-gather dma在描述中配置,也不使用该寄存器
该值也会根据已经处理完的数据量递减
其中x 由ghwcfg3的bit4:0可以看到
dtxfstsi该寄存器可以看指定端点对应的txfifo剩余空闲的空间大小
实例scatter/gather dma模式
核心代码如下即配置dma地址,使能epena,清除nack。这里没有贴出描述符的填充过程。
void ep_writedma(uint32_t dma, uint8_t epnum){ reg_diep_dma(epnum) = dma; reg_diep_ctl(epnum) |= (dep_ena_bit | dep_clear_nak);}如下是epena置位前后寄存器值,该位软件置位后传输完后硬件自动清零
diepint1 的bit0 xfercompl置位说明dma处理完了
bit9 bnaintr置位说明dma处理完后面没有描述符需要处理了。
diepdma1,diepdmab1变为了0x08100968和0x207047c8这个上一篇文章已经分析过了
dtxfsts1为0x00000300
dieptxfi 0x104+(i-1)*4
看到txfifo1的大小是0x300,也就是都发送完了txfifo中又都空闲了
dieptsiz1由0x13c5变为了0x3f7003b1.
epena之后
可以看到描述的状态也变为了dma done,长度也变为了0表示发送完了。
总结以上是in端点发送数据,dma和端点相关需要配置的寄存器,需要注意的是scatter/gather dma模式 一些状态,比如发送包数,长度放在了描述符中去了。
熟悉以上寄存器对编写驱动控制in端点发送数据至关重要,一些寄存器也可以给调试提供信息。
半导体巨头英特尔股价下跌再次引发关注
两、三年内, 5G 能带给我们带来什么新应用?
量化派AI应用平台可以带来什么好处
千视受邀参加AV/IT 2022高峰论坛 探讨“新”视听行业的创新与发展
sata接口分几种_sata接口分类
基于DWC2的USB驱动开发-IN端点发送相关的寄存器详解
内存市场对芯片制造设备公司的影响开始展现
磁盘阵列的分类
利用负压电荷泵和模拟开关构建DD视波放大器
成军6年的锤子科技理应迎来新一轮的成长,2019年罗永浩和他的锤子手机要“永锤不朽”
大连接时代,5G技术加速IOT步伐!
美国SSDI推出GaN FET 用于航空航天及电力电子系统
应用于人工智能和机器视觉的微型高速图像传感器RV400
政务机器人功能有哪些
DEKRA德凯为SVOLT蜂巢能源颁发全球首张动力电池CB证书
苹果模块化Mac Pro有望明年上市
欧司朗展示运用激光技术的前大灯 引领汽车照明风潮
永不相撞的“智能”汽车
变压器安装VR模拟实操培训系统为电力行业培训带来极大便利
新功能发布 | TSMaster诊断模块之系统变量的灵活应用