欢迎来到天天文库
浏览记录
ID:38706348
大小:43.92 KB
页数:11页
时间:2019-06-18
《Linux 下wifi 驱动开发 USB接口WiFi驱动浅析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Linux下wifi驱动开发(四)——USB接口WiFi驱动浅析 前面学习了SDIO接口的WiFi驱动,现在我们来学习一下USB接口的WiFi驱动,二者的区别在于接口不同。而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动、USB鼠标驱动,同样都符合LinuxUSB驱动结构: USB设备驱动(字符设备、块设备、网络设备)
2、 USB核心
3、 USB主机
4、控制器驱动 不同之处只是在于USB摄像头驱动是字符设备,而我们今天要学习的WiFi驱动是网络设备;当然由我们编写的部分还是USB设备驱动部分,下面进入USB接口WiFi驱动的分析,如何分析呢?我们下面从这几个方面入手: 从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WIFI设备之间的通信是通过无线射频(RF)。 从软件层面上看,Linux操作系统要管理WIFI设备,那么就要将WIFI设备挂载到USB总线上,通过USB子系统实现管理。而同时为了对接网络,又将WIFI设备封装成一个网络设备。
5、 我们以USB接口的WIFI模块进行分析:a--从USB总线的角度去看,它是USB设备;b--从Linux设备的分类上看,它又是网络设备;c--从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备;通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。一、框架整理1、USB设备驱动 现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:a--需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量代码如下:[c
6、pp] viewplain copy1.struct usb_driver xxx_usb_wifi_driver; b--填充该设备的usb_driver结构体成员变量代码如下:[cpp] viewplain copy1.static struct usb_driver xxx_usb_wifi_driver = { 2. .name = "XXX_USB_WIFI", 3. .probe = xxx_probe, 4. .disconnect = xxx_disconnect, 1. .sus
7、pend = xxx_suspend, 2. .resume = xxx_resume, 3. .id_table = xxx_table, 4.}; c--将该驱动注册到USB子系统代码如下:[cpp] viewplain copy1.usb_register(&xxx_usb_wifi_driver); 以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。以上步骤的主要工作是将USB接口的WIFI设备挂载到USB总线上,以便Linux系统在USB总
8、线上就能够找到该设备。2、网络设备驱动 接下来是网络设备的线索,网络设备驱动大致步骤如下:a--定义一个net_device结构体变量ndev代码如下:[cpp] viewplain copy1.struct net_device *ndev; b--初始化ndev变量并分配内存代码如下:[cpp] viewplain copy1.ndev=alloc_etherdev(); c--填充ndev->netdev_ops结构体成员变量代码如下:[cpp] viewplain copy1.static const struct
9、 net_device_ops xxx_netdev_ops= { 2. .ndo_init = xxx_ndev_init, 3. .ndo_uninit = xxx _ndev_uninit, 4. .ndo_open = netdev_open, 5. .ndo_stop = netdev_close, 6. .ndo_start_xmit = xxx_xmit_entry, 7. .ndo_set_mac_address = xxx_net_set_mac_address,
10、 8. .ndo_get_stats = xxx_net_get_stats, 9. .ndo_do_ioctl = xxx_ioctl, 10.}; d--填充ndev->wireless_handlers结构体成员变量,该变量
此文档下载收益归作者所有