X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8254.c;h=4b30a67f079c66326c591799d4f7400ad5fb65e2;hb=c7739777acd3a3a384da670552fb4145e2161375;hp=e01eeda68e2c78a961ef4178fe79d7050913a97d;hpb=94f67717b6461df514dc225ed84f03b44c44061b;p=palacios.git diff --git a/palacios/src/devices/8254.c b/palacios/src/devices/8254.c index e01eeda..4b30a67 100644 --- a/palacios/src/devices/8254.c +++ b/palacios/src/devices/8254.c @@ -54,8 +54,8 @@ */ typedef enum {NOT_RUNNING, PENDING, RUNNING} channel_run_state_t; typedef enum {NOT_WAITING, WAITING_LOBYTE, WAITING_HIBYTE} channel_access_state_t; -typedef enum {LATCH_COUNT, LOBYTE_ONLY, HIBYTE_ONLY, LOBYTE_HIBYTE} channel_access_mode_t; -typedef enum {IRQ_ON_TERM_CNT, ONE_SHOT, RATE_GEN, SQR_WAVE, SW_STROBE, HW_STROBE} channel_op_mode_t; +typedef enum {LATCH_COUNT = 0, LOBYTE_ONLY = 1, HIBYTE_ONLY = 2, LOBYTE_HIBYTE = 3} channel_access_mode_t; +typedef enum {IRQ_ON_TERM_CNT = 0, ONE_SHOT = 1, RATE_GEN = 2, SQR_WAVE = 3, SW_STROBE = 4, HW_STROBE = 5} channel_op_mode_t; struct channel { @@ -162,7 +162,7 @@ static int handle_crystal_tics(struct pit * pit, struct channel * ch, uint_t osc } else { ushort_t reload_val = ch->reload_value; - if (ch->op_mode == SW_STROBE) { + if ((ch->op_mode == SW_STROBE) || (ch->op_mode == IRQ_ON_TERM_CNT)) { reload_val = 0xffff; } @@ -430,10 +430,12 @@ static int handle_speaker_write(uint8_t *speaker, struct channel * ch, char val) } static int handle_channel_cmd(struct channel * ch, struct pit_cmd_word cmd) { - ch->op_mode = cmd.op_mode; - ch->access_mode = cmd.access_mode; + ch->access_mode = cmd.access_mode; + if (ch->access_mode != 0) { + ch->op_mode = cmd.op_mode; + } switch (cmd.access_mode) {