• 晚上读内核代码


    最近因为要解决一个bug,需要在内核的f_hid.c里面做一些适配,需要把这部分代码研究透彻。

    在这几天之前我是根本不知道什么是In端点,Out端点,以及什么是endpoint 0的,而且最近的一段时间,我一直是在写应用方面的代码,也是趁着这个机会,好好拜读这部分。

    ——

    HID 1.0之前,是没有什么OUT 端点的,都是用端点0来进行数据传输,不过端点0有一个问题,他的最大传输包的大小有限制。

    683d9771f09980651317993e1aa40ff4.jpeg

    谢谢我飞哥给的截图

    之后,就有一个大佬在原来的内核代码上面做了一部分修改,在原来的enpoint 0 上加了一个OUT端点,意思就是说,本来从深圳到广州有绿皮火车,但是绿皮火车一次只能装下20个人,有一个人就发明了高铁,高铁一次可以装200个人。

    这个提交的链接

    https://github.com/torvalds/linux/commit/99c515005857ff7d6cd5c2ba272ccab5dc0ea648

    83e8cf3fb983394b6523d12fcaea8b68.png

    这个修改的commit里面说明了修改的原因,比如说使用端点0不能同步到字符设备,而且端点0的使用可能会导致数据丢失,所以加了一个OUT interrupt endpoint接口。

    重点来了

    并且这个补丁还会继续处理SET_REPORT  接口请求事件。

    ——

    好了,上面是这个文件的第一次修改,我们的代码里面也是用的原厂的SDK代码修改,但是这个修改有一个问题,实际上端点0的SET REPORT并没有正确请求,这是一个问题,但是这个问题不是Linux 代码的问题,应该是芯片原厂移植过来后出现的问题。

    之后,又有一个大佬重新对这个内核代码进行了改造

    提交的commit链接如下

    https://github.com/torvalds/linux/commit/d7428bc26fc767942c38d74b80299bcd4f01e7cb

    他的修改的主要是增加了配置选项,就是可以软件配置使用OUT endpoint还是端点0,这主要是不同的产品定义可能需求会不同。

    这个改造的原因是什么呢?

    0cfe87f1a89ac6d2dee7531909eaae77.png

    有些主机设备,我们说的主机指的是USB的HOST设备,它不支持OUT endpoint 。

    还有一些苹果产品,他们天然就不能使用OUT端点来传输。

    其他巴拉巴拉的一些大家就自己看吧。

    ——

    截图给大家看看什么是端点0和OUT endpoint

    8347634af8dcb0c8c0a4532f5b419109.jpeg

    ——

    写了很多,还没有说到我要改造什么,其实就是对这部分机制熟悉了,要修改掉因为SET REPORT导致的一个bug。

    这也是一些看代码的思路吧,内核是分成很多很多模块的,大家想看哪些模块,去看看commit,去看看代码,其实挺有意思的。

    不过里面的一些命名并不是很清晰明了,比如IN这个东西,太简洁了,不是做USB的人估计很难明白,这些还有,要是去调试HID描述符,就知道那是太要绕脑子了。

    好了,有USB经验的,欢迎评论!

    fcd407cf442dfd580b7ce89e1c481de9.jpeg

    0acd101879dce5bdfe89d07852809d38.png

  • 相关阅读:
    实战一次完整的博彩渗透测试
    大厂linux运维面试题库(一)
    Kylin ext3/4 xfs手动扩容根分区
    Kubernetes(k8s)的流量负载组件Ingress安装与使用
    WPF Interaction
    ElementUI浅尝辄止32:NavMenu 导航菜单
    继承(三) —— 继承中的作用域(父类成员 与 子类成员同名)
    1688获得搜索词推荐 API分享(item_search_suggest)
    C++基础学习
    MailStore Server标准的电子邮件归档
  • 原文地址:https://blog.csdn.net/weiqifa0/article/details/126416254