运行Linux(linaro)的Snapdragon 410c ttyMSM1(msm_serial)是否能够原生地提供250,000波特率的DMX协议?
root@linaro-developer:~# stty -F /dev/ttyMSM1 cs8 -parenb cstopb 250000
stty: invalid argument ‘250000’
Try 'stty --help' for more information.
250000不在kernel / drivers / tty / tty_ioctl.c:baud_table []中支持的波特率列表中,并且setserial custom 38400 baudrate命令不能正确覆盖波特率。
root@linaro-developer:~# setserial -av /dev/ttyMSM1 spd_cust
[ 491.312449] msm_serial 78af000.serial: setserial sets custom speed on ttyMSM1. This is deprecated.
在这里交叉发布(当我努力回答时,我将保持两个板同步): http://www.96boards.org/forums/topic/linaro-ttymsm1-uart0-dmx-250000-baudrate/#post-17264
答案 0 :(得分:0)
我有类似的问题,并且无法为我的案例找到正确的工具,因此我认为提出自己的代码更快。下一代码使用termios2
API(以及Andy Shevchenko在其评论中提到的BOTHER
标志)来设置串口的自定义波特率。
从未查看过您的串行驱动程序代码,但您可以先尝试此代码:
<强>的main.c 强>:
#include "termios2.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(int argc, char *argv[])
{
struct termios2 tio;
int fd, ret, speed;
if (argc != 3) {
printf("%s device speed\n\n"
"Set speed for a serial device.\n"
"For instance:\n %s /dev/ttyUSB0 75000\n",
argv[0], argv[0]);
return EXIT_FAILURE;
}
fd = open(argv[1], O_RDONLY);
if (fd == -1) {
perror("open() error");
return EXIT_FAILURE;
}
speed = atoi(argv[2]);
ret = ioctl(fd, TCGETS2, &tio);
if (ret == -1) {
perror("TCFETS2 error");
close(fd);
return EXIT_FAILURE;
}
/* Speed settings */
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = speed;
tio.c_ospeed = speed;
/* Ignore CR (\r) characters */
tio.c_iflag |= IGNCR;
ret = ioctl(fd, TCSETS2, &tio);
if (ret == -1) {
perror("TCSETS2 error");
close(fd);
return EXIT_FAILURE;
}
close(fd);
return 0;
}
<强> termios2.h 强>:
/* The content for this file was borrowed from:
* /usr/include/asm-generic/termbits.h
*
* We can't just include <asm/termios.h>, because it will interfere with
* regular <termios.h> (compiler will give some errors).
* So it's better to copy needed stuff here instead.
*/
#ifndef TERMIOS2_H
#define TERMIOS2_H
#include <termios.h>
/* termios.h defines NCCS as 32, but for termios2 we need it to be 19 */
#undef NCCS
#define NCCS 19
#define BOTHER 0010000
struct termios2 {
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
};
#endif /* TERMIOS2_H */
构建
$ gcc -Wall -O2 main.c -o set-tty-speed
用法:
$ ./set-tty-speed /dev/ttyMSM1 250000