30天自制操作系统吧 关注:1,381贴子:4,825
  • 10回复贴,共1

基于UHCI的USB协议挑战记录

只看楼主收藏回复

2024.10.13
我真的是吃饱了撑的,妄图上来就用uhci挑战USB
协议,光是uhci需要手动分配生成令牌包都已经搞得够呛了。基于之前写的uhci驱动花了两天时间终于(也许?)把uhci负责的部分搞定了(约一半都被重写了)。
好不容易搞定,手搓了一个setup令牌包挂framelist上,结果qemu log显示usb_uhci_packet_complete_error,检查了uhci控制器设置的状态位是crc_timeout_error,我直接满头问号,crc不是硬件计算的吗,咋还能timeout呢???


IP属地:江苏来自Android客户端1楼2024-10-13 03:32回复
    2024.10.13
    今天花了1天读Linux和prettyOS的USB相关代码,prettyOS结构较简单,Linux则是权威参考。以及又重写了一部分uhci驱动(逐渐掏空.jpg
    没有实质性的进展


    IP属地:江苏来自Android客户端2楼2024-10-14 00:11
    回复
      最上面打错了,应该是10.12


      IP属地:江苏来自Android客户端3楼2024-10-14 00:13
      回复
        2024.10.14
        今天是个好日子~
        获取根hub的描述信息成功~
        昨天的报错似乎是因为我原先写的uhci驱动重置完主机控制器后没有重置和使能USB端口(话说我原先写的驱动咋全都是坑)
        解决了之后数据包发送成功了,但是报stall错误,似乎是因为格式不对被拒收了,问过chatGPT才知道原来setup事务的3个packet都要配置好td挂到framelist上,而且有一个packet配置有误就拒收。
        中间还发现td的link字段中还有一个位用来选择是深度优先搜索还是广度优先搜索(死去的oi记忆正在攻击我),我是把同一个事务的packet都挂到同一个qh下,所以自然要选深度优先搜索
        未配置的情况下设备默认地址都是0,目前已经通过地址0获取到了根hub的描述符,下一步就要给它配置地址了
        目前的USB相关代码耦合度还是很高,而且强绑定uhci,等设备初始化部分搞明白了再解耦吧
        再附一张qemu的USB相关log图




        IP属地:江苏来自Android客户端4楼2024-10-15 01:05
        收起回复
          10.15
          今天把完整的设备描述符给读了出来(包括字符串描述符)

          然后尝试给设备设置了地址


          IP属地:江苏5楼2024-10-16 00:02
          回复
            10.16
            今天整理了一下代码,稍微做了一下解耦
            然后尝试初始化所有设备(包括Hub),调试过程中发现get_configuration_descriptor和get_configuration是两个东西,我参考的流程是先get_configuration_descriptor再set_configuration,然后再设置设备地址,因为名字太像搞混了,折腾了半个晚上才发现这个问题
            通过Configuration Descriptor能找到到所有的像Interface Descriptor和Endpoint Descriptor这些描述了设备具体功能的描述符
            最后附上获取到的Port 1(USB键盘)和Port 2(USB Hub)的其他描述符信息(其实还有一个HID Descriptor,因为不知道具体结构就没管)




            IP属地:江苏6楼2024-10-17 00:32
            回复
              10.17
              今天去凑英伟达开发者日的热闹了,所以仅仅是把昨天没写完的初始化Hub端口的部分搞定了,现在已经能够重置和枚举到所有UHCI下的设备了


              IP属地:江苏7楼2024-10-18 00:18
              收起回复