分类: LINUX
2010-05-15 15:12:12
目录
内核:
2.6.21
.这 里主要讲的是我对WIFI驱动的 理解。
因为将要负责WIFI驱动,所以就开始了WIFI驱动的学习,主要分析了WIFI驱动的初始化,数据的发送流程以及和电源管理相关的部分。
通常用户的做法就是打开一 个socket, 调用一个ioctl, 等待消息返回,收到消息后继续做下面的事情,然后又等待内核消息的返回,如此循环。
比如我们的系统的流程就是 这样的:
图4.1 wifi模 块初始化
这里主要的工作就是注册mmc driver, 注册回调函数,包括电源管理的,包括设备添加的,当然还有一些硬件初始化;
这里最重要的是wlan_add_card这 个函数做了很多事情,我把我没有分析的代码都略过了:
图4.2wlan_add_card的 逻辑
这里创建了两个线程,一个用来 处理基本的输入输出,那就是wlan_service_main_thread,一个用来负责重新连接AP(当自动断开的时候),那就是wlan_reassociation_thread
还做了一些firmware的 初始化;然后就是注册mmc设备,取 得端口号;接着就是注册一个网络设备,用来供上层访问,这时候就可以通过ifconfig来 看到输出了,比如是eth0;最后 是一些用来使蓝牙和wifi能够共 存的代码;
图5.1发送数 据的触发
数据的发送请求从tcp/ip层 传到了这里,于是通过唤醒WIFI的主线 程的处理函数来发送具体的数据请求;
下面看主线程里面的数据发送:
可见最后数据是通过mmc总线发 送到了wifi模 组了,而且开始调度下一次的数据发送,至此,数据的发送过程已经分析完了,下面是ioctl的 调用逻辑
之所以要分析这个,是因为 上层和WIFI驱 动打交道的方式,多半是通过ioctl的方 式进行的,所以…
看看它的调用逻辑:
可以看到WIFI模块 对ioctl的 处理非常复杂,主要是要处理许多标准的调用,也要处理一些私有的调用;后面还要通过rtnl_notify给 上层用户发送消息,这里也是一套机制,我也就不细说了。
图7.1pm相 关的逻辑
在系统要求睡眠的时候会调用到sbi_suspend_card,由 此开始给WIFI模 块发送相关信息,并且detatch网 络设备,停止收发队列的处理,停止mmc总线等 等,唤醒过程没有分析;
|