问题背景:

上位机是Linux2.6.32.21,希望使用fibocomL716-CN-10模组实现USB网卡。本文是对于此现象下cdc_ether.c驱动流程的剖析。

关于此次调试,我写的其他笔记链接如下:

编译ECM驱动并添加log_Philip.Lau的博客-CSDN博客

网上还有一个很详尽的文章:

linuxcdc_ether_JDSH0224的博客-CSDN博客_cdc_ether

首先ecm有两个interface,分别是ecmctrl和ecmdata,当联接成功时,可以使用cat/sys/kernel/debug/usb/devices听到有两个设备,或则使用lsusb-v也就能看见两个设备:

linux usb cdc 驱动_驱动总裁_驱动人生

linux usb cdc 驱动_驱动人生_驱动总裁

从上图中可以见到一些信息linux usb cdc 驱动,ecmctrl的interfacenumber是0,data的interfacenumber是1。并且linux重启命令,也才能发觉cdc是一个具有主从结构的设备,主是ctrl,从是data

驱动总裁_驱动人生_linux usb cdc 驱动

驱动人生_驱动总裁_linux usb cdc 驱动

probe函数的主要走的逻辑如上图所示,其走到bind函数处时会步入到cdc_ether.c中的usbnet_generic_cdc_bind函数,且可以从log中见到,probe函数获得的设备的bInterfaceNumber的值是0,也就是ctrl这个interface

但是可以从log中见到,只走了一遍probe函数和bind函数,就可以实现将ctrl和data都辨识了。

接出来来看bind函数的主干逻辑:

驱动总裁_驱动人生_linux usb cdc 驱动

可以见到对于L716-CN-10,中间有一堆的各类厂商的设备特殊判定都没有走(上图中linux伊甸园论坛,我将多余的判定全部删掉了),而是直接走到while循环中linux usb cdc 驱动,非常要注意的是CDC_UNION这个分支:

驱动总裁_驱动人生_linux usb cdc 驱动

驱动人生_驱动总裁_linux usb cdc 驱动

用usb_ifnum_to_if函数直接通过ctrl把data也获取到了

在bind函数最后,激活data:

驱动总裁_驱动人生_linux usb cdc 驱动

至此,cdc的两个interface,ctrl和data就都被测量到了。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复