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;

 

posted @ 2020-09-15 10:26  xahsxd1056  阅读(1277)  评论(0)    收藏  举报