code:klopen - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 打开 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];
- 次设备号越界 , 则抛出错误
- 错误代码 : ENXIO
8031 if (u.u_procp->p_ttyp == 0) {
- 找到 对应的 struct tty 结构
8032 u.u_procp->p_ttyp = tp;
8033 tp->t_dev = dev;
8034 }
8035 /* set up minor 0 to address KLADDR
- 若 现行进程 未分配 tty,则分配
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;
8045 if ((tp->t_state&ISOPEN) == 0) {
- 计算 tty 的设备寄存器地址
- 8035 - 8038 注释已经说的很明白
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 }
8051 addr->klrcsr =| IENABLE|DSRDY|RDRENB;
- 对于 "未打开"的tty,执行初始化操作
- 打开tty
- 置 模式
- XTABS
- LCASE
- ECHO
- CRMOD
- 置特殊字符
8052 addr->kltcsr =| IENABLE;
- 置 设备接收器 标志
- 使能位
- 就绪位
- 完成位
8053 }
- 置 设备发送器 标志
- 就绪位
8054 /* ------------------------- */