LINUX的库提供的波特率是标准波特率,应用时有时会用到非标准的波特率。以下试验使用的xilinx的zynq7020,linux内核是4.14版本。以增加波特率100k为例。看了一些直接在应用端改的一些方法,已经取消了,所以更改了内核
第一步,内核需要更改两个地方,一是/drivers/tty/tty_baudrate.c,另一个是/include/uapi/asm-generic/termbits.h
先看第二个,这个CBAUD原来是0010017改为0030017,见图1,是用来做掩码计算的。
图1
这两个是新加的,如图2
图2
这个头文件一共更改这三个地方。先说为什么增加波特率使用0020001而不在B4000000后面递增使用0010020,这是因为这个低位的20已经被占用了,如下图3,所以找了没被占用的位置,0020000的中2这个bit位置在c_cflag中没被占用(c_cflag是用于设置波特率和其他一些信息的)。第一处的0030017也是这个原因,就是将波特率即可使用的这些宏定义包含进去。
图3
第二步,更改文件/drivers/tty/tty_baudrate.c,这个文件就是获取波特率具体数值的文件,应用端的数据传入到内核,内核解析并获得100k波特率这个数值就是在这个文件,
先在文件头部的波特率列表中增加所需数值,如图4,其中的100000和B100000为新增加。
图4
修改函数speed_t tty_termios_baud_rate(struct ktermios *termios),图5
图5
其中圈起来的地方是新加的,这就是根据刚才新加的部分进行波特率修改,新的0020001,与CBAUDEX2进行运算判断高位位置,之所以cbaud+=30是因为前面已经有了30个波特率了,见图5。这样内核就修改完了。
第三步,应用端的配置,应用端通常使用tcsetattr这个函数进行配置,在使能之前,对齐c_cflag进行赋值就可
struct termios , termios_new;
termios_new.c_cflag |= 0020001;
(其余配置省略)
tcsetattr(fdcom, TCSANOW, &termios_new);
这样串口波特率即更改为100k,如需其他波特率在头文件处增加,应用端赋值对应数值即可。