《转》atheros无线驱动之:系统初始化
转自:http://blog.csdn.net/suiyuan19840208/article/details/17532049
1:atheros WLAN系统框图
Atheros的驱动是应用于在类似如上图的方案中的,可以不是很清楚但是可以看看如下的框
其中atheros主要的芯片有:AR9344、AR9341,AR9382,AR7240,AR7342(无wifi),交换芯片类AR8328/8337。
在双频率设备中,第一张网卡wifi0基本上使用如AR9344、9341提供的2.4或者5.8G来实现,第二组网络wifi1是通过如上面的框图显示的有PCIE扩展而来,如使用:AR9382。
2:WLAN模块的加载
现在我们的驱动从PCIE接口类的网卡的初始化说起。此处的流程是当WLAN的驱动在加载的时候即insmod,可以在atheros提供的rc.wlan中可知在insmod和rmmod时操作的是那些模块。
加载时:
insmod $MODULE_PATH/adf.ko
insmod $MODULE_PATH/asf.ko
insmod $MODULE_PATH/ath_hal.ko
insmod $MODULE_PATH/ath_rate_atheros.ko
insmod $MODULE_PATH/ath_spectral.ko$SPECTRAL_ARGS
if [ "${AP_NO_A_BAND}" !="1" ]; then
#load DFS if A band issupported,default is supported and set AP_NO_A_BAND=1 if not supported
insmod $MODULE_PATH/ath_dfs.ko$DFS_ARGS
fi
insmod $MODULE_PATH/hst_tx99.ko
insmod $MODULE_PATH/ath_dev.ko
insmod $MODULE_PATH/umac.ko
insmod $MODULE_PATH/wlan_me.ko
insmod $MODULE_PATH/ath_pktlog.ko
卸载时:
_ath_unload()
{
rmmod wlan_scan_ap
rmmod wlan_scan_sta
rmmod ath_pktlog
sleep 2
rmmod wlan_me
sleep 2
rmmod umac
sleep 2
rmmod ath_dev
rmmod hst_tx99
rmmod ath_dfs
rmmod ath_spectral
rmmod ath_rate_atheros
rmmod ath_hal
rmmod asf
rmmod adf
}
来看看当加载PCEI的接口时,初始化打印的信息如下:此处使用的是9382扩展的5.8G的信号
上面前面的信息主要是在函数:init_ath_pci()中的
if (pci_register_driver(&ath_pci_drv_id) < 0) { 此处进行的是PCI的注册。
printk("ath_pci: No devices found, driver not installed.\n");
pci_unregister_driver(&ath_pci_drv_id);
#ifdef ATH_AHB
pciret = -ENODEV;
#else
return (-ENODEV);
#endif
}
其中ath_pci_drv_id定义如下
//static struct pci_driver ath_pci_drv_id = {
struct pci_driver ath_pci_drv_id = {
.name = "ath_pci",
.id_table = ath_pci_id_table,
.probe = ath_pci_probe,
.remove = ath_pci_remove,
#ifdef ATH_BUS_PM
.suspend = ath_pci_suspend,
.resume = ath_pci_resume,
#endif /* ATH_BUS_PM */
/* Linux 2.4.6 has save_state and enable_wake that are not used here */
};
在PCI的probe函数ath_pci_probe中有如下的代码:
dev = alloc_netdev(sizeof(struct ath_pci_softc), "wifi%d", ether_setup); //此处分别了设备节点dev.
if (dev == NULL) {
printk(KERN_ERR "ath_pci: no memory for device state\n");
goto bad2;
}
dev->type = ARPHRD_IEEE80211;
if (__ath_attach(id->device, dev, &bus_context, &sc->aps_osdev) != 0)
goto bad3;
athname = ath_hal_probe(id->vendor, id->device);
printk(KERN_INFO "%s: %s: mem=0x%lx, irq=%d hw_base=0x%p\n",
dev->name, athname ? athname : "Atheros ???", phymem, dev->irq,(void *)(((struct ath_softc *)(sc->aps_sc.sc_dev))->sc_ah->ah_sh));
return 0;
上面可以知道调用函数__ath_attach(),此函数中attach了很多操作相关的处理函数。
其中网络设备net_device的操作函数定义如下:
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
static const struct net_device_ops athdev_net_ops = {
.ndo_open = ath_netdev_open,
.ndo_stop = ath_netdev_stop,
.ndo_start_xmit = ath_netdev_hardstart,
.ndo_set_mac_address = ath_netdev_set_macaddr,
.ndo_tx_timeout = ath_netdev_tx_timeout,
.ndo_get_stats = ath_getstats,
.ndo_change_mtu = ath_change_mtu,
.ndo_set_multicast_list = ath_netdev_set_mcast_list,
.ndo_do_ioctl = ath_ioctl,
};
#endif
PCI接口的wifi设备在各层中attach了很多需要处理的函数,其贯穿整个WLAN驱动框架,
在atheros提供的驱动程序时封分层处理的,从下到上可以看到有:
HAL:Hardware Abstraction Layer (HAL):
Lower MAC (LMAC)
Upper MAC (UMAC)
OS Interface Layer (OSIF) 此处就不详细说明了,其他地方再说。
/*
* Create an Atheros Device object
*/
error = ath_dev_attach(devid, base_addr,ic, &net80211_ops, osdev,
&scn->sc_dev, &scn->sc_ops,scn->amem.handle,ath_conf_parm, hal_conf_parm);
其中ieee80211_ops定义很多对80211协议的特定处理函数。
/*
* ath_ops is stored per device instance because EDMA devices
* have EDMA specific functions.
*/
sc->sc_ath_ops = ath_ar_ops;
*ops = &sc->sc_ath_ops;
其中ath_ar_ops; 定义了很多处理函数。这些函数太多,都是回调函数。
上面是device在加载的过程中attach的各层的处理函数,同理当驱动rmmod的时候,做出相反动作,其函数的调用流程如下:
上面提到的中断的申请与释放:可以proc目录下面看到系统申请的中断。
《转》atheros无线驱动之:系统初始化相关推荐
- atheros 无线驱动接收流程
atheros 无线驱动接收流程如下: request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc); irqretur ...
- Atheros开源驱动发展历史的介绍
目前开始学习ath9k驱动原理,开始把最近所学所看到的东西整理记录下. 这是一篇关于Atheros开源驱动发展历史的介绍. MadWifi的官方开发者是Sam Leffler.他一直为FreeBSD维 ...
- win10+ubuntu系统最稳妥的安装方式(登录黑屏、死机、自动关机、屏幕跟摔碎了一样,没有无线驱动请点进来。)
这是博主经过无数次的错误得到的最稳的一种安装方式了,因此记录整理记录下来 先说一下,目前绝大多数(百分之90的安装出问题都跟显卡和win10的安全启动有关) 第一步:前期电脑设置的准备(biso问题看 ...
- linux内核ttyusb实现,[zhuan]Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)...
真正做完了USB驱动,看了<Linux那些事>之后,才知道Linux的USB host驱动有多复杂.我做的还只是USB驱动中的一小部分USB转串口.而且还只是读代码和做小的改动,真正写这些 ...
- 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- 【无线】【流程】QCA无线驱动收包流程分析
概述: 无线驱动的收包过程是基于中断的处理方式.在准备接收数据之前,驱动需要先进行初始化接收数据使用到的相关结构( sc_rxbuf和rxfifo ).当数据包到达时,硬件会首先进行 DMA,完成以后 ...
- 基于H.264的嵌入式无线视频监控系统
http://www.eccn.com/design_2012041214510447.htm 1 引言 对图像监控系统,用户常常对使用环境提出一些特殊需求,他们希望能够监控距离比较远的对象,这些对象 ...
- 基于centos7打造个人服务器(二):系统初始化
介绍 系统初始化 进行完基础系统安装后,我们已经得到了一台基础的服务器,下面我们就来安装一些基础服务,让我们的服务器用起来更方便吧~ 创建普通用户并授权 普通用户权限受限,更有利于保证系统完整性,可靠 ...
- linux无线驱动接口简介
http://blog.csdn.net/dickjtk/article/details/11862815 在分析wpa_supplicant软件linux版本下无线驱动事件和无线驱动配置代码之前,先 ...
最新文章
- 合肥工业大学—SQL Server数据库实验五:创建和删除索引
- python基础一循环
- 分金币 (UVA 11300)
- 计算机二进制原理动画,伏羲创建的八卦图有多牛?计算机之父:二进制的原理从中发现...
- NVIDIA GPU显卡介绍
- 开通微信服务号需要准备的材料
- 怎么理解——用户不是人
- 拾色器 插件 Farbtastic
- SkeyeVSS实现RTSP、Onvif监控摄像头网页无插件化直播监控解决方案
- Java开发环境搭建步骤
- jquery传输文件到后端,后端处理数据。
- rk3399 hdmi HDCP key烧录
- openLayers + Vue实现测量(长度、面积)
- 汽车配件小程序开发制作
- 口袋妖怪php源码,查看“主题:宝可梦”的源代码
- 表情包在线生成PHP源码
- 《科技创新导报》杂志社约稿函
- HDOJ 4525 威威猫吃鸡腿
- RBA验厂辅导,RBA认证7.0供应商行为准则中文版详细内容
- 数据分析思维之用户标签
热门文章
- js判断对象中每一项属性都不为空 非空检测
- 几款好用的Markdown 写作工具推荐(下)
- 交换机(三)接入层、汇聚层和核心层交换机的特点
- 系统之家 linux下载,深度系统deepin linux最新版ISO镜像下载 V15.4.1
- 探索百度指数与股价的关系
- iframe 边框去除,使用大全
- 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会
- hyper-v 搭建本地yum镜像源,以及hadoop完全分布式 name节点分离集群
- subl: gitgutter可以让你看到git 改动
- 编程的未来 - 还有未来么?