多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > 互聯(lián)網(wǎng) > atheros wifi 驅(qū)動(dòng)分析

atheros wifi 驅(qū)動(dòng)分析

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-09-16 12:16:54 閱讀次數(shù):2703次

Ar6003 驅(qū)動(dòng)文檔摘要

 

 

1、  wmi : wireless module interface //無(wú)線模塊結(jié)構(gòu)

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 : 生產(chǎn)數(shù)據(jù)和消費(fèi)數(shù)據(jù)

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

Host/target communications (HTC): 發(fā)送和接收數(shù)據(jù)

Hardware interface (HIF) :調(diào)用硬件接口發(fā)送和接收數(shù)據(jù)(這里用的是sdio 接口)

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

 

 

Ar6000 wifi 驅(qū)動(dòng)分析(AP 模式分析)

 

代碼執(zhí)行的主要流程

//掛載sdio 驅(qū)動(dòng)到內(nèi)核和注冊(cè)網(wǎng)絡(luò)設(shè)備

module_init(__ar6000_init_module);

à__ar6000_init_module

àstatus = ar6000_init_module();

àstatus = HIFInit(&osdrvCallbacks);

à status = sdio_register_driver(&ar6k_driver);注冊(cè)sdio 驅(qū)動(dòng)(這里直接調(diào)用的內(nèi)核sdio協(xié)議棧)

à.probe = hifDeviceInserted, //執(zhí)行驅(qū)動(dòng)的probe 函數(shù)

àret = hifEnableFunc(device, func);

à kthread_create(async_task, //內(nèi)核開(kāi)了一個(gè)sdio 異步發(fā)送數(shù)據(jù)的進(jìn)程

à taskFunc = startup_task; //開(kāi)一個(gè)內(nèi)核進(jìn)程,執(zhí)行startup_task 進(jìn)程

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

àar6000_android_avail_ev

àret = ar6000_avail_ev_p(context, hif_handle)

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

à BMIInit();//開(kāi)始啟動(dòng)wifi模塊

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

à status = (ar6000_init(dev)==0) ? A_OK : A_ERROR; // 初始化網(wǎng)絡(luò)設(shè)備

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

à  status = HTCStart(ar->arHtcTarget);//啟動(dòng)htc ,開(kāi)啟中斷

àstatus = DevUnmaskInterrupts(&target->Device);//開(kāi)啟中斷, 注冊(cè)中斷處理函數(shù)

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

àret = sdio_claim_irq(device->func, hifIRQHandler);//注冊(cè)中斷處理函數(shù),中斷后就會(huì)調(diào)用hifIRQHandler 這個(gè)處理函數(shù)

à if (register_netdev(dev)) //向內(nèi)核注冊(cè)網(wǎng)絡(luò)設(shè)備,到此初始化完成。

 

//產(chǎn)生中斷后的代碼流程

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

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

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

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

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

àHTCRecvMessagePendingHandler();

à DO_RCV_COMPLETION(pEndpoint,&container);

à DoRecvCompletion();

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

à ar6000_rx(void *Context, HTC_PACKET *pPacket)

 

//數(shù)據(jù)發(fā)送流程

à 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);//把要發(fā)送的數(shù)據(jù)包加入異步發(fā)送隊(duì)列

à up(&device->sem_async); //獲取信號(hào)量,用內(nèi)核進(jìn)程進(jìn)行數(shù)據(jù)發(fā)送

à static int async_task(void *param) //發(fā)送數(shù)據(jù)

à __HIFReadWrite();//發(fā)送數(shù)據(jù)

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

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

 

 

//中斷發(fā)送或,接收流程

àHTCRecvMessagePendingHandler

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

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

à與發(fā)送流程相同

//sta 連接流程

à ar6000_rx ();收到連接的命令,此時(shí)的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); //向網(wǎng)絡(luò)層發(fā)送事件 wext-core.c

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

----------------------------------經(jīng)過(guò)網(wǎng)絡(luò)層的處理--------------------------------------------------------------------

à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);//這個(gè)是在注冊(cè)網(wǎng)絡(luò)設(shè)備注冊(cè)的函數(shù).ndo_do_ioctl           = ar6000_ioctl,

---------------------------網(wǎng)絡(luò)層調(diào)用驅(qū)動(dòng)層的函數(shù)----------------------------------------

à 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);

 

 

 

//數(shù)據(jù)傳輸流程

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

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

à A_NETIF_RX_NI(skb);

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

 

 

Hostapd 設(shè)置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

----------------------從應(yīng)用層通過(guò)ioctl 進(jìn)入驅(qū)動(dòng)層---------------------------------------------------------------

à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

 

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美一级欧美一级毛片 | 日韩欧美亚洲一区 | 午夜影院免费 | 久久久影院亚洲精品 | 国产理论视频在线观看 | 日本成在线人视频免费视频 | 久久新网址 | 成人精品一区二区激情 | 成人亚洲欧美日韩中文字幕 | 日韩欧美久久一区二区 | 日韩久久精品一区二区三区 | 国产亚洲综合成人91精品 | 国产亚洲影院 | ady久久 | 高清免费a级在线观看国产 高清免费国产在线观看 | 99久久精品国产一区二区三区 | 一本大道香蕉大无线视频 | 99久久精品毛片免费播放 | 国产成人系列 | 国产一区二区高清在线 | 欧美 xx性 在线 | 黄网站大全免费 | 亚洲激情专区 | 亚洲欧美天堂网 | 国产精品国产三级国产专区5o | 中文字幕在线日本 | 中文字幕日韩一区 | 亚洲图片校园春色 | 欧美三级小视频 | 禁18在线观看 | 欧洲美女a视频一级毛片 | 日韩精品福利 | 日本中文字幕在线看 | 国产v精品成人免费视频400条 | 在线视频一区二区三区四区 | 欧美高清视频手机在在线 | 亚洲国产精品yw在线观看 | 亚洲一区欧美日韩 | 波多野结衣一级视频 | 欧美深夜在线 | 99视频精品全部免费免费观 |