SDIO_WIFI之我对WIFI了解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SDIO_WIFI分析WIFI之我见
作者:黄树新
时间:2011-11-18
地点:华清远见深圳分中心
SDIO_WIFI整个设备分为两个部分,一个是SD卡,一个是WIFI。SD卡部分主要涉及的重点在与如何识别SD卡和支持热拔插,而WIFI部分主要的重点在于发送和接收数据,现在,由小弟带着大家走一遭,本文涉及内容完全属于个人对WIFI部分理解,属于个人观点,如有错误,欢迎指导纠正。
WIFI驱动属于网络设备驱动,那么我们首先从它的结构出发,要了解它的结构,我们首先了解一般网络设备驱动的结构。
下图1是LINUX下网络驱动程序的体系结构:
图1
1、网络协议接口层想网络层协议提供一个统一的数据包收发接口,不论是
上层协议为APP还是IP,都通过dev_queue_xmit()函数发送数据,并通
过netif_rx()函数接收数据。这一层的存在使得上层协议独立于具体的
设备。
2、网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和
操作的结构体net_device,该结构体是设备驱动功能层中各函数的容器。
实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能
层的结构。
3、设备驱动功能层函数是网络设备接口层net_device数据结构的具体成
员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。
4、网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配
器和具体的传输媒介,网络适配器被设备驱动层中得函数物理上的驱动。
对于LINUX系统来说,网络设备和媒介可以是虚拟的。
在设计具体的网络设备驱动程序时,我们需要完成的主要工作是编写设备驱动功能层的相关函数以填充net_device数据结构的内容并将net_device注册入内核。
在进入正式驱动之前,还是要给大家补充一点基础知识,就是如何管理总线,设备,驱动之间关系的,关于bus_type、device_driver、device这三个内核结构,在内核代码中可以找到。由于这三个结构的重要性,我们在这里先将它们贴出来,我会用红色的注释标注。我在笔记中将会提到的一些结构成员以其代表的意义,这样便于对照。(我不得不承认,这三个结构的代码枯燥复杂。如果我误导了你,请指正我,所以我的建议是不妨先看完了笔记再来看这些结构)。
1、设备结构的定义:
struct device {
struct klist klist_children;
struct klist_node knode_parent; /* node in sibling list */
struct klist_node knode_driver;
struct klist_node knode_bus;
struct device *parent;
struct kobject kobj; //kobject结构,关于这个结构与kset结构以及
subsystem结构,笔记中会有描述。
char bus_id[BUS_ID_SIZE]; /* position on parent bus */
struct device_type *type;
unsigned is_registered:1;
unsigned uevent_suppress:1;
struct semaphore sem; /* semaphore to synchronize calls to* its driver.*/
struct bus_type * bus; /* type of bus device is on //这个设备挂接的总线的类型
struct device_driver *driver; /* which driver has allocated this device */
//这个设备挂接的驱动
void *driver_data; /* data private to the driver */
void *platform_data; /* Platform specific data, device core doesn't touch it */
struct dev_pm_info power;
#ifdef CONFIG_NUMA
int numa_node; /* NUMA node this device is close to */
#endif
u64 *dma_mask; /* dma mask (if dma'able device) */
u64 coherent_dma_mask;/* Like dma_mask, but for
alloc_coherent mappings as
not all hardware supports
64 bit addresses for consistent
allocations such descriptors. */
struct list_head dma_pools; /* dma pools (if dma'ble) */
struct dma_coherent_mem *dma_mem; /* internal for coherent mem override */
/* arch specific additions */
struct dev_archdata archdata;
spinlock_t devres_lock;
struct list_head devres_head;
/* class_device migration path */
struct list_head node;
struct class *class;
dev_t devt; /* dev_t, creates the sysfs "dev" */
struct attribute_group **groups; /* optional groups */
void (*release)(struct device * dev);
};
2、设备驱动的结构:
struct device_driver {
const char * name; //设备驱动的名字
struct bus_type * bus; //设备驱动挂接的总线的类型
struct kobject kobj; //kobject结构
struct klist klist_devices; //这个驱动对应的设备的链表
struct klist_node knode_bus;
struct module * owner;
const char * mod_name; /* used for built-in modules */
struct module_kobject * mkobj;
int (*probe) (struct device * dev);
int (*remove) (struct device * dev);
void (*shutdown) (struct device * dev);
int (*suspend) (struct device * dev, pm_message_t state);
int (*resume) (struct device * dev);
};
3、总线结构:
struct bus_type {
const char * name; //总线的名字
struct module * owner;
struct kset subsys; //与该总线相关的subsystem
struct kset drivers; //挂接在该总线上的驱动的集合
struct kset devices; //挂接在该总线上的设备的集合
struct klist klist_devices;
struct klist klist_drivers;
struct blocking_notifier_head bus_notifier;
struct bus_attribute * bus_attrs; //总线属性
struct device_attribute * dev_attrs; //设备属性