code:klopen - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 打开 KL/DL-11 设备
8022 /* ------------------------- */

8023 klopen(dev, flag)

8024 { register char * addr;

8025     register struct tty *tp;

8026     if(dev.d_minor >= NKL11+NDL11) {

8027          u.u_error = ENXIO;

8028          return;

8029     }

  • 次设备号越界 , 则抛出错误
8030     tp = &kl11[dev.d_minor];
8031     if (u.u_procp->p_ttyp == 0) {

8032          u.u_procp->p_ttyp = tp;

8033          tp->t_dev = dev;

8034     }

  • 若 现行进程 未分配 tty,则分配
8035     /* set up minor 0 to address KLADDR

8036      * set up minor 1 thru NKL11-1 to address from KLBASE

8037      * set up minor NKL11 on to address from DLBASE

8038      */

8039     addr = KLADDR + 8*dev.d_minor;

8040     if(dev.d_minor)

8041          addr =+ KLBASE-KLADDR-8;

8042     if(dev.d_minor >= NKL11)

8043          addr =+ DLBASE-KLBASE-8*NKL11+8;

8044     tp->t_addr = addr;

  • 计算 tty 的设备寄存器地址
  • 8035 - 8038 注释已经说的很明白
8045     if ((tp->t_state&ISOPEN) == 0) {

8046          tp->t_state = ISOPEN|CARR_ON;

8047          tp->t_flags = XTABS|LCASE|ECHO|CRMOD;

8048          tp->t_erase = CERASE;

8049          tp->t_kill = CKILL;

8050     }

  • 对于 "未打开"的tty,执行初始化操作
    • 打开tty
    • 置 模式
      • XTABS
      • LCASE
      • ECHO
      • CRMOD
    • 置特殊字符
8051     addr->klrcsr =| IENABLE|DSRDY|RDRENB;
  • 置 设备接收器 标志
    • 使能位
    • 就绪位
    • 完成位
8052     addr->kltcsr =| IENABLE;
  • 置 设备发送器 标志
    • 就绪位
8053 }

8054 /* ------------------------- */

Caller

⚠️ **GitHub.com Fallback** ⚠️