端末のオープン処理を行うデバイスドライバである。
openシステムコールを発行うるとklopenが実行される。
該当端末のアドレスを算出して、tty構造体とレジスタの初期設定を行う。
klopen(dev, flag)
{
register char *addr;
register struct tty *tp;
if(dev.d_minor >= NKL11+NDL11) { /* #define NKL11 1 #define NDL11 0 */
u.u_error = ENXIO;
return;
}
tp = &kl11[dev.d_minor];
if (u.u_procp->p_ttyp == 0) {
u.u_procp->p_ttyp = tp;
tp->t_dev = dev;
}
/* レジスタのベースアドレスを計算する */
/* マイナー番号によって割り振り方が変わる */
/*
* set up minor 0 to address KLADDR
* set up minor 1 thru NKL11-1 to address from KLBASE
* set up minor NKL11 on to address from DLBASE
*/
addr = KLADDR + 8*dev.d_minor;
if(dev.d_minor)
addr =+ KLBASE-KLADDR-8;
if(dev.d_minor >= NKL11)
addr =+ DLBASE-KLBASE-8*NKL11+8;
tp->t_addr = addr;
/* 端末の状態をチェック */
if ((tp->t_state&ISOPEN) == 0) {
/* tty構造体の初期化 */
tp->t_state = ISOPEN|CARR_ON;
tp->t_flags = XTABS|LCASE|ECHO|CRMOD;
tp->t_erase = CERASE; /* # */
tp->t_kill = CKILL; /* @ */
}
addr->klrcsr =| IENABLE|DSRDY|RDRENB;
addr->kltcsr =| IENABLE;
}
ISOPENとCARR_ONの違いはなんぞや
klopen実行
- エラーチェック
- アドレス割り当てチェック
- アドレス割り当て
- tty初期化
- レジスタにフラグをセット
devの型はintで、intにキャストしてる?