rk3399-uboot2017-增加串口通信

news2024/11/25 2:35:15

一、主要还是解决这个问题,最后没办法,只能进行串口通信,来识别屏幕的类型了。

基本步骤如下:

1. uboot阶段发送串口指令,等待串口回复数据,根据数据识别屏幕类型

2.在bootargs增加一个自定义的参数,告诉内核屏幕的类型,驱动中更加屏幕类型使用不同的时序

本文只讲uboot中串口的设置,本次项目中使用的是串口4.

参考文件:drivers/serial/ns16550.c (uboot2017.09源码)

二、遇到的问题:

1.要不要使用dts?,由于能力有限,没有使用dts设置

2.如何初始化?

3.如何进行io复用?

4.调试的时候遇到的问题,就是无法通信,使用ttl的串口连着,看到又0xff,00,00三个字节输出,但是这三个字节都不是我自己发送的。开始时怀疑波特率的问题,因为我实际发送了8个字节,而只收到了3个字节,那就时钟配置不对,又把时钟的配置找了一圈,后面确认是24MHz。

5.时钟确认之后,后来发现是引脚复用不对,由于不熟悉3399的结构,弄混了GRF和PMUGRF,以为是同一个东西。直接就用错了,后来改了过来。

6.还是要适当使用uboot的md和mm工具,这样能方便直接读取寄存器的内容,根据实际的值去判断设置是否正确。

7.serial_din和serial_in也是一定要慎重,这个地方用错了,直接导致uboot崩了,无法进入loader模式,差点成砖了,还好最后发现还能用短路(emmc_clk和GND)的办法进入到maskrom模式。

三、代码

直接在ns16550.c中参考,并写在了该文件中。

 特别说明以下:

1.接收函数我使用了一个超时返回的方法,因为接收不到值得时候(比如没有连接屏,或者连接的屏型号不对呢等等各种因素吧),我不能一直卡着,就直接启动了。

2.发送函数我写死了,因为我只有一条查询指令,干脆就直接写了,要灵活使用的朋友注意一下。

#define PMUCRU_BASE	0xff750000


void board_com4_init(void)
{
//gpio的初始化
#define PMUGRF_BASE	0xff320000
	struct rk3399_pmugrf_regs * const pmugrf = (void *)PMUGRF_BASE;

	/* Enable early UART4 channel on the RK3399/RK3399PRO */
	rk_clrsetreg(&pmugrf->gpio1a_iomux,
		     PMUGRF_GPIO1A7_SEL_MASK,
		     PMUGRF_UART4_RXD << PMUGRF_GPIO1A7_SEL_SHIFT);
	rk_clrsetreg(&pmugrf->gpio1b_iomux,
		     PMUGRF_GPIO1B0_SEL_MASK,
		     PMUGRF_UART4_TXD << PMUGRF_GPIO1B0_SEL_SHIFT);
	printf("board_com4_init done..\n");

}




void com4_init(void)
{
	struct NS16550 *com_port = (struct NS16550 *)0xff370000;  //com4
	int baud_divisor;
	
//	unsigned int val_temp;

	

//	volatile unsigned long* pmucru_clksel_con5 = (volatile unsigned long*)(PMUCRU_BASE + 0x0094);
//	val_temp = *pmucru_clksel_con5;
//	printf("1. val_temp = %u\n",val_temp);
//	val_temp &= ~(3 << 8);
//	val_temp |= (2<<8) | (2<<14);   //默认值是2,     时钟源选择24M输入
//	* pmucru_clksel_con5 = val_temp;
	/*
	 * We copy the code from above because it is already horribly messy.
	 * Trying to refactor to nicely remove the duplication doesn't seem
	 * feasible. The better fix is to move all users of this driver to
	 * driver model.
	 */
	baud_divisor = ns16550_calc_divisor(com_port, 24000000,
						115200);

	serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
	serial_dout(&com_port->mdr1, 0x7);
	serial_dout(&com_port->mcr, 0);
	serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
//	serial_dout(&com_port->fcr, UART_FCR_RXSR | UART_FCR_TXSR);   //不使能FIFO

	serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);   //设置波特率
	serial_dout(&com_port->dll, baud_divisor & 0xff);
	serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);	
	serial_dout(&com_port->lcr, UART_LCRVAL);
	serial_dout(&com_port->mdr1, 0x0);

	//1. gpio 初始化
	board_com4_init();

	printf("12-07-1,end com4_init\n");
	
}


void com4_send_cmd(void)
{	
	struct NS16550 *com_port = (struct NS16550 *)0xff370000;  //com4

	char cmd_buf[] = {0xa5,0x5a,0x88,0,0,0,0,0x87};
	int i;
	
	for(i=0;i<8;i++)
	{
		while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
		;
		serial_dout(&com_port->thr, cmd_buf[i]);
	//	printf("cmd_buf[i] = %d\n",cmd_buf[i]);
	}
	//	NS16550_putc(com_port, cmd_buf[i]);
	
}


//int is_com4_recv_data(void)
//{
//	struct NS16550 *com_port = (struct NS16550 *)0xff370000;  //com4
//
//	return(serial_in(&com_port->lsr) & UART_LSR_DR);
//
//}

//-1 表示出错
int com4_recv_a_byte_data(void)
{
	struct NS16550 *com_port = (struct NS16550 *)0xff370000;  //com4
	int i = 0;

	while(!(serial_din(&com_port->lsr) & UART_LSR_DR))  //返回0表示没有数据
	{
		mdelay(1);   //延时1ms
		i++;
		if(i>=200)   //最多等待200ms
			return -1;
	}
	return serial_din(&com_port->rbr);   //收到数据了
}


宏定义自己加一下,grf_rk3399.h

 

实际使用的代码如下:

接收8个字节的代码,不是阻塞等待,是超时处理!!!! 


//返回-1 就是超时,-3表示校验和错误。
int com4_recv_lcd_type_data(void)
{
	char cmd_buf[12];
	int count = 0;
	int ret_val = 0;
//	int val;

	while(1)
	{
		ret_val = com4_recv_a_byte_data();
		if(ret_val == -1)  //出错了
			return -1;
		
		cmd_buf[count] = ret_val;
		if(count == 0){
			if(cmd_buf[count] != 0xa5)
			{
				count = 0;
				continue;
			}
		}
		else if(count == 1){
			if(cmd_buf[count] != 0x5a)
			{
				count = 0;
				continue;
			}
		}
		else if(count >= 7)   //接收结束
		{
			printf("com4 lcd_type data :%x %x %x %x-- %x %x %x - %x\n",cmd_buf[0],cmd_buf[1],cmd_buf[2],cmd_buf[3],
					cmd_buf[4],cmd_buf[5],cmd_buf[6],
					cmd_buf[7]);
			//val = cmd_buf[0]+cmd_buf[1]+cmd_buf[2]+cmd_buf[3]+cmd_buf[4]+cmd_buf[5]+cmd_buf[6];
			if(((cmd_buf[2]+cmd_buf[3])&0xff) ==  cmd_buf[7])
				return cmd_buf[3];

//			printf("%x %x %x %x-- %x %x %x - %x\n",cmd_buf[0],cmd_buf[1],cmd_buf[2],cmd_buf[3],
//					cmd_buf[4],cmd_buf[5],cmd_buf[6],
//					cmd_buf[7]);
			break;
		}
		
		count ++;
	}

	return -3;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个完整的项目是如何开展的:对项目生涯的总结

我正在参加「掘金启航计划」 变量的类型指的是变量的特性或特征&#xff0c;比如表示数字类型、文本类型、集合类型等&#xff0c;表示的是一类数据。 Dart提供以下的内置类型&#xff1a; 数字&#xff1a;int, double (整型(表示整数)&#xff0c;浮点型(表示小数))布尔&a…

程序员如何平衡主业和副业?

什么是副业&#xff1f; 对于副业的定义&#xff0c;每个人都有自己的见解。不过对大部分人来说&#xff0c;副业相对于主业而言&#xff0c;就是工作日朝九晚五的工作称为主业&#xff0c;其他时间做的赚钱的项目或者工作可以称之为副 副业可以是写文章、拍视频、打代码&…

干扰管理学习日志8-------多用户联合_资源卸载_功率分配_计算资源分配

目录一、文章概述二、系统模型环境三、理论模型1.系统目标2.约束条件3.公式推导四、算法设计1.上行链路功率分配策略(1)任务目标(2)伪代码2.中央服务器算力分配策略3.任务卸载策略(1)任务目标(2)卸载集缩小条件(3)卸载集扩充条件(4)策略(5)伪代码五、性能表征本文是对论文《Mul…

[Linux]----初始网络

文章目录前言一、计算机网络的背景重新看待计算机结构网络发展认识"协议"二、网络协议初始软件分层协议分层OSI七层模型TCP/IP五层(四层)模型三、网络传输的基本流程网络和操作系统之间的关系局域网通信的原理四、数据包的封装和分用五、网络中的地址管理认识IP地址认…

2004-2020年全国30省工业污染治理完成投资数据

2004-2020年全国30省工业污染治理完成投资数据 1、时间&#xff1a;2004-2020年 2、范围&#xff1a;包括全国30个省&#xff0c;不含西藏 3、来源&#xff1a;国家统计J 4、缺失情况说明&#xff1a;无缺失 5、指标说明&#xff1a; 目前虽然采取了一系列环境规制相关政…

[附源码]Python计算机毕业设计SSM基于Web学术会议投稿管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

二元灰狼优化(BGWO)应用于特征选择任务(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 特征选择是当前信息领域,尤其是模式识别领域的研究热点。该代码演示了BGWO如何使用基准数据集Main解决特征选择问题。 &#…

python国际化课程capstone(ML预测ACM队员获奖概率)

目录 前言 原始数据集 爬虫部分 爬取每个队员在buct做题数量 爬取每个队员codeforces的最高分&#xff0c;注册时间&#xff0c;解题数量 爬取每个队员有效做题时间 数据处理部分 模型部分 Linear Regression XGBregressiongridsearchCV调参 Random Forset 前言 刚…

Redis框架(九):大众点评项目 缓存工具封装

大众点评项目 缓存工具封装需求&#xff1a;缓存工具封装业务实现代码总览总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代码仓库在原有基础…

视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等

1、引言 随着移动网络网速的提升与资费的降低&#xff0c;视频直播作为一个新的娱乐方式已经被越来越多的用户逐渐接受。特别是最近这几年&#xff0c;视频直播已经不仅仅被运用在传统的秀场、游戏类板块&#xff0c;更是作为电商的一种新模式得到迅速成长。 本文将通过介绍实时…

爆火Chatgpt注册完全指南

1 chatgpt 简介 ChatGPT是一种语言模型&#xff0c;它被训练来对对话进行建模。它能够通过学习和理解人类语言来进行对话&#xff0c;并能够生成适当的响应。ChatGPT使用了一种叫做Transformer的神经网络架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;能够在输入…

第33篇 网络(三)FTP(一)

导语 上一节我们讲述了HTTP的编程&#xff0c;这一节讲述与其及其相似的FTP的编程。FTP即FileTransfer Protocol&#xff0c;也就是文件传输协议。FTP的主要作用&#xff0c;就是让用户连接上一个远程计算机&#xff0c;查看远程计算机有哪些文件&#xff0c;然后把文件从远程…

STM32F4 | STM32CubeMX 图形配置工具

文章目录一、STM32CubeMX 简介二、STM32CubeMX 运行环境搭建1.Java环境安装2.STM32CubeMX 图形化工具安装三、使用 STM32CubeMX 工具配置工程模板1.工程初步建立和保存2.RCC 设置3.时钟系统&#xff08;时钟树&#xff09;配置4.GPIO 功能引脚配置5.生成工程源码6.编写用户程序…

汽车行业:充分借力数据价值,推动数字化营销链路闭环

当下&#xff0c;汽车行业已慢慢由曾经的增量市场逐步转变为存量市场。更年轻的消费群体偏好、更精准智能的营销投放策略和强势入局的新能源汽车等因素都在推动着汽车行业的不断发展。对于汽车厂商和垂域媒体来说&#xff0c;进行丰富的人群洞察与用户分层&#xff0c;能挖掘更…

陪诊服务系统源码,可以在线预约陪诊师的软件平台

随着生活方式受互联网的影响&#xff0c;我们的各方面都变得更加便利&#xff0c;也伴随着我国人口老龄化&#xff0c;大部分年轻人都选择了外出打工&#xff0c;背井离乡&#xff0c;从而没有办法待在父母身边照顾&#xff0c;陪诊师就是在这个大背景下诞生了&#xff0c;陪诊…

班级校园网页设计作业 静态HTML我的班级网页 DW班级网站模板下载 大学生简单班级网页作品代码 我的大学网页制作 学生班级网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

LeetCode刷题复盘笔记—一文搞懂动态规划之121. 买卖股票的最佳时机问题(动态规划系列第二十篇)

今日主要总结一下动态规划的一道题目&#xff0c;121. 买卖股票的最佳时机 题目&#xff1a;121. 买卖股票的最佳时机 Leetcode题目地址 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一…

QML入门教程:QML和QtQuick简介以及QML实例

从 Qt 4.7 开始&#xff0c;Qt 引入了一种声明式脚本语言&#xff0c;称为 QML&#xff08;Qt Meta Language 或者 Qt Modeling Language&#xff09;&#xff0c;作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。…

激光焊接3系铝合金的工艺分析

随着汽车行业的不断壮大&#xff0c;纯电动汽车和燃料电池汽车将共同主导中国新能源汽车市场的未来发展。电动车轻量化和燃料电池的大量使用&#xff0c;必然涉及到越来越多的铝合金焊接工艺。铝合金具有良好的物理、化学和机械性能&#xff0c;是工业生产中一种重要的轻金属材…

搜索引擎搜索特定网站的方法 :site

前言 从13开始的贴吧时代&#xff0c;还记得当时在贴吧里要搜索某些特定的帖子或者关键字的时候&#xff0c;用的都是“吧内搜索”&#xff0c;但用过的人都知道&#xff0c;这个所谓的吧内搜索其实很难用&#xff0c;大家都是用关键字空格贴吧之类的办法去搜索相关的内容。我…