Fix ESPI vw_get and vw_set

This commit is contained in:
Jeremy Soller
2023-02-24 12:39:27 -07:00
parent 33eaef2dd0
commit 34ef03b19a
2 changed files with 16 additions and 11 deletions

View File

@ -39,27 +39,30 @@ struct VirtualWire __code VW_HOST_C10 = VIRTUAL_WIRE(47, 0);
enum VirtualWireState vw_get(struct VirtualWire *vw) __critical { enum VirtualWireState vw_get(struct VirtualWire *vw) __critical {
uint8_t index = *vw->index; uint8_t index = *vw->index;
switch ((index >> vw->shift) & VWS_HIGH) { if (index & vw->valid_mask) {
case VWS_LOW: if (index & vw->data_mask) {
return VWS_LOW;
case VWS_HIGH:
return VWS_HIGH; return VWS_HIGH;
default: } else {
return VWS_LOW;
}
} else {
return VWS_INVALID; return VWS_INVALID;
} }
} }
void vw_set(struct VirtualWire *vw, enum VirtualWireState state) __critical { void vw_set(struct VirtualWire *vw, enum VirtualWireState state) __critical {
uint8_t index = *vw->index; uint8_t index = *vw->index;
index &= ~(VWS_HIGH << vw->shift);
switch (state) { switch (state) {
case VWS_LOW: case VWS_LOW:
index |= VWS_LOW << vw->shift; index &= ~vw->data_mask;
index |= vw->valid_mask;
break; break;
case VWS_HIGH: case VWS_HIGH:
index |= VWS_HIGH << vw->shift; index |= vw->data_mask;
index |= vw->valid_mask;
break; break;
default: default:
index &= ~vw->valid_mask;
break; break;
} }
*vw->index = index; *vw->index = index;

View File

@ -9,13 +9,15 @@
struct VirtualWire { struct VirtualWire {
volatile uint8_t __xdata *index; volatile uint8_t __xdata *index;
uint8_t shift; uint8_t data_mask;
uint8_t valid_mask;
}; };
// clang-format off // clang-format off
#define VIRTUAL_WIRE(INDEX, SHIFT) { \ #define VIRTUAL_WIRE(INDEX, SHIFT) { \
.index = &VWIDX ## INDEX, \ .index = &VWIDX ## INDEX, \
.shift = SHIFT, \ .data_mask = BIT(SHIFT), \
.valid_mask = BIT(SHIFT + 4), \
} }
// clang-format on // clang-format on