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
- 獲取端點信息
未完待續....