现在的位置: 首页 > 综合 > 正文

linux tty 之注册一个线路规程

2013年04月21日 ⁄ 综合 ⁄ 共 1835字 ⁄ 字号 评论关闭

        在tty程序中注册一个线路规程驱动是一件很轻松的事情。

1、编写线路规程驱动函数

      我们知道tty线路规程的操作函数集为struct tty_ldisc_ops。我们要做的第一件事情便是实现这个操作函数集。例如:

      static struct tty_ldisc_ops ps_ldisc_ops = {

                .magic        = TTY_LDISC_MAGIC,

                .name         = "n_ps_ldisc";

                .open          = ps_tty_open,

                .close         = ps_tty_close,

                .receive_buf       = ps_tty_receive,

                ......

      } ;

2、定义表示我们线路规程驱动的编号

      在include/linux/tty.h中定义我们线路规程驱动的编号:

       #define N_TTY_BFG   27

       需要注意的是,N_TTY_BFG不能与别的线路规程的编号相同,而且N_TTY_BFG的取值范围在N_TTY ~ NR_LDISCS之间。

3、调用函数tty_register_ldisc()注册线路驱动。

       具体使用如下:

       err = tty_register_ldisc(N_HW_BFG, &ps_ldisc_ops);
       if (err) {

              ......
              return -EFAULT;
       }

       tty_register_ldisc(),注册成功,函数返回0,失败返回-EINVAL。

       该函数的具体定义如下:    

        int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
        {
                  unsigned long flags;
                  int ret = 0;

                  if (disc < N_TTY || disc >= NR_LDISCS)
                            return -EINVAL;

                   spin_lock_irqsave(&tty_ldisc_lock, flags);
                   tty_ldiscs[disc] = new_ldisc;
                   new_ldisc->num = disc;
                   new_ldisc->refcount = 0;
                   spin_unlock_irqrestore(&tty_ldisc_lock, flags);

                   return ret;
        }

        需要注意的是,tty_register_ldisc()只是注册了一个线路规程,tty并没有调用该线路规程。一个串口可能对应着N个已被注册的线路规程,至于最后调用哪个线路规程的驱动,这需要用户在打开串口后使用ioctl()来选择。具体程序如下:

          /* 选择线路规程 */

         ldisc = N_TTY_BFG;          //因为用户空间不能包含内核空间的头文件,故N_TTY_BFG需要在用户空间重新定义一次
         if (ioctl(uart_fd, TIOCSETD, &ldisc) < 0)  {   
                  close_uart();
                  return -1;
          }

4、调用tty_unregister_ldisc()注销线路规程

        err = tty_unregister_ldisc(N_HW_BFG);
        if (err)
        {
            printk(KERN_ERR"unable to un-register ldisc %d", err);
        }

 

 

 

 

       

 

 

 

 

 

抱歉!评论已关闭.