高通WLAN芯片点灯方法-QCA9563操控9880GPIO进行点灯

本文详细介绍了如何使用高通9880芯片的GPIO口控制LED灯,包括OpenWrt环境下LED模块的配置流程,以及针对9563芯片与9880芯片组合时的点灯解决方案。探讨了ath10k驱动的定制化修改,实现对多个GPIO口的独立控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

最近在调试高通9563芯片的GPIO点灯,因为主控芯片GPIO口比较紧缺。所以就把9563出的wan口和lan口的灯交给了9880的GPIO口控制。

OpenWrt点灯套路

Linux内核集成LED模块,很方便就可以完成灯的控制,下面简单回顾下通常GPIO口点灯的几个步骤。

  1. 选中内核gpio点灯驱动,一般驱动名为leds-gpio(/sys/bus/platform/drivers/leds-gpio)。
  2. 如果是MIPS架构需要自己手动注册设备,信息自己携带在gpio_led_platform_data结构体中,同时可注册多个LED设备,最终呈现在sys fs文件系统下(/sys/devices/platform/leds-gpio/leds/LAN1:green:led)。
  3. 以上只是提供一个可操作的设备,具体怎么关联到系统当中,并且随着端口的link状态自动亮灭。这就需要结合LED模块提供的另外一个属性,LED触发模式。这个可以在注册设备时进行配置,也可在系统起来时进行脚本配置(root@mexon:/sys/devices/pci0000:00/0000:00:00.0/leds/LED0# cat trigger
    none [switch0] timer default-on netdev usbport phy0rx phy0tx phy0assoc phy0radio phy0tpt phy1rx phy1tx phy1assoc phy1radio phy1tpt)。
  4. 例如在OpenWrt中,有自动化配置脚本控制LED设备,进行触发模式选择。在openwrt/target/linux/ar71xx/base-files/etc/board.d/01_leds中配置switch芯片出的端口link状态。
    ucidef_set_led_switch “wan” “WAN” “LED3”(注册的led设备) “switch0”(触发器名称)“0x02”(端口掩码)
    此处如果有多个LED设备,可持续配置。
    MPP6600)
    	ucidef_set_led_switch "wan"  "WAN" "LED3" "switch0" "0x02"
    	ucidef_set_led_switch "lan1" "LAN1" "LED2" "switch0" "0x04"
    	ucidef_set_led_switch "lan2" "LAN2" "LED1" "switch0" "0x08"
    	ucidef_set_led_switch "lan3" "LAN3" "LED0" "switch0" "0x10"
    	ucidef_set_led_timer "run" "RUN" "MPP6600:green:run" "1000" "1000"
    	#ucidef_set_led_wlan "wlan2g" "WLAN 2.4 GHz" "MPP6600:green:2G" "phy1tpt"
    

9880控制8337端口的led灯

简单介绍

控制芯片为9563,通过GMAC接口连接高通的8337switch芯片,该芯片可配置单wan口或多wan口,其余均做lan口(软件通过swconfig进行vlan隔离即可)。由于9563上的GPIO口有限,9880又支持可配置的GPIO口。所以我们的8337link就采用9880GPIO口控制方式。

QCA9880驱动

采用开源 ath10k,内核选中即可。
ath10kled支持
这个地方选中Enable LED support是支持9880wifi状态灯的控制,这个灯是系统默认wifi状态点灯。并且ath10k驱动也仅仅支持这一个GPIO的控制,默认是9880上的GPIO1。接下来就是要在这里做手脚,进行代码改造。

QCA9880控灯驱动程序

  1. ath10k在进行核心初始化时,会注册led设备。
    ath10k_leds_register-默认注册一个wifi灯,此处进行扩展,扩展结构体如下:

    struct {
    		struct gpio_led wifi_led;
    		struct led_classdev cdev;
    		char label[48];
    		u32 gpio_state_pin;
    	} leds[10];
    

    然后循环调用led_classdev_register注册函数,把所需要操作的所有GPIO口都以LED设备的方式注册进去。

  2. 9880GPIO口配置
    使能对应的GPIO口以及配置GPIO口的方向。ath10k_wmi_gpio_config、ath10k_wmi_gpio_output。

  3. 需要关注下,对应的GPIO口是否被占用,有很多芯片GPIO口都是可复用的,芯片复位后有时会作其它功能(比如JTag)。

    /* 使能GPIO口 */
    for(i = 0; i < 5; ++ i)
    {
       ath10k_wmi_gpio_config(ar, ar->leds[i].wifi_led.gpio, 0,
           WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE);
       ath10k_wmi_gpio_output(ar, ar->leds[i].wifi_led.gpio, 1);
    }
    /* 关掉GPIO口复用 */
    if(ar->hif.ops != NULL && ar->hif.ops->read32 != NULL)
    {
       val = ar->hif.ops->read32(ar, GPIO_BASE_ADDRESS + 0xb0);
       val |= 1;
       if(ar->hif.ops->write32 != NULL)
           ar->hif.ops->write32(ar, GPIO_BASE_ADDRESS + 0xb0, val);
    }
    return 0;
    
  4. 在注册设备的时候,会同时传递一个回调函数,做LED灯亮度调整用的。在这个回调函数中,需要重新解析GPIO口,因为之前这个地方仅仅控制一个GPIO口,现在要操作多个GPIO口。这里可以通过设备名称获取GPIO口的端口号。

    /* 只要是解析出当前的GPIO口号,然后去具体设置某个GPIO口 */
    int i = 0;
    if(!strcmp(led_cdev->name, "LED0"))
    {
        i = 1;
    }
    else if(!strcmp(led_cdev->name, "LED1"))
    {
        i = 2;
    }
    else if(!strcmp(led_cdev->name, "LED2"))
    {
        i = 3;
    }
    else if(!strcmp(led_cdev->name, "LED3"))
    {
        i = 4;
    }
    else
    {
        i = 0;
    }
    

    最后根据解析出来的端口号,可对GPIO的输出做控制。

    struct ath10k *ar = container_of(led_cdev, struct ath10k,leds[i].cdev);
    struct gpio_led *led = &ar->leds[i].wifi_led;
    ar->leds[i].gpio_state_pin = (brightness != LED_OFF) ^ led->active_low;
    ath10k_wmi_gpio_output(ar, led->gpio, ar->leds[i].gpio_state_pin);
    
  5. 由于OpenWrt编译机制,不能直接修改build_dir下代码,否则clean之后修改部分会丢失。这里有两种方法,一是解压dl下backports大包,修改源码之后再压缩,然后修改 Makefile下的校验码即可,二是打补丁,网上有很多教程,而且方便快捷,无需修改源码。

回顾

该部分内容主要掌握Linux LED设备操作及结合OpenWrt脚本配置即可。其中涉及的知识比较多,但是还是比较浅显,需要自己去深入学习。

QCA8337N是一个高度集成的七端口千兆位以太网交换机,具有非阻塞交换机结构,一个具有2048个MAC地址的高性能查找单元,以及四个流量等级的QualityofS。服务(QoS)引擎QCA8337N交换机具有支持各种网络应用程序的灵活性。QCA8337N是为高端网关和xpon中的成本敏感的交换机应用而设计的。 QCA8337N集成了高速交换系统的所有功能,包括数据包缓冲区、PHY收发器、媒体访问控制器、地址管理和非阻塞交换结构。一个55 nm的CMOS器件。它符合10 BASE-Te和1000 BASE-T规范,包括mac控制、暂停帧和自动协商子部分,提供了与所有行业标准以太网、快速et兼容的功能。 QCA8337N器件包含5个全双工10BASE-Te/100BASE-Tx/1000BASE-T收发信机,10BASE-Te/100BASE-Tx可以在半双工运行,每一个都执行所有物理层Interfa。它们在第5类无屏蔽双绞线(UTP)电缆上执行10BASE-Te以太网的所有物理层接口功能,在第5类UTP电缆上执行快速/千兆以太网的所有物理层接口功能。 其余两个端口具有标准的GMII/RGMII/MII/SerDes接口,允许在PON/xDSL/电缆/Wi-Fi/光纤路由器中连接到主机CPU。在QCA8337N上的媒体访问控制器也是。upport巨帧,通常用于与服务器的高性能连接,因为它们为更高的效率提供了较小的链路开销百分比。 spi或EEProm接口提供片内802.1pQoS和/或DiffServ/TOS的轻松编程。这允许将交换机流量指定为不同级别的优先级或服务-例如,语音IP电话应用程序的通信量,多媒体应用程序的视频通信量,或电子邮件应用程序的数据流量。 可以通过SPI端口设置多达4K的虚拟局域网(VLAN),以分离网络上的不同用户或组。ACL特性可以减少基于第一层到第四层信息的VLAN/QoS/DSCP/正向映射和重映射的CPU工作量。PPPoE头加/移除可以提高视频质量和卸载CPU负载。绿色节电技术可以提高无链路或空闲状态下的能效 Qualcomm XSPantM QCA9563是一个高度集成和功能丰富的IEEE 802.11n 3x3 2.4 GHz系统芯片(SoC),适用于先进的WLAN平台。 它包括一个MIPS 74Kc处理器,一个SGMII接口和一个外部存储器接口,用于串行Flash,DDR 1或DDR 2,UART,PCIe,两个USB 2.0主机控制器,内置的MAC/PHY和GPO可用于LED控件或其他通用接口配置。 QCA9563支持高达216 Mbps的20 MHz和450 Mbps的40 MHz的802.11n操作和802.11b/g的数据速率。其他特性包括最大似然(ML)译码、低密度奇偶。 QCA9563支持从NOR闪存启动 Qualcomm Atheros QCA9882 是一种用于5GHz 802.11ac或2.4/5 GHz 802.11n WLAN应用的高度集成的无线局域网(WLAN)片上系统(SoC)。QCA9882集成了板载CPU,用于WLAN物理层(PHY)和RF的低级设置,以便将主机处理器卸载到其他任务。支持两种空间的高性能2x2MIMO无线应用的流要求最高的健壮链路质量和最大的吞吐量和范围。QCA9882集成了多协议mac、phy、模拟数字/数字模拟转换器(ADC/DAC)、2x2mimo无线电收发器和pci Express接口,用于低功耗的cmos器件。 QCA9882实现了半双工OFDM、CCK和DSSS PHY,支持802.11ac 80MHz信道操作的867Mbps.它支持20MHz的802.11n和40MHz的300Mbps的802.11n,以及IEEE 802.11a/b/g数据速率。其他特性包括最大似然(ML)译码、低密度奇偶校验(Ldpc)、最大比合并(Mrc)、空时分组码(Stbc)。),以及片上一次可编程(OTP)存储器,以消除外部闪存的需要,并进一步降低外部组件计数和BOM成本。QCA 9882支持802.11无线MA。C协议、802.11i安全、Rx/TX过滤、错误恢复和802.11e服务质量(QoS) QCA 9882支持多达两个同时的业务流,将两个TX和两个Rx链集成在一起,以实现高吞吐量和扩展覆盖。Tx链结合PHY同相(I)和正交(Q)sigNAL,将它们转换到所需的频率,并将RF信号驱动到多个天线。RX链使用集成的体系结构。该频率合成器支持1MHz步骤,以匹配IEEE 802.11a/b/g/n规范定义的频率。QCA9882支持使用PCIe接口与主机之间的帧数据传输。提供中断生成和报告、电源保存和状态报告。其他外部接口包括EEPROM和GPIO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值