1.内核修改
涉及到的内核文件包括driver/char/tty_ioctl.c和arch/xx/include/asm/termbits.h
在linux内核中,struct ktermios结构的c_cflags共有5个位用来标注波特率,其中位CBAUDEX表明使用的是POSIX标准波特率还是扩展波特率,
POSIX规定了16个标准波特率,为B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400,不过遗憾的是,现在
的USB to Serial芯片能工作的波特率远远大于B38400(例如PL2303最高波特率可以到12M bps),这些非标的波特率,只能使用CBAUDEX标志来使用了.
毫无疑问,5位的值,最多能支持32种不同的波特率.
例如对于pl2303,驱动支持3M/6M/12M bps,因此可以在内核中增加三个波特率B3000000,B6000000,B12000000.
(1)修改driver/char/tty_ioctl.c中的baud_table[]和baud_bits[]为以下代码:
static const speed_t baud_table[] =
{
0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,/*the POSIX std*/
57600,115200,
3000000,6000000,12000000/*pl2303 ext*/
};
static const tcflag_t baud_bits[] =
{
B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,B1800,B2400,B4800,B9600,B19200,B38400,B57600,B115200,/*the POSIX std*/
B3000000,B6000000,B12000000/*pl2303 ext*/
};
(2)修改arch/xx/include/asm/termbits.h的Bxxxx定义如下:
#define B0 0000000 /* hang up */
#define B50 0000001
#define B75 0000002
#define B110 0000003
#define B134 0000004
#define B150 0000005
#define B200 0000006
#define B300 0000007
#define B600 0000010
#define B1200 0000011
#define B1800 0000012
#define B2400 0000013
#define B4800 0000014
#define B9600 0000015
#define B19200 0000016
#define B38400 0000017
#define BOTHER 0010000
#define B57600 0010001
#define B115200 0010002
#define B3000000 0010003
#define B6000000 0010004
#define B12000000 0010005
/*后面的波特率本人没有使用到,但如果不定义则内核无法编译通过!*/
#define B230400 0010006
#define B460800 0010007
#define B500000 0010010
#define B576000 0010011
#define B921600 0010012
(3)重新编译内核,重启后则新内核将支持B3000000/B6000000/B12000000的波特率
2.应用层修改
libc中的cfsetispeed()和cfsetospeed()因为不支持非标波特率,因此调用这两个函数会返回-1,应用程序需要使用如下方式:
if(baud_rate <= B38400)
{
cfsetispeed(&opt,baud_rate);
cfsetospeed(&opt,baud_rate);
}
else
{
opt.c_cflag |= CBAUDEX;
baud_rate -= 4096;/*baud_rate取值为1 ~ 5,分别对应B57600/B115200/B3000000/B6000000/B12000000*/
cfsetispeed(&opt,baud_rate);
cfsetospeed(&opt,baud_rate);
}