I had similar problem and wasn't able to find correct tool for my case, so I decided it's faster to come up with my own code. Next code uses termios2
API (and BOTHER
flag, that Andy Shevchenko mentioned in his comment) for setting custom baud rate for serial port.
Never looked in your serial driver code, but you can try this code first:
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 */
Build:
$ gcc -Wall -O2 main.c -o set-tty-speed
Usage:
$ ./set-tty-speed /dev/ttyMSM1 250000
Also see this question: How to set a custom baud rate on Linux?