APQ-8016 Snapdragon 410c:Linaro中的非标准UART波特率

时间:2016-09-10 19:53:52

标签: linux linux-kernel serial-port linux-device-driver uart

运行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

1 个答案:

答案 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

另请参阅此问题:How to set a custom baud rate on Linux?