diff --git a/components/drivers/mailbox/mailbox-pic.c b/components/drivers/mailbox/mailbox-pic.c index 187abe0122..dbc90f013e 100644 --- a/components/drivers/mailbox/mailbox-pic.c +++ b/components/drivers/mailbox/mailbox-pic.c @@ -66,6 +66,7 @@ static rt_err_t pic_mbox_request(struct rt_mbox_chan *chan) struct pic_mbox *pic_mbox = raw_to_pic_mbox(chan->ctrl); HWREG32(pic_mbox->regs + MAILBOX_IMASK) &= ~RT_BIT(index); + HWREG32(pic_mbox->regs + MAILBOX_ISTATE) = 0; return RT_EOK; } @@ -89,6 +90,11 @@ static rt_err_t pic_mbox_send(struct rt_mbox_chan *chan, const void *data) rt_thread_yield(); } + if (HWREG32(pic_mbox->peer_regs + MAILBOX_IMASK) & RT_BIT(index)) + { + return -RT_ERROR; + } + level = rt_spin_lock_irqsave(&pic_mbox->lock); HWREG32(pic_mbox->regs + MAILBOX_MSG(index)) = *(rt_uint32_t *)data; @@ -187,6 +193,12 @@ static rt_err_t pic_mbox_probe(struct rt_platform_device *pdev) } pic_mbox->peer_regs = pic_mbox->regs + size / 2; + + /* Init by the captain */ + HWREG32(pic_mbox->regs + MAILBOX_IMASK) = 0xffffffff; + HWREG32(pic_mbox->regs + MAILBOX_ISTATE) = 0; + HWREG32(pic_mbox->peer_regs + MAILBOX_IMASK) = 0xffffffff; + HWREG32(pic_mbox->peer_regs + MAILBOX_ISTATE) = 0; } else {