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