msm8953 uart配置

msm8953 uart配置参考链接:MSM8937-MSM8953UART配置调试指南uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。一、修改设备树设备树的配置有三部分:1.msm8953.dtsi中添加code blsp2_uart2:serial@7af0000{ compatible=”qcom,msm-lsuart-v14″; reg=<0x7af00000x…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

参考链接:MSM8937-MSM8953 UART配置调试指南

uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。

一、修改设备树

设备树的配置有三部分:

1.msm8953.dtsi 中添加code

	blsp2_uart2: serial@7af0000 { 
   
		compatible = "qcom,msm-lsuart-v14";
		reg = <0x7af0000 0x200>;
		interrupts = <0 307 0>;
		status = "disabled";
		clocks = <&clock_gcc clk_gcc_blsp2_uart2_apps_clk>,
			<&clock_gcc clk_gcc_blsp2_ahb_clk>;
		clock-names = "core_clk", "iface_clk";
	};

2. msm8953-pinctrl.dtsi 中添加代码

		hsuart_active: default { 
   
			mux { 
   
				pins = "gpio20", "gpio21";
				function = "blsp_uart6";
			};

			config { 
   
				pins = "gpio20", "gpio21";
				drive-strength = <2>;
				bias-disable;
			};
		};

		hsuart_sleep: sleep { 
   
			mux { 
   
				pins = "gpio20", "gpio21";
				function = "gpio";
			};

			config { 
   
				pins = "gpio20", "gpio21";
				drive-strength = <2>;
				bias-disable;
			};
		};

3.在msm8953-nopmi-qrd.dtsi中添加代码

&blsp2_uart2 { 
   
	status = "ok";
	pinctrl-names = "default";
	pinctrl-0 = <&hsuart_active>;
};

设备树配置完成后,编译bootimage,刷机,重启。

# user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:25] 
$ adb reboot bootloader       

# user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:30] 
$ fastboot flash boot boot.img 
target reported max download size of 536870912 bytes
sending 'boot' (24775 KB)...
OKAY [  0.710s]
writing 'boot'...
OKAY [  0.358s]
finished. total time: 1.068s

# user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:35] 
$ fastboot reboot

设备启动后,却没有找到预期的/dev/ttyHSL3的设备节点。
这里想到的是先确认设备树是否修改正确。

二、在根文件系统中查看设备树

参考资料:
设备树学习(十、在根文件系统中查看设备树)
在根文件系统中查看设备树(有助于调试)
以下内核属于转载

a. /sys/firmware/fdt

进入/sys/firmware目录后便可看到二个文件,一个是devicetree文件夹,另一个是fdt(原始dtb文件,可以用hexdump -C fdt 将其打印出来查看就会发现里面的数据和dtb文件是一致的)。

b. /sys/firmware/devicetree

以目录结构呈现的dtb文件。 根节点对应base目录, 每一个节点对应一个目录, 每一个属性对应一个文件

c. /sys/devices/platform

系统中所有的platform_device, 有来自设备树的, 也有来有.c文件中注册的
对于来自设备树的platform_device,可以进入 /sys/devices/platform/<设备名>/of_node 查看它的设备树属性(例如进入/sys/devices/platform/led/后若发现该目录下有of_node节点,就表明该platform_device来自设备树)

d. /proc/device-tree

是链接文件, 指向 /sys/firmware/devicetree/base

查看dump的fdt文件,发现里面是有uart6的配置信息,且配置是正确的。
然后到网络上寻找资料。

三、问题

添加uart设备树配置后,在设备中没有找到对应的设备节点。

四、查看修改驱动

在网络找到参考资料中发现是需要修改驱动文件,在我这里的uart是配置的第4路uart,需要到kernel/msm-3.18/drivers/tty/serial路径下修改msm_serial_hs_lite.c文件。
修改如下,添加一路uart

static struct msm_hsl_port msm_hsl_uart_ports[] = { 
   
	{ 
   
		.uart = { 
   
			.iotype = UPIO_MEM,
			.ops = &msm_hsl_uart_pops,
			.flags = UPF_BOOT_AUTOCONF,
			.fifosize = 64,
			.line = 0,
		},
	},
	{ 
   
		.uart = { 
   
			.iotype = UPIO_MEM,
			.ops = &msm_hsl_uart_pops,
			.flags = UPF_BOOT_AUTOCONF,
			.fifosize = 64,
			.line = 1,
		},
	},
	{ 
   
		.uart = { 
   
			.iotype = UPIO_MEM,
			.ops = &msm_hsl_uart_pops,
			.flags = UPF_BOOT_AUTOCONF,
			.fifosize = 64,
			.line = 2,
		},
	},
	{ 
   
		.uart = { 
   
			.iotype = UPIO_MEM,
			.ops = &msm_hsl_uart_pops,
			.flags = UPF_BOOT_AUTOCONF,
			.fifosize = 64,
			.line = 3,
		},
	},
};

查看log,有正确加载驱动会打印出detected port #%d (ttyHSL%d) 的log,分析probe函数。
probe函数代码如下:

static int msm_serial_hsl_probe(struct platform_device *pdev)
{ 
   
	struct msm_hsl_port *msm_hsl_port;
	struct resource *uart_resource;
	struct resource *gsbi_resource;
	struct uart_port *port;
	struct msm_serial_hslite_platform_data *pdata;
	const struct of_device_id *match;
	u32 line;
	int ret;

	if (pdev->id == -1)
		pdev->id = atomic_inc_return(&msm_serial_hsl_next_id) - 1;

	/* Use line (ttyHSLx) number from pdata or device tree if specified */
	pdata = pdev->dev.platform_data;
	if (pdata)
		line = pdata->line;
	else
		line = pdev->id;

	/* Use line number from device tree alias if present */
	if (pdev->dev.of_node) { 
   
		dev_dbg(&pdev->dev, "device tree enabled\n");
		ret = of_alias_get_id(pdev->dev.of_node, "serial");
		if (ret >= 0)
			line = ret;

		pdata = msm_hsl_dt_to_pdata(pdev);
		if (IS_ERR(pdata))
			return PTR_ERR(pdata);

		pdev->dev.platform_data = pdata;
	}

	if (unlikely(line < 0 || line >= UART_NR))	
		return -ENXIO;

	pr_info("detected port #%d (ttyHSL%d)\n", pdev->id, line);
	......

在probe函数代码中关于line的判断处理如下:

// 这里 UART_NR的值是预处理的时候根据结构体msm_hsl_uart_ports元素个数确定的
#define UART_NR ARRAY_SIZE(msm_hsl_uart_ports)

static int msm_serial_hsl_probe(struct platform_device *pdev)
{ 
   

	/* Use line (ttyHSLx) number from pdata or device tree if specified */
	pdata = pdev->dev.platform_data;
	if (pdata)
		line = pdata->line;		// 这里有个疑问,这个pdata结构体中的line是谁来更新的?
	else
		line = pdev->id;

	/* Use line number from device tree alias if present */
	......

	if (unlikely(line < 0 || line >= UART_NR))
		return -ENXIO;	// 这里 UART_NR的值是预处理的时候就确定的

综上:msm_hsl_uart_ports的元素个数是3的话,设备树中配置第四个uart会直接结束probe函数,不会打印相关log。
在msm_hsl_uart_ports中添加一个元素即可解决我遇到的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183840.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月31日 下午12:36
下一篇 2022年8月31日 下午12:36


相关推荐

  • 整数转换为罗马字符串_字符型转换成int型

    整数转换为罗马字符串_字符型转换成int型给定一个整数数字s,(1罗马数字I,II,III,IV,V分别代表数字1,2,3,4,5。 格式:   第一行输入一个整数,接下来输出对应的罗马数字。 首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。 在构成数字的时候,有下列规则:

    2026年4月16日
    6
  • TP框架的目录结构总结

    TP框架的目录结构总结用 thinkphp 开发了好些项目了 最近准备抽空写一些经验总结 希望能给刚开始接触 tp 的童鞋们提供一些开发的方案 少走一些弯路 少踩一些坑 这些绝对都是些精华干货 耐着性子阅读 相信肯定是会有收获的 先从 thinkphp 的目录架构开始吧 koudaigaoxia Application 项目逻辑目录 Common 公共模块

    2026年3月17日
    1
  • SOAP协议详解「建议收藏」

    SOAP协议详解「建议收藏」一.概念:SOAP:简单对象访问协议,是交换数据的一种协议规范,它是一个轻量级\简单的\基于xml的协议;它被设计成在WEB上交换结构化的和固化的信息。二.相关定义1.基于类对象的传输协议;2.SOAP封装(envelop),它定义了一个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;3.SOAP编码规则(encodingrules),它定义了一种序列化机制,用

    2022年7月12日
    38
  • FlashFXP注册码-FlashFXP密钥

    FlashFXP注册码-FlashFXP密钥flashfxp3.41中文版注册码:(适合最新版本)推荐(尚未被封的Realkey)FLASHFXPvACq2ssbvAAAAAC1W7cJKQTzmx77zmqJICvA7d3WnUtWNXdrp8YuERRFdIvXfOPbcpABkVix2aRTgg6afcIKFPxS72XYljdE9tgQD/2r+kmfVBngGM4Qc9p7e0PcTfFF/1tt2bqlxS8r…

    2022年7月26日
    14
  • keil生成bin文件失败_编译后生成的文件扩展名为

    keil生成bin文件失败_编译后生成的文件扩展名为在KEIL魔术棒中通过以下方式生成bin文件时,居然出错,当时震惊了,第一次出现这种情况:使用的命令:fromelf–bin–output.\bin\APP.bin.\STM32_APP\STM32_APP.axf生成的bin文件,居然变成了文件夹!如下图:一开始以为是ROM地址设置的不对,找之前的工程来对比“魔术棒”中的配置,发现没有问题!然后怀疑是工程文件名称太长,或者下划线太多。。。重新新建工程,重命名文件夹等各种操作,发现问题依旧!然后嫉妒怀疑是KEIL的BUG.

    2022年10月20日
    3
  • 旅游胜地HTML,中国旅游胜地(一生必去的30个旅游景点)

    旅游胜地HTML,中国旅游胜地(一生必去的30个旅游景点)中国著名旅游景点十大必去之地小贴士:11来了,大家都在计划这个长假去哪里。当你真的去了很多景点,发现都是“平平淡淡”,名不副实。但是你知道吗,萧艾推荐的以下10个中国著名旅游景点不仅有名,而且“名不虚传”,他们从来不后悔去那里。他们是哪十个?别担心,让萧艾一个一个给你介绍。1、丽江古城上市理由:看小酒店露台上的雪山;漫步四方街,享受夏日午后慵懒的阳光;隔着窗户听纳西人的古乐,时间一不小心就过去了,…

    2022年6月9日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号