CH545芯片 4主机-4USBX设备示例

请问在USBX复合设备使用时,USB_CTRL里对芯片设备模式的配置也需要设置成设备模式嘛?如果是,那如何使用芯片同时实现主机和设备端通信,从而实现KVM功能

image.png

另外还是再求一次USBX的示例代码,芯片手册中对USB配置和USBX的配置没有很好的区分开来,根据芯片手册从头配置 USBX需要一步步配置整个流程相当麻烦。哪怕没有具体的中断处理或者按键模拟示例,给个初始化配置的示例代码也好啊,在这边调了三天了,话说你们发布产品前总也有套代码进行过芯片USBX功能的测试的撒,为什么会出现没有示例代码的情况?

CH545 完整的USB示例代码(4*USB HOST+ 4*USBX)正在优化中,预计周三可以提供。

到时候直接更新在这里,还请耐心等候一下下。


好的,十分感谢!


附件中是CH545 ROOT-HUB 4口主机+ USBX示例程序

icon_rar.gifCH545_4Hosts_4USBXDevices.zip



非常感谢,功能实现的比较完整了,最重要的是代码风格变了好多,观看体验max!


您好,感谢您之前发送的CH545参考例程,有几个部分还是没有很好的理解,能麻烦您帮忙再解答一下吗?

①地址偏移到底应该如何理解,在根据例程修改了我自己的程序的寄存器配置和地址配置,在变量前加上指针p,在USBX_SEL中添加了对XRAM的偏移配置后,成功实现了PC和设备的通信。但对地址偏移的含义还是很迷糊,目前我只是可以按照例程配置单个设备,但对于多个设备,尤其是通过地址偏移来实现对X0、X1、X2等复合设备复用一组函数来初始化和配置,还是没能完全理解。ps.好像对USBX0的自动偏移的描述里,还有介绍对于USBX0,会自动偏移到USBX1-3,这是什么意思?是USBX0无法使用嘛?

②HUB的中断操作是什么意思?

USBX_ThisHub_EP1IntUp、USBX_OneHub_EP1IntUp、USBX_AllHub_EP1IntUp三个函数分别都有什么作用?hub需要中断上传什么数据嘛?

如果在配置了X0、X1、X2三个复合设备的D0、D1、D2的总计3*3=9个设备,需要对其中X1D0号设备进行总线复位,应该如何调用哪个函数来操作HUB1或者X1D0设备来实现单个设备的总线复位,而不是直接复位整个HUB1上的三个设备?上传HUB中断通知是对整个HUB上所有端点进行操作嘛?



1、因为4个USBX结构完全一样,也就是说代码完全通用(至少是通用的枚举阶段吧)。按照常规理解,每个USBX都会有独立的寄存器,这个会增加代码复杂程度。自动偏移带来的好处就是可以直接使用一套代码(不是绝对),只会在CPU对端点缓冲区取、写数据时需要区分一下当前处于哪一个USBX。


或者说CH545比较典型的应用场景KVM,目的是将4个主机口接的USB设备(通常就是键盘+鼠标),实现分时控制4台电脑主机,这种应用场景下,其实4个USBX干的事情都是一样的,所以代码具有通用性,可以真的共用一套应用代码(目前示例程序就做了差不多的事情)。


另一种就是每个USBX下的每个设备都是不同类别,不同功能的设备,那真的就是一个设备一套代码。


看实际的“USBX_Endpx_UpData()”函数感觉会比较好理解这个功能,比较典型。


2、3个函数,最底层其实都是调用了“USBX_ThisHub_EP1IntUp”,作用是通知操作HUB的USB主机(此处通常就是电脑了),HUB下的某个端口的设备连接状态发生了变化,这个是HUB协议方面的处理。


在示例代码中(前面提到做了类似将CH545自身USB HOST接口的设备做了类似透传的功能),是判断到CH545自身USB主机接口下接入的设备连接状态发生变化,会调用这三个函数。


总线复位状态的实际发送者是电脑,发送的最终对象是HUB下的某个设备,这个状态是直接发送到HUB下的设备的,不需要实际的去以HUB角度处理(芯片内部自动处理了真实的HUB上下游的转发)。

实际所有的处理都是”USBX_DeviceInterrupt()“这个函数处理的,且4个USBX都是调用这个函数,不难发现这个函数的架构其实和CH552的USB中断服务是类似的。这个函数内部其实是通过switch判断MASK_UX_DEV_ID域,分别处理每个设备的。


总结,伪代码体现,两个switch嵌套,实现4*4总共16个设备的管理:

image.png


好的,目前我希望通过地址偏移来实现设备的灵活初始化,在主机端检测到新设备后,在设备端的USBX设备内进行一个新USBX设备的初始化。

我希望通过USBX_SEL选取对应设备进行地址偏移,来进行函数的复用。

但目前似乎没能正常实现。在中断处理中,分析令牌和端点的操作:

switch(pX0D0_STATUS & ( bUXS_SETUP_ACT | MASK_UXS_TOKEN | MASK_UXS_ENDP ))? ? ?// 分析操作令牌和端点号

得到的是0x3D,没有进入任何setup包或者IN/OUT包的处理流程

(3D应该是端点5,PID为FREE,接受到了SETUP请问包,但我只配置了0-3端点的使能啊,而且刚刚上电不应该先RESET或者发来端口0设备描述符的setup请求嘛?请问有哪里需要修改配置的来实现自动的地址偏移?)

image.png


当寄存器返回0X3D时,bUXS_SETUP_ACT已经置位。此时已经有一个SETUP包传输完成,而不需要关心别的比特位。

手册中还指出了一种特殊情况,可能同时会存在收到SETUP包和OUT/IN包的状态,除此之外,只需要关心bUXS_SETUP_ACT这单一比特位。



只有登录才能回复,可以选择微信账号登录