RK3328上使用RK805的32.768khz
RK805有一个打开固定输出32.768khz的引脚,在公版电路图上作为wifi(AP系列wifi)的LPO参考时钟。

我们在dts文件中,看到关于该时钟启动的相关信息,在wireless-bluetooth中:
clocks = <&rk805 1>;
clock-names = "ext_clock";
可以了解到该时钟是与Bluetooth相关联。而在驱动rfkill-bt.c中:
bluetooth_platdata_parse_dt :
data->ext_clk = devm_clk_get(dev, "ext_clock");
if (IS_ERR(data->ext_clk)) {
LOG("%s: clk_get failed!!!.\n", __func__);
} else {
clk_prepare_enable(data->ext_clk);
}
rfkill_rk_remove
clk_disable_unprepare(rfkill->pdata->ext_clk);
启动所用的函数clk_prepare_enable,从clk.c --> clk-rk808.c执行写寄存器的操作。从而可以在该引脚量到波形。
缘由:
本来是项目更换wifi模块,旧的wifi模块并不需要该参考时钟(模块有内置的参考时钟)。而更换的wifi模块在没有LPO参考时钟的时候无法正常工作,而项目又不开启蓝牙功能,所以需将相关改动改至dts文件的wireless-wlan以及驱动文件rfkill-wlan.c中。如果有开Bluetooth的话,则不需要此改动。
[ 93.454289] dhdsdio_write_vars: Download, Upload and compare of NVRAM succeeded.
[ 93.791477] dhdsdio_htclk: HT Avail timeout (1000000): clkctl 0x50
[ 93.791505] dhd_bus_init: clock state is wrong. state = 1
[ 94.128105] dhdsdio_htclk: HT Avail timeout (1000000): clkctl 0x50

wireless-bluetooth {
............//省略
clocks = <&rk805 1>;//自带的
clock-names = "ext_clock";//自带的
............//省略
status = "disabled";
};
wireless-wlan {
............//省略
clocks = <&rk805 1>;//新增
clock-names = "ext_clock";//新增
.............//省略
status = "okay";
};
rkill-wlan.c
diff --git a/net/rfkill/rfkill-wlan.c b/net/rfkill/rfkill-wlan.c
index a4b6e5d1..9bb2175b 100644
--- a/net/rfkill/rfkill-wlan.c
+++ b/net/rfkill/rfkill-wlan.c
@@ -654,6 +656,12 @@ static int wlan_platdata_parse_dt(struct device *dev,
LOG("%s: get property: WIFI,host_wake_irq = %d, flags = %d.\n", __func__, gpio, flags);
} else data->wifi_int_b.io = -1;
}
+ data->ext_clk = devm_clk_get(dev, "ext_clock");
+ if (IS_ERR(data->ext_clk)) {
+ LOG("%s: clk_get failed!!!.\n", __func__);
+ } else {
+ clk_prepare_enable(data->ext_clk);
+ }
return 0;
}
@@ -844,6 +852,7 @@ static int rfkill_wlan_remove(struct platform_device *pdev)
//
// if (gpio_is_valid(rfkill->pdata->GPS_LAN.io))
// gpio_free(rfkill->pdata->GPS_LAN.io);
+ clk_disable_unprepare(rfkill->pdata->ext_clk);
kfree(rfkill);
g_rfkill = NULL;

浙公网安备 33010602011771号