1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
- #ifndef __VBUS_API_H__
- #define __VBUS_API_H__
- #define RT_VBUS_USING_FLOW_CONTROL
- #define RT_VBUS_CHANNEL_NR 32
- #define RT_VBUS_BLK_HEAD_SZ 4
- #define RT_VBUS_MAX_PKT_SZ (256 - RT_VBUS_BLK_HEAD_SZ)
- #define RT_VMM_RB_BLK_NR (_RT_VBUS_RING_SZ / 64 - 1)
- #ifndef __ASSEMBLY__
- #include <stddef.h> /* For size_t */
- struct rt_vbus_blk
- {
- unsigned char id;
- unsigned char qos;
- unsigned char len;
- unsigned char reserved;
- unsigned char data[60];
- } __attribute__((packed));
- struct rt_vbus_ring
- {
- volatile size_t put_idx;
- volatile size_t get_idx;
- /* whether the writer is blocked on this ring. For RTT, it means the
- * central writer thread is waiting. For Linux, it means there are some
- * threads waiting for space to write.
- *
- * Note that we don't record whether there are reading thread blocked. When
- * there is new data, the other side will always be waked up. */
- volatile unsigned int blocked;
- struct rt_vbus_blk blks[RT_VMM_RB_BLK_NR];
- };
- enum
- {
- RT_VBUS_CHN0_CMD_ENABLE,
- RT_VBUS_CHN0_CMD_DISABLE,
- RT_VBUS_CHN0_CMD_SET,
- RT_VBUS_CHN0_CMD_ACK,
- RT_VBUS_CHN0_CMD_NAK,
- /* If the recieving side reached high water mark. It has the right to
- * suspend the channel. All the server/client should know about this
- * command but the one that does not implement flow control could ignore
- * this command. */
- RT_VBUS_CHN0_CMD_SUSPEND,
- RT_VBUS_CHN0_CMD_RESUME,
- RT_VBUS_CHN0_CMD_MAX,
- };
- enum rt_vbus_chn_status
- {
- /* initial state, available for reuse */
- RT_VBUS_CHN_ST_AVAILABLE,
- /* ACK DISABLE send(CS) or received(CS), but not ready for reuse.(the
- * channel is not closed by this end) */
- RT_VBUS_CHN_ST_CLOSED,
- /* ENABLE send(client) or received(server) */
- RT_VBUS_CHN_ST_ESTABLISHING,
- /* ACK SET send(C) or received(S) */
- RT_VBUS_CHN_ST_ESTABLISHED,
- /* Channel suspended by flow control. */
- RT_VBUS_CHN_ST_SUSPEND,
- /* DISABLE received(CS) */
- RT_VBUS_CHN_ST_CLOSING,
- };
- #endif
- #undef BUILD_ASSERT
- /* borrowed from http://lxr.linux.no/linux+v2.6.26.5/include/linux/kernel.h#L494 */
- #define BUILD_ASSERT(condition) ((void)sizeof(char[1 - 2*!(condition)]))
- /* max length of a channel name, including the \0 */
- #define RT_VBUS_CHN_NAME_MAX 16
- #endif /* end of include guard: __VBUS_API_H__ */
|