问题背景:
上位机是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 驱动,ecmctrl的interfacenumber是0,data的interfacenumber是1。并且linux重启命令,也才能发觉cdc是一个具有主从结构的设备,主是ctrl,从是data
probe函数的主要走的逻辑如上图所示,其走到bind函数处时会步入到cdc_ether.c中的usbnet_generic_cdc_bind函数,且可以从log中见到,probe函数获得的设备的bInterfaceNumber的值是0,也就是ctrl这个interface
但是可以从log中见到,只走了一遍probe函数和bind函数,就可以实现将ctrl和data都辨识了。
接出来来看bind函数的主干逻辑:
可以见到对于L716-CN-10,中间有一堆的各类厂商的设备特殊判定都没有走(上图中linux伊甸园论坛,我将多余的判定全部删掉了),而是直接走到while循环中linux usb cdc 驱动,非常要注意的是CDC_UNION这个分支:
用usb_ifnum_to_if函数直接通过ctrl把data也获取到了
在bind函数最后,激活data:
至此,cdc的两个interface,ctrl和data就都被测量到了。