Closed isaki68k closed 3 years ago
NetBSD/luna68k でも luna68k/dev/lunaws.c
の wssoftint()
に雑に debug printf を入れて遅くした状態でキーボード連打すると
RxOv
が立つwsintr()
で RxOv
が立っていると Error Reset を発行して継続するという動作になります。
rr = getsiocsr(sio);
if ((rr & RR_RXRDY) != 0) {
do {
code = sio->sio_data;
if (rr & (RR_FRAMING | RR_OVERRUN | RR_PARITY)) {
sio->sio_cmd = WR0_ERRRST;
continue;
}
sc->sc_rxq[sc->sc_rxqtail] = code;
sc->sc_rxqtail = OMKBD_NEXTRXQ(sc->sc_rxqtail);
} while (((rr = getsiocsr(sio)) & RR_RXRDY) != 0);
softint_schedule(sc->sc_si);
}
Error Reset でどのビットがクリアされるのかちゃんとマニュアルを読んでませんが
コマンド6として ResetChannel()
と同様に以下みたいにすると一応復帰します。
case 6: // Error Reset
// SR1 は b4-7 が '0'
putlog(1, "CR0%s: Error Reset", chan->name);
chan->sr1 &= ~(SIO::SR1_ENDOFFRAME | SIO::SR1_CRCERROR |
SIO::SR1_RXOVERRUN | SIO::SR1_PARITYERROR);
break;
ありがとうございます。 昨日の夜中にマニュアルに記述を見付けてまったく同じコードを書いていました。この4ビットをクリアするで合ってるっぽいです。
5610afb4 (2021-09-16)でビットのクリアは実装。
0.2.3で直ってるはず。
https://twitter.com/ao_kenji/status/1408782477611528206
コマンド6は Error Reset らしい。今まで誰も遭遇しなかったので作っていない。