日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > atheros wifi 驅動分析

atheros wifi 驅動分析

來源:程序員人生   發布時間:2014-09-16 12:16:54 閱讀次數:2709次

Ar6003 驅動文檔摘要

 

 

1、  wmi : wireless module interface //無線模塊結構

2、  bmi : bootloader message interface

3、  htc : host target communications

4、  wps:wifi protected setup

5、  CS:connection services module

6、  STA:station

7、  AP:access point

 

 

Wireless application : 生產數據和消費數據

Wireless module interface (WMI):host target 之間的通信協議

Host/target communications (HTC): 發送和接收數據

Hardware interface (HIF) :調用硬件接口發送和接收數據(這里用的是sdio 接口)

Bootloader message interface (BMI):wifi芯片啟動時通信協議,可以下載bin文件到wifi芯片中。

 

 

Ar6000 wifi 驅動分析(AP 模式分析)

 

代碼執行的主要流程

//掛載sdio 驅動到內核和注冊網絡設備

module_init(__ar6000_init_module);

à__ar6000_init_module

àstatus = ar6000_init_module();

àstatus = HIFInit(&osdrvCallbacks);

à status = sdio_register_driver(&ar6k_driver);注冊sdio 驅動(這里直接調用的內核sdio協議棧)

à.probe = hifDeviceInserted, //執行驅動的probe 函數

àret = hifEnableFunc(device, func);

à kthread_create(async_task, //內核開了一個sdio 異步發送數據的進程

à taskFunc = startup_task; //開一個內核進程,執行startup_task 進程

àif ((osdrvCallbacks.deviceInsertedHandler(osdrvCallbacks.context,device)) != A_OK)//調用安裝wifi 設備的函數指針ar6000_android_avail_ev,這個函數是在android_module_init中注冊的。

àar6000_android_avail_ev

àret = ar6000_avail_ev_p(context, hif_handle)

àar6000_avail_ev//這個函數指針賦值賦的很曲折首先在ar6000_init_module(void)函數中賦給了osdrvCallbacks.deviceInsertedHandler = ar6000_avail_ev;然后在android_module_init(&osdrvCallbacks);ar6000_avail_ev_p = osdrvCallbacks->deviceInsertedHandler;賦給了ar6000_avail_ev_p;

à BMIInit();//開始啟動wifi模塊

àar->arHtcTarget = HTCCreate(ar->arHifDevice,&htcInfo);//創建htc ,關閉中斷

à status = (ar6000_init(dev)==0) ? A_OK : A_ERROR; // 初始化網絡設備

à (BMIDone(ar->arHifDevice) != A_OK))//bmi 啟動完成

à  status = HTCStart(ar->arHtcTarget);//啟動htc ,開啟中斷

àstatus = DevUnmaskInterrupts(&target->Device);//開啟中斷, 注冊中斷處理函數

àHIFUnMaskInterrupt(pDev->HIFDevice);//注冊中斷處理函數

àret = sdio_claim_irq(device->func, hifIRQHandler);//注冊中斷處理函數,中斷后就會調用hifIRQHandler 這個處理函數

à if (register_netdev(dev)) //向內核注冊網絡設備,到此初始化完成。

 

//產生中斷后的代碼流程

àhifIRQHandler(struct sdio_func *func) //中斷處理函數 (hif.c)

àstatus = device->htcCallbacks.dsrHandler(device->htcCallbacks.context); //設備處理函數的函數指針

àA_STATUS  DevDsrHandler(void *context);這函數是在創建htc HTCCreate 函數中填充的:HTCCreate―>DevSetupàhtcCallbacks.dsrHandler = DevDsrHandler;(ar6k_events.c)

àstatus = ProcessPendingIRQs(pDev, &done, &asyncProc);//處理未決事件的函數,在這里會循環處理(ar6k_events.c)

àstatus = pDev->MessagePendingCallback();這個函數指針也是在HTCCreate 中填充的target->Device.MessagePendingCallback = HTCRecvMessagePendingHandler;(htc_recv.c)

àHTCRecvMessagePendingHandler();

à DO_RCV_COMPLETION(pEndpoint,&container);

à DoRecvCompletion();

à pEndpoint->EpCallBacks.EpRecv(pEndpoint->EpCallBacks.pContext, pPacket);//這個函數指針是在ar6000_init 中填充的connect.EpCallbacks.EpRecv = ar6000_rx; ar6000_rx 是一個非常重要的函數。

à ar6000_rx(void *Context, HTC_PACKET *pPacket)

 

//數據發送流程

à ar6000_data_tx(struct sk_buff *skb, struct net_device *dev)

à HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);

à return HTCSendPktsMultiple(HTCHandle, &queue);

à HTCTrySend(target, pEndpoint, pPktQueue);

à HTCIssueSend(target, pPacket);

à status = DevSendPacket(&target->Device,

à status = HIFReadWrite(pDev->HIFDevice, //傳給了sido 總線

à AddToAsyncList(device, busrequest);//把要發送的數據包加入異步發送隊列

à up(&device->sem_async); //獲取信號量,用內核進程進行數據發送

à static int async_task(void *param) //發送數據

à __HIFReadWrite();//發送數據

à sdio_writesb();sdio_memcpy_toio();sdio_readsb();sdio_memcpy_fromio();

à down_interruptible(&busrequest->sem_req) != 0 //釋放信號量

 

 

//中斷發送或,接收流程

àHTCRecvMessagePendingHandler

à status = HTCIssueRecv(target, pPacket);//異步接收數據包

à status = HIFReadWrite(pDev->HIFDevice, //命令傳給sdio 總線

à與發送流程相同

//sta 連接流程

à ar6000_rx ();收到連接的命令,此時的ar->arControlEp=ept=1

à wmi_control_rx(arPriv->arWmi, skb)//解析命令

à case (WMI_CONNECT_EVENTID): //連接命令

à status = wmi_connect_event_rx(wmip, datap, len);

à A_WMI_CONNECT_EVENT(wmip->wmi_devt, ev);

à ar6000_connect_event((devt), (pEvt));

à wireless_send_event(arPriv->arNetDev, IWEVREGISTERED, &wrqu, NULL); //向網絡層發送事件 wext-core.c

àskb_queue_tail(&dev_net(dev)->wext_nlevents, skb); //wext-core.c

----------------------------------經過網絡層的處理--------------------------------------------------------------------

àsock_ioctl(struct file *file, unsigned cmd, unsigned long arg)//  net/socket.c

àerr = dev_ioctl(net, cmd, argp); // net/core/dev.c

àreturn wext_handle_ioctl(net, &ifr, cmd, arg); // net/wireless/wext-core.c

àret = wext_ioctl_dispatch(net, ifr, cmd, &info,

                                       ioctl_standard_call,

                                       ioctl_private_call); // net/wireless/wext-core.c

àret = wireless_process_ioctl(net, ifr, cmd, info, standard, private); //net/wireless/wext-core.c

à return dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd);//這個是在注冊網絡設備注冊的函數.ndo_do_ioctl           = ar6000_ioctl,

---------------------------網絡層調用驅動層的函數----------------------------------------

à int ar6000_ioctl();  // ioctl.c

à case IEEE80211_IOCTL_SETKEY:  //ioctl.c

à ar6000_ioctl_setkey(arPriv, &keydata); //ioctl.c

à status = ar6000_sendkey(arPriv, ik, keyUsage); //ioctl.c

à status = wmi_addKey_cmd()

à status = wmi_cmd_send(wmip, osbuf, WMI_ADD_CIPHER_KEY_CMDID, sync_flag);

 

 

 

//數據傳輸流程

à ar6000_rx ();收到連接的數據,此時ept=2

à ar6000_deliver_frames_to_nw_stack((void *) arPriv->arNetDev, (void *)skb);

à A_NETIF_RX_NI(skb);

ànetif_rx_ni(skb) //將數據傳給ip

 

 

Hostapd 設置ssid

àint main(int argc, char *argv[]);  //main.c

àinterfaces.iface[i] = hostapd_interface_init(&interfaces, //main.c

àhostapd_setup_interface(iface)) {  //main.c

àret = setup_interface(iface); //hostapd.c

àreturn hostapd_setup_interface_complete(iface, 0); //hostapd.c

àif (hostapd_driver_commit(hapd) < 0) { // ap_drv_ops.c

àreturn hapd->driver->commit(hapd->drv_priv);//driver_ar6000.c 中賦值的.commit             = ar6000_commit

àar6000_commit(void *priv)//driver_ar6000.c

----------------------從應用層通過ioctl 進入驅動層---------------------------------------------------------------

àif (ioctl(drv->ioctl_sock, SIOCSIWCOMMIT, &iwr) < 0) { //wireless_ext.c 中賦值的(iw_handler) ar6000_ioctl_siwcommit,

àar6000_ioctl_siwcommit(struct net_device *dev, // wireless_ext.c

àar6000_ap_mode_profile_commit(arPriv); //ar6000_dr.c

àwmi_ap_profile_commit(arPriv->arWmi, &p); //wmi.c

àstatus = wmi_cmd_send(wmip, osbuf, WMI_AP_CONFIG_COMMIT_CMDID, NO_SYNC_WMIFLAG); //wmi.c

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩免费小视频 | 久久久免费精品 | 蜜桃视频一区二区三区 | 二区在线观看 | 久久久久久国产精品 | 欧美精品网站 | 久久麻豆 | a级片在线免费观看 | 久久99精品国产一区二区三区 | 在线3p | 大黑人交xxxxxhd性爽 | 国产一区二区三区视频 | 国产一区二区久久 | 国产高清精品一区 | 超碰三级| 国产精品麻豆视频 | 欧美日韩在线播放 | 国产综合久久 | 九九热视频在线观看 | www.日韩.com| 国产精品一区二区三区免费视频 | 久久久综合亚洲91久久98 | 成人黄色毛片 | 九九热久久久99国产盗摄蜜臀 | 国产性生活大片 | 亚洲 自拍 另类 欧美 丝袜 | 在线视频观看91 | 欧美色精品 | 日韩精品视频国产 | 婷婷影视| 成年人在线免费观看 | 日韩91| 精品久久久久久久久久久 | 91成人免费看 | 精品久久久久久久人人人人传媒 | 日本福利在线观看 | 爱情岛论坛首页永久网址 | 亚洲精品成人av | 日韩欧美一区二区三区在线视频 | 亚洲黄色片免费观看 | 91久久久久久久一区二区 |