zynq操作系统: Linux驱动开发串口波特率 非标准波特率 10mb

简介: zynq操作系统: Linux驱动开发串口波特率 非标准波特率 10mb

前言

 上一篇解决了常用的波特率的设置,但是实际使用中,总会遇到些奇葩的甚至串口工具都无法帮到忙的的波特率,比如10兆?研究非标准的波特率时误打误撞,再加上一个残暴的解决办法,终于是给强行凑出来了(Linux内核版本4.14.0)

第一步:内核部分需要改3处,相关文件共两个

 分别是drivers/tty 目录下 tty_baudrate.c,和/include/uapi/asm-generic 目录下 termbits.h

#define sparc 
static const speed t baud table[] = {
日,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200,230400,460800,#ifdef_sparc_
76800,153600,307200,614400,921600#else
50000日, 576000, 921600,1000000,1152000,1500000,2000000,2500000,3000000,3500000,4000000#endif};
#ifndef sparc 
static const tcflag t baud bits[] = {
B0,B50,B75,B110,B134,B150,B200,B300,B600, B1200,B1800,B2400,B4800,B9600,B19200,B38400, B57600, B115200,B230400,B460800,B500000, B576000
B921600,B1000000,B1152000, B1500000, B2000000, B2500000, B3000000,B3500000, B4000000};
#else
static const tcflag t baud bits[] = {
BO,B50,B75,B110,B134,B150,B200,B300,B600, B1200,B1800,B2400,B4800,B9600,B19200,B38400, B57600,B115200,B230400,B460800,B76800,B153600, B307200,B614400,B921600};
#endif  Hx--1024

第一处,打开 sparc 宏定义( tty_baudrate.c)

 在上图所示的位置打开宏定义,里面就会有几个非标准的波特率可以选择的,我选择了614400的基础上进行替换(本来只是想试试不同的波特率,天知道怎么瞎猫碰到了死耗子一下就改成功了,替换掉还不行,当真是一个bug(或许不是bug?就当是一个黑盒子好了)撑起来整个代码结构),不说废话了,这里只需要添加:

#define    __sparc__

第二处,修改输入输出速率:( tty_baudrate.c)

 我们很容易知道,配置速率的函数都会调用到cfsetispeed和cfsetospeed,往上层找,不难发现ispeed和ospeed在这里用ibaud和obaud进行了赋值(主要是这个c文件的名字也太像专门用来改波特率的了)那么尝试直接在这里暴力赋值(所幸调试串口并没有受到惨烈的波及,仅仅在内核打印部分在这一句往后会乱码,不影响登录后的命令发送,而且dmesg还是可以看到完整信息的)

 在这里尝试修改后,有趣的现象发生了,理想状态下应该所有的波特率都会改变,但是在用上一篇编好的测试代码测试时,发现居然波特率还是115200,只是用命令行发送的波特率是10兆(开机后的第一次是9600默认值,也没找出来哪来的,再次运行就“正常”了),这就意味着对波特率的设置仍然是可控的!于是就有了修改上一处的想法。

void tty termios encode baud rate(struct ktermios *termios,
speed t ibaud, speed t obaud)
{
int i = 0;
int ifound =-1,ofound =-1;
// printk("ibaud is ad,obaud is ad",ibaud,obaud); ibaud = 10000000; obaud = 10000000;
// printk("ibaud2 is ad,obaud2 is *d",ibaud,obaud); int iclose = ibaud/50, oclose = obaud/50; int ibinput = 日;
if
(obaud == 0)  /* CD dropped */  
ibaud = 0;  /* Clear ibaud to be sure */  
termios->c ispeed = ibaud;
termios->c ospeed = obaud;  Hx--1024

第三处:需要修改termbits.h,

 为了防止内核编译报错,需要注意的这里应该是8进制的,随便加了几个

146 #define B115200 0010002 
147 #define B230400 0010003 
148 #define B460800 0010004 
149 #define B500000 0010005 
150 #define B576000 0010006 
151 #define B921600 0010007 
152 #define B1000000 0010010  
153 #define B1152000 0010011  
154 #define B1500000 0010012  
155 #define B2000000 0010013  
156 #define B2500000 0010014  
157 #define B3000000 0010015  
158 #define B3500000 0010016  
159 #define B4000000  0010017 
160 #define B76800  0010020 
161 #define B153600 0010021 
162 #define B307200 0010022 
163 #define B614400 0010023 Hx--1024

第二步:应用部分需要改

 应用层可能是没包含有些内核库还是编译什么的问题,保险起见将刚刚宏定义的部分在应用层做了一样的粘贴(确保和内核是连接上了)

 然后就是在之前设置的部分,设置非标准波特率的标志位了

//修改控制模式,保证程序不会占用串口 options.c cflag |= CLOCAL;
//修改控制模式,使得能够从串口中读取输入数据 options.c cflag |= CREAD;
//清bit位 关闭字符映射 0x0a 0x0d
options.c iflag &=~(INLCR|ICRNL);//清bit位 关闭流控字符 0x11 0x13 options.c iflag &=~(IXON);
options.c cflag = CBAUDEX;//设置特定波特率的标志位.  
//设置数据流控制 switch(flow ctrl)
{
case日 ://不使用流控制
options.c cflag &= ~CRTSCTS; break;
case 1 ://使用硬件流控制
options.c cflag |= CRTSCTS; break;
case  2 ://使用硬件流控制DTR/DSR 
options.c cflag &=~CRTSCTS; break;
case  3 ://使用软件流控制  
options.c cflag |= IXON | IXOFF | IXANY; break;
Hx--1024

 接下来再改就是改上一篇里的固定数组了,加入614400,然后初始化值挑一路串口设置,发送0x55,用示波器一量,嘎嘎好使,就这样东拼西凑,应个急是肯定了;以后有时间研究清楚再次补充吧

2021042118021297.png


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
8天前
|
缓存 资源调度 安全
深入探索Linux操作系统的心脏——内核配置与优化####
本文作为一篇技术性深度解析文章,旨在引领读者踏上一场揭秘Linux内核配置与优化的奇妙之旅。不同于传统的摘要概述,本文将以实战为导向,直接跳入核心内容,探讨如何通过精细调整内核参数来提升系统性能、增强安全性及实现资源高效利用。从基础概念到高级技巧,逐步揭示那些隐藏在命令行背后的强大功能,为系统管理员和高级用户打开一扇通往极致性能与定制化体验的大门。 --- ###
29 9
|
8天前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
24 2
|
12天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
34 4
|
11天前
|
安全 网络协议 Linux
Linux操作系统的内核升级与优化策略####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统内核升级的重要性,并详细阐述了一系列优化策略,旨在帮助系统管理员和高级用户提升系统的稳定性、安全性和性能。通过实际案例分析,我们展示了如何安全有效地进行内核升级,以及如何利用调优技术充分发挥Linux系统的潜力。 ####
31 1
|
14天前
|
物联网 Linux 云计算
Linux操作系统的演变与未来趋势####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其在服务器、桌面及嵌入式系统领域的应用现状,并展望了云计算、物联网时代下Linux的未来趋势。通过回顾历史、剖析现状、预测未来,本文旨在为读者提供一个全面而深入的视角,以理解Linux在当今技术生态中的重要地位及其发展潜力。 ####
|
19天前
|
边缘计算 人工智能 运维
Linux操作系统:开源力量的崛起与影响###
一场技术革命的回顾 回溯至1991年,当Linus Torvalds宣布Linux操作系统的诞生时,世界或许并未意识到这一举措将如何深刻地改变技术领域的面貌。本文旨在探讨Linux操作系统的发展历程、核心特性、以及它如何引领了一场开源运动,重塑了软件行业的生态。从最初的个人爱好项目成长为全球最广泛采用的服务器操作系统之一,Linux的故事是技术创新与社区精神共同推动下的辉煌篇章。 ###
|
18天前
|
人工智能 安全 Linux
|
20天前
|
物联网 Linux 5G
Linux操作系统的演变与未来趋势####
本文深入探讨了Linux操作系统的发展历程,从最初的一个学生项目到如今全球最流行的开源操作系统之一。文章将分析Linux的核心优势、关键特性以及它在云计算、物联网和嵌入式系统中的应用前景。通过具体案例展示Linux如何推动技术创新,并预测其在未来技术生态中的角色。本文旨在为读者提供一个全面而深入的理解,帮助他们认识到Linux在现代计算环境中的重要性及其未来的潜力。 ####
|
20天前
|
人工智能 安全 物联网
Linux操作系统的演变与未来:从开源精神到万物互联的基石###
本文是关于Linux操作系统的演变、现状与未来的深度探索。Linux,这一基于Unix的开源操作系统,自1991年由林纳斯·托瓦兹(Linus Torvalds)学生时代创造以来,已经彻底改变了我们的数字世界。文章首先追溯了Linux的起源,解析其作为开源项目的独特之处;随后,详细阐述了Linux如何从一个小众项目成长为全球最广泛采用的操作系统之一,特别是在服务器、云计算及嵌入式系统领域的主导地位。此外,文章还探讨了Linux在推动技术创新、促进协作开发模式以及保障信息安全方面的作用,最后展望了Linux在未来技术趋势中的角色,包括物联网、人工智能和量子计算等前沿领域的潜在影响。 ###
|
24天前
|
存储 Linux Shell
深入理解Linux操作系统的启动过程
【10月更文挑战第21天】本文将深入浅出地介绍Linux操作系统的启动过程,包括BIOS、引导加载程序、内核初始化和系统服务启动等环节。通过阅读本文,您将了解到Linux启动过程中的关键步骤和相关概念,以及如何优化启动速度。

热门文章

最新文章