zoukankan      html  css  js  c++  java
  • (笔记)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);
     }

  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/tdyizhen1314/p/4147565.html
Copyright © 2011-2022 走看看