高通WLAN芯片点灯方法-QCA9563操控9880GPIO进行点灯
高通9880芯片點燈
- 概述
- OpenWrt點燈套路
- 9880控制8337端口的led燈
- 簡單介紹
- QCA9880驅動
- QCA9880控燈驅動程序
- 回顧
概述
最近在調試高通9563芯片的GPIO點燈,因為主控芯片GPIO口比較緊缺。所以就把9563出的wan口和lan口的燈交給了9880的GPIO口控制。
OpenWrt點燈套路
Linux內核集成LED模塊,很方便就可以完成燈的控制,下面簡單回顧下通常GPIO口點燈的幾個步驟。
none [switch0] timer default-on netdev usbport phy0rx phy0tx phy0assoc phy0radio phy0tpt phy1rx phy1tx phy1assoc phy1radio phy1tpt)。
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,內核選中即可。
這個地方選中Enable LED support是支持9880wifi狀態燈的控制,這個燈是系統默認wifi狀態點燈。并且ath10k驅動也僅僅支持這一個GPIO的控制,默認是9880上的GPIO1。接下來就是要在這里做手腳,進行代碼改造。
QCA9880控燈驅動程序
ath10k在進行核心初始化時,會注冊led設備。
ath10k_leds_register-默認注冊一個wifi燈,此處進行擴展,擴展結構體如下:
然后循環調用led_classdev_register注冊函數,把所需要操作的所有GPIO口都以LED設備的方式注冊進去。
9880GPIO口配置
使能對應的GPIO口以及配置GPIO口的方向。ath10k_wmi_gpio_config、ath10k_wmi_gpio_output。
需要關注下,對應的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;在注冊設備的時候,會同時傳遞一個回調函數,做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);由于OpenWrt編譯機制,不能直接修改build_dir下代碼,否則clean之后修改部分會丟失。這里有兩種方法,一是解壓dl下backports大包,修改源碼之后再壓縮,然后修改 Makefile下的校驗碼即可,二是打補丁,網上有很多教程,而且方便快捷,無需修改源碼。
回顧
該部分內容主要掌握Linux LED設備操作及結合OpenWrt腳本配置即可。其中涉及的知識比較多,但是還是比較淺顯,需要自己去深入學習。
總結
以上是生活随笔為你收集整理的高通WLAN芯片点灯方法-QCA9563操控9880GPIO进行点灯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TeaPot 用webgl画茶壶(3)
- 下一篇: wpf 去除按钮点击时会画一个点线的矩形