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


相关文章
|
8月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
439 32
|
10月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2883 77
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
572 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
270 6
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
314 5
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
458 3
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
335 0
|
4月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
584 1
二、Linux文本处理与文件操作核心命令
|
4月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
368 137