4G上网卡一般为双对外通讯口,一个是串口、一个是USB。
但是基于串口的常用波特率为115200,速度过于底下,所以大多使用USB。
1)一般来说常用ppp拨号方式,ppp拨号方式分为应用层pppd与驱动层pppk。
驱动层pppk通讯主要接口为ppp_async_send与tty->ldisc->receive_buf,并调用tty驱动,而tty驱动转为USB则需要针对GSM/CDMA的usb_wwan、option驱动,而usb_wwan驱动又依赖于usb-serial基础转换。此时驱动已经将通讯转换为USB。
应用层pppd主要以option脚本、chat脚本、ppp应用,进行发送AT命令,拨号上网。
2)当不使用ppp拨号方式,而是使用NDIS拨号,那么ppp软件没有了,就需要替代他的东西,这时候,需要三样东西:Rmnet驱动 + dhclient + minicom/echo命令。当然Rmnet驱动也是USB总线驱动。而由于发送AT命令是以串口发送,所以依旧需要usb-serial、usb_wwan、option驱动进行串口USB转换。
值此特别声明:USB设备驱动架构:分为HID、CDC、mass storage,而Rmnet是非标准的Rmnet驱动。NDIS是windows提出的网络驱动接口规范,linux下并没有。
以下就是USB总线方式的Rmnet驱动流程:
- 注册驱动 :module_init(NDIS_Init);
- 创建类 :Rmnet_class= class_create( THIS_MODULE, "Rmnet_class" );
- 注册USB设备:usb_register(&usb_drv_Rmnet);
- 定义 :static struct usb_driver usb_drv_Rmnet{...};
- 探针函数
int Rmnet_Probe( struct usb_interface * usb_interf, const struct usb_device_id * usb_devid)
- 获取端点信息
- cur_altsetting->desc.bInterfaceNumber
- cur_altsetting->desc.bNumEndpoints
- cur_altsetting->endpoint
- 获取端点信息
未完待续....