转自: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无线驱动之:系统初始化相关推荐

  1. atheros 无线驱动接收流程

    atheros 无线驱动接收流程如下: request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc); irqretur ...

  2. Atheros开源驱动发展历史的介绍

    目前开始学习ath9k驱动原理,开始把最近所学所看到的东西整理记录下. 这是一篇关于Atheros开源驱动发展历史的介绍. MadWifi的官方开发者是Sam Leffler.他一直为FreeBSD维 ...

  3. win10+ubuntu系统最稳妥的安装方式(登录黑屏、死机、自动关机、屏幕跟摔碎了一样,没有无线驱动请点进来。)

    这是博主经过无数次的错误得到的最稳的一种安装方式了,因此记录整理记录下来 先说一下,目前绝大多数(百分之90的安装出问题都跟显卡和win10的安全启动有关) 第一步:前期电脑设置的准备(biso问题看 ...

  4. linux内核ttyusb实现,[zhuan]Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)...

    真正做完了USB驱动,看了<Linux那些事>之后,才知道Linux的USB host驱动有多复杂.我做的还只是USB驱动中的一小部分USB转串口.而且还只是读代码和做小的改动,真正写这些 ...

  5. 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

  6. 【无线】【流程】QCA无线驱动收包流程分析

    概述: 无线驱动的收包过程是基于中断的处理方式.在准备接收数据之前,驱动需要先进行初始化接收数据使用到的相关结构( sc_rxbuf和rxfifo ).当数据包到达时,硬件会首先进行 DMA,完成以后 ...

  7. 基于H.264的嵌入式无线视频监控系统

    http://www.eccn.com/design_2012041214510447.htm 1 引言 对图像监控系统,用户常常对使用环境提出一些特殊需求,他们希望能够监控距离比较远的对象,这些对象 ...

  8. 基于centos7打造个人服务器(二):系统初始化

    介绍 系统初始化 进行完基础系统安装后,我们已经得到了一台基础的服务器,下面我们就来安装一些基础服务,让我们的服务器用起来更方便吧~ 创建普通用户并授权 普通用户权限受限,更有利于保证系统完整性,可靠 ...

  9. linux无线驱动接口简介

    http://blog.csdn.net/dickjtk/article/details/11862815 在分析wpa_supplicant软件linux版本下无线驱动事件和无线驱动配置代码之前,先 ...

最新文章

  1. 合肥工业大学—SQL Server数据库实验五:创建和删除索引
  2. python基础一循环
  3. 分金币 (UVA 11300)
  4. 计算机二进制原理动画,伏羲创建的八卦图有多牛?计算机之父:二进制的原理从中发现...
  5. NVIDIA GPU显卡介绍
  6. 开通微信服务号需要准备的材料
  7. 怎么理解——用户不是人
  8. 拾色器 插件 Farbtastic
  9. SkeyeVSS实现RTSP、Onvif监控摄像头网页无插件化直播监控解决方案
  10. Java开发环境搭建步骤
  11. jquery传输文件到后端,后端处理数据。
  12. rk3399 hdmi HDCP key烧录
  13. openLayers + Vue实现测量(长度、面积)
  14. 汽车配件小程序开发制作
  15. 口袋妖怪php源码,查看“主题:宝可梦”的源代码
  16. 表情包在线生成PHP源码
  17. 《科技创新导报》杂志社约稿函
  18. HDOJ 4525 威威猫吃鸡腿
  19. RBA验厂辅导,RBA认证7.0供应商行为准则中文版详细内容
  20. 数据分析思维之用户标签

热门文章

  1. js判断对象中每一项属性都不为空 非空检测
  2. 几款好用的Markdown 写作工具推荐(下)
  3. 交换机(三)接入层、汇聚层和核心层交换机的特点
  4. 系统之家 linux下载,深度系统deepin linux最新版ISO镜像下载 V15.4.1
  5. 探索百度指数与股价的关系
  6. iframe 边框去除,使用大全
  7. 算法笔记——曼哈顿距离,切比雪夫距离,曼哈顿距离之和 P3964 [TJOI2013]松鼠聚会
  8. hyper-v 搭建本地yum镜像源,以及hadoop完全分布式 name节点分离集群
  9. subl: gitgutter可以让你看到git 改动
  10. 编程的未来 - 还有未来么?