第一范文网 - 专业文章范例文档资料分享平台

SDIO - WIFI之我对WIFI了解

说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

WIFI 分析

- 9 -

WIFI 分析

图2

总的一句话就是,我们已经完成了设备驱动的注册,注册最后又返回执行if_sdio_probe()函数,那么,我们跟着if_sdio_probe()函数看看(部分代码):

static int if_sdio_probe(struct sdio_func *func,const struct sdio_device_id *id)

{ struct mmc_host *host = func->card->host; //分配了一个描述mmc_host的结构体 /* struct mmc_host { struct device *parent; struct device class_dev; int index; const struct mmc_host_ops *ops; . . . }*/

switch (card->model) { case MODEL_8385: card->scratch_reg = IF_SDIO_SCRATCH_OLD; break;

case MODEL_8686: card->scratch_reg = IF_SDIO_SCRATCH; //选择wifi的类型 我们用的是8686 break;

case MODEL_8688:

default: /* for newer chipsets */ card->scratch_reg = IF_SDIO_FW_STATUS; break; }

/*初始化一个工作队列,延迟执行*/

INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);

//初步猜测if_sdio_host_to_card_worker的作用是启动固件 发送使用 //接着就调用if_sdio_host_to_card 发送使用

sdio_claim_host(func);/*检测当前是否被占用*/

ret = sdio_enable_func(func); //使能sdio函数(可能跟SD卡驱动有关系) if (ret) goto release;

- 10 -

WIFI 分析

ret = sdio_claim_irq(func, if_sdio_interrupt); //当接收到数据时会产生这个中断,中断函数if_sdio_interrupt(后面单独分析) priv = lbs_add_card(card, &func->dev); priv->hw_host_to_card = if_sdio_host_to_card; //当执行主线程priv->main_thread = kthread_run(lbs_thread, dev, \ //调用lbs_thread()后就会进入回调函数if_sdio_host_to_card(发送时用) priv->enter_deep_sleep = if_sdio_enter_deep_sleep; priv->exit_deep_sleep = if_sdio_exit_deep_sleep; priv->reset_deep_sleep_wakeup = if_sdio_reset_deep_sleep_wakeup; ret = lbs_start_card(priv);//有东西看 请进please }

***********************分析sdio_claim_irq(func, if_sdio_interrupt)****************

1、 ret = sdio_card_irq_get(func->card);

2、 host->sdio_irq_thread =kthread_run(sdio_irq_thread, host, \

mmc_hostname(host)); //进入sdio_irq_thread

3、 ret = process_sdio_pending_irqs(host->card); 4、 终于进入我们想知道的函数中:

static int process_sdio_pending_irqs(struct mmc_card *card) {

//遍历读取相关寄存器的数据,如果有中断,则返回执行驱动的中断处理函数 count = 0; for (i = 1; i <= 7; i++) { if (pending & (1 << i)) { struct sdio_func *func = card->sdio_func[i - 1]; if (!func) { printk(KERN_WARNING \ \ mmc_card_id(card)); ret = -EINVAL; } else if (func->irq_handler) { func->irq_handler(func);//调用SD卡驱动的中断处理函数 count++; } else { } }

***************************sdio_claim_irq分析完毕*******************

- 11 -

WIFI 分析

*********************** lbs_start_card(priv)分析***********************

struct lbs_private *lbs_add_card(void *card, struct device *dmdev) { /*调用函数alloc_netdev()函数分配了一个mesh_dev网络设备*/ dev = alloc_netdev(0, \ if (!dev) { dev_err(dmdev, \ goto err_adapter; } /*设置了该网卡设备的操作函数,如设置MAC地址等*/ dev->netdev_ops = &lbs_netdev_ops; lbs_deb_thread(\ init_waitqueue_head(&priv->waitq); priv->main_thread = kthread_run(lbs_thread, dev, \ //进入线程lbs_thread 这个线程被添加到prv->waitq队列中,然后休眠 //只有被唤醒才会被执行 /*在main.c 和 mesh.c (不知道是那个)都注册了

.ndo_start_xmit= lbs_hard_start_xmit 当有数据发送时,执行dev_queue_xmit()函数,接着调用

lbs_hard_start_xmit()函数 唤醒主线程priv->main_thread(),进入lbs_thread()函数*/ INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);

//这个工作队列很让人纠结,据说是实现无线网卡的热点扫描,跟进去里面太复杂了,差点出不来 }

此处执行完毕会进入线程lbs_thread,让我们接着进去:

static int lbs_thread(void *data) { //处理待处理的命令 lbs_process_command_response(priv, priv->resp_buf[resp_idx], priv->resp_len[resp_idx]); spin_lock_irq(&priv->driver_lock); //处理硬件事件 如拔卡,在Cmdresp.c中处理命令 lbs_process_event(priv, event); spin_lock_irq(&priv->driver_lock); //当有数据发送时,执行此函数发送数据

- 12 -

搜索更多关于: SDIO - WIFI之我对WIFI了解 的文档
SDIO - WIFI之我对WIFI了解.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4yujc9916599g5n14bz2_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top