(筆記)linux增加非標波特率的方法


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);
 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM