Fix ESPI vw_get and vw_set
This commit is contained in:
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user