【android】全志T3 android6.0串列埠6不能正常使用的問題

yingxian_Fei發表於2017-12-21

      今天移植全志提供的android6.0sdk到我們自己的平臺上,在驗證相關功能時發現串列埠6無法正常進行收發,排除本身測試程式碼問題後,排查sdk,發現其提供的sdk中對於串列埠6的配置有坑,記錄下解決方法,希望幫助到其他人。

1、問題描述

sys_config.fex中配置了串列埠6,init.rc中增加其對應的讀寫許可權,然後編寫測試程式對串列埠進行,讀寫,發現無法收到測試程式寫入的資料,接收估計可以但是沒有繼續驗證,後面使用示波器測量發現串列埠6的tx上有一個持續的方波訊號!頻率大概32K,推測這個就是導致無法正常寫資料的原因。

2、排查過程

(1)、首先確認sys_config.fex中配置是否衝突;這部分主要時確認其他驅動或程式碼是否也用了這個IO口。我這一步正常,不存在IO衝突;

(2)、確認IO的複用功能是否配置正確;這部分主要是因為有的IO口一般存在多種複用功能,比如我使用的串列埠6的tx管腳(GPIOI12),本身支援IO口(又包含輸入和輸出兩種方式)、SPI0_MOSI、Uart6_Tx、CLK_OUT_A、EINT24等多種模式,這個可以從spec中查到,如果手上沒有spec,可以從sdk的kernel相關pin原始碼中查到複用配置(可以查閱如下部落格:http://blog.csdn.net/smilefyx/article/details/78860261)。我的這部分配置如下:

[uart6]
uart6_used       = 1
uart6_port       = 6
uart6_type       = 2
uart6_tx         = port:PI12<3><1><default><default>
uart6_rx         = port:PI13<3><1><default><default>

[uart6_suspend]
uart6_tx         = port:PA12<7><1><default><default>
uart6_rx         = port:PA13<7><1><default><default>
從配置上這部分也沒有問題。但是從示波器輸出32K時鐘訊號,然後這個IO剛好有個CLK_OUT_A的複用,似乎可以找到關係,極有可能在某些地方這個IO口被作為時鐘輸出了;

(3)、查詢裝置樹中的是否有使用該IO作為預設配置;一般裝置樹會存放在核心原始碼的arch/arm/boot/dts/目錄下,一般以.dts為後最,這裡面存有一些通用或私有的配置,這寫配置可以被驅動或sys_config.fex中的配置覆蓋重寫,但是如果其沒有重寫的話就會用裝置樹中的預設資訊,這裡我找了T3平臺相關的幾個檔案,在sun8iw11p1-soc.dts中感覺發現了罪魁禍首,其內容如下:

/*
 * Allwinner Technology CO., Ltd. sun8iw11p1 soc board.
 *
 */

/dts-v1/;

#include "sun8iw11p1.dtsi"

/{

	soc@01c00000 {
	};

	wlan:wlan {
		compatible = "allwinner,sunxi-wlan";
		clocks = <&clk_outa>;
		wlan_busnum = <1>;
		wlan_clk_gpio = <&pio PI 12 4 0 0 0>;
		status = "okay";
	};

	bt:bt {
		compatible = "allwinner,sunxi-bt";
		status = "okay";
	};

	btlpm:btlpm {
		compatible = "allwinner,sunxi-btlpm";
		status = "okay";
	};

        gps:gps {
                compatible = "allwinner,sunxi-gps";
                clocks = <&clk_outb>;
                status = "disabled";
        };
};
看到wlan的配置了嗎?其中wlan_clk_gpio使用了PI12,複用模式為4,回顧上面的程式碼或複用說明,4即作為CLK_OUT_A輸出,所以wlan中使用了這個IO口用於輸出一個時鐘提供給wifi模組使用。

(4)、進一步驗證;上面感覺發現了罪魁禍首,但是還需要進一步確認,確認方式多種多樣,有幾種方案:A、禁用wifi看是否ok;B、.dts裝置樹中去掉這個配置或者改用其他IO口;C、sys_config.fex中wlan配置中配置wlan_clk_gpio為其他IO口。我驗證了A、B兩種方案都可以的,C理論上也沒問題,不過沒繼續驗證了;

3、解決方案

其實第2步中已經得到了這個問題的解決方案,我最終時直接去掉了裝置樹中的wlan_clk_gpio的配置,因為在這裡太容易被大多數人忽略了,我更能接受把它在sys_config.fex中去配置,或者沒有配置時直接列印錯誤資訊,修改後上述檔案內容如下:

/*
 * Allwinner Technology CO., Ltd. sun8iw11p1 soc board.
 *
 */

/dts-v1/;

#include "sun8iw11p1.dtsi"

/{

	soc@01c00000 {
	};

	wlan:wlan {
		compatible = "allwinner,sunxi-wlan";
		clocks = <&clk_outa>;
		wlan_busnum = <1>;
		status = "okay";
	};

	bt:bt {
		compatible = "allwinner,sunxi-bt";
		status = "okay";
	};

	btlpm:btlpm {
		compatible = "allwinner,sunxi-btlpm";
		status = "okay";
	};

        gps:gps {
                compatible = "allwinner,sunxi-gps";
                clocks = <&clk_outb>;
                status = "disabled";
        };
};



相關文章