diff options
| author | GUI <[email protected]> | 2024-11-25 11:00:04 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-11-25 11:00:04 +0800 |
| commit | f849afb5ca40f4843d86d6bd55253b2db57a7ad4 (patch) | |
| tree | 5ea0287d22459c1df3753d29a2247fc336fb0347 /components/drivers/include | |
| parent | 8ed4ae144fda951d7a3f5ffbfbf810b1ce1bf2c8 (diff) | |
[DM/FEATURE] Support hardware mailbox (#9599)
* [DM/FEATURE] Support hardware mailbox
* [MAILBOX/PIC] Add PIC Mailbox drivers.
The mailbox device(s) may be instantiated in one of three equivalent way:
Device Tree node, eg.:
```dts
interrupt-controller@0 {
interrupt-controller;
#interrupt-cells = <1>;
};
pic_mailbox@10000 {
compatible = "rt-thread,pic-mailbox";
reg = <0x10000 0x100>;
position = <0>;
interrupts = <34>;
peer-interrupts = <35>;
uid = <0>;
#mbox-cells = <1>;
};
```
Signed-off-by: GuEe-GUI <[email protected]>
Diffstat (limited to 'components/drivers/include')
| -rw-r--r-- | components/drivers/include/drivers/mailbox.h | 77 | ||||
| -rw-r--r-- | components/drivers/include/rtdevice.h | 20 |
2 files changed, 89 insertions, 8 deletions
diff --git a/components/drivers/include/drivers/mailbox.h b/components/drivers/include/drivers/mailbox.h new file mode 100644 index 0000000000..954cd628e6 --- /dev/null +++ b/components/drivers/include/drivers/mailbox.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-09-23 GuEe-GUI first version + */ + +#ifndef __MAILBOX_H__ +#define __MAILBOX_H__ + +#include <rtdef.h> +#include <drivers/ofw.h> + +struct rt_mbox_chan; +struct rt_mbox_client; +struct rt_mbox_controller_ops; + +struct rt_mbox_controller +{ + rt_list_t list; + + struct rt_device *dev; + + const struct rt_mbox_controller_ops *ops; + + rt_size_t num_chans; + struct rt_mbox_chan *chans; +}; + +struct rt_mbox_controller_ops +{ + rt_err_t (*request)(struct rt_mbox_chan *); + void (*release)(struct rt_mbox_chan *); + rt_err_t (*send)(struct rt_mbox_chan *, const void *data); + rt_bool_t (*peek)(struct rt_mbox_chan *); + int (*ofw_parse)(struct rt_mbox_controller *, struct rt_ofw_cell_args *); +}; + +struct rt_mbox_chan +{ + struct rt_mbox_controller *ctrl; + struct rt_mbox_client *client; + + void *data; + rt_bool_t complete; + struct rt_timer timer; + struct rt_spinlock lock; + + void *priv; +}; + +struct rt_mbox_client +{ + struct rt_device *dev; + + void (*rx_callback)(struct rt_mbox_client *, void *data); + void (*tx_prepare)(struct rt_mbox_client *, const void *data); + void (*tx_done)(struct rt_mbox_client *, const void *data, rt_err_t err); +}; + +rt_err_t rt_mbox_controller_register(struct rt_mbox_controller *ctrl); +rt_err_t rt_mbox_controller_unregister(struct rt_mbox_controller *ctrl); + +rt_err_t rt_mbox_send(struct rt_mbox_chan *chan, const void *data, + rt_uint32_t timeout_ms); +void rt_mbox_send_done(struct rt_mbox_chan *chan, rt_err_t err); +rt_bool_t rt_mbox_peek(struct rt_mbox_chan *chan); +rt_err_t rt_mbox_recv(struct rt_mbox_chan *chan, void *data); + +struct rt_mbox_chan *rt_mbox_request_by_index(struct rt_mbox_client *client, int index); +struct rt_mbox_chan *rt_mbox_request_by_name(struct rt_mbox_client *client, char *name); +rt_err_t rt_mbox_release(struct rt_mbox_chan *chan); + +#endif /* __MAILBOX_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index ceb02485e3..aa56b6820c 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -45,19 +45,23 @@ extern "C" { #include "drivers/core/power_domain.h" #include "drivers/platform.h" +#ifdef RT_USING_MBOX +#include "drivers/mailbox.h" +#endif /* RT_USING_MBOX */ + #ifdef RT_USING_BLK #include "drivers/blk.h" -#endif +#endif /* RT_USING_BLK */ #ifdef RT_USING_DMA #include "drivers/dma.h" -#endif +#endif /* RT_USING_DMA */ #include "drivers/iio.h" #ifdef RT_USING_NVME #include "drivers/nvme.h" -#endif +#endif /* RT_USING_NVME */ #ifdef RT_USING_OFW #include "drivers/ofw.h" @@ -69,26 +73,26 @@ extern "C" { #ifdef RT_USING_PHYE #include "drivers/phye.h" -#endif +#endif /* RT_USING_PHYE */ #ifdef RT_USING_PIC #include "drivers/pic.h" -#endif +#endif /* RT_USING_PIC */ #ifdef RT_USING_SCSI #include "drivers/scsi.h" -#endif +#endif /* RT_USING_SCSI */ #ifdef RT_MFD_SYSCON #include "drivers/syscon.h" -#endif +#endif /* RT_MFD_SYSCON */ #endif /* RT_USING_DM */ #ifdef RT_USING_RTC #include "drivers/dev_rtc.h" #ifdef RT_USING_ALARM #include "drivers/dev_alarm.h" -#endif +#endif /* RT_USING_ALARM */ #endif /* RT_USING_RTC */ #ifdef RT_USING_SPI |
