diff --git a/os/sb/common/sbsysc.h b/os/sb/common/sbsysc.h index 83d60e1e2..22978d5f9 100644 --- a/os/sb/common/sbsysc.h +++ b/os/sb/common/sbsysc.h @@ -40,6 +40,7 @@ #define SB_FASTC_GET_FREQUENCY 2 #define SB_FASTC_VHAL_VGPIO 96 #define SB_FASTC_VHAL_VUART 97 +#define SB_FASTC_VRQ_GCSTS 119 #define SB_FASTC_VRQ_SETWT 120 #define SB_FASTC_VRQ_CLRWT 121 #define SB_FASTC_VRQ_SETEN 122 diff --git a/os/sb/host/sb.h b/os/sb/host/sb.h index 6c853e774..3992cfb36 100644 --- a/os/sb/host/sb.h +++ b/os/sb/host/sb.h @@ -350,6 +350,10 @@ struct sb_class { * @brief Reference to sh SB thread while waiting for VRQs. */ thread_reference_t vrq_trp; + /** + * @brief Status flags associated to each VRQ. + */ + uint32_t vrq_flags[32]; #endif #if (SB_CFG_ENABLE_VFS == TRUE) || defined(__DOXYGEN__) /** diff --git a/os/sb/host/sbvrq.c b/os/sb/host/sbvrq.c index 6b2c8aa32..89d00f91f 100644 --- a/os/sb/host/sbvrq.c +++ b/os/sb/host/sbvrq.c @@ -349,6 +349,15 @@ void sb_sysc_vrq_wait(struct port_extctx *ectxp) { chSysUnlock(); } +void sb_fastc_vrq_gcsts(struct port_extctx *ectxp) { + sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; + uint32_t sts; + + sts = sbp->vrq_flags[ectxp->r0] & ectxp->r1; + sbp->vrq_flags[ectxp->r0] &= ~sts; + ectxp->r0 = sts; +} + void sb_fastc_vrq_setwt(struct port_extctx *ectxp) { sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p; uint32_t m; diff --git a/os/sb/host/sbvrq.h b/os/sb/host/sbvrq.h index 4047fa62b..f830bbdac 100644 --- a/os/sb/host/sbvrq.h +++ b/os/sb/host/sbvrq.h @@ -46,6 +46,7 @@ * @{ */ #if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__) +#define SB_SVC119_HANDLER sb_fastc_vrq_gcsts #define SB_SVC120_HANDLER sb_fastc_vrq_setwt #define SB_SVC121_HANDLER sb_fastc_vrq_clrwt #define SB_SVC122_HANDLER sb_fastc_vrq_seten @@ -88,6 +89,7 @@ extern "C" { void sbVRQTriggerI(sb_class_t *sbp, sb_vrqnum_t nvrq); void sb_sysc_vrq_set_alarm(struct port_extctx *ectxp); void sb_sysc_vrq_reset_alarm(struct port_extctx *ectxp); + void sb_fastc_vrq_gcsts(struct port_extctx *ectxp); void sb_sysc_vrq_wait(struct port_extctx *ectxp); void sb_fastc_vrq_setwt(struct port_extctx *ectxp); void sb_fastc_vrq_clrwt(struct port_extctx *ectxp);