【android】全志T3 android6.0串口6不能正常使用的问题

版权声明:本文为博主原创文章,转载请声明原文出处http://blog.csdn.net/smilefyx https://blog.csdn.net/yxtouch/article/details/78864143

      今天移植全志提供的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";
        };
};



展开阅读全文

没有更多推荐了,返回首页