2018-10-15 01:20:56 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*
|
|
|
|
* Change Logs:
|
|
|
|
* Date Author Notes
|
|
|
|
*/
|
2015-01-06 18:50:22 +08:00
|
|
|
#ifndef __VBUS_API_H__
|
|
|
|
#define __VBUS_API_H__
|
|
|
|
|
2018-08-27 18:33:03 +08:00
|
|
|
#define RT_VBUS_USING_FLOW_CONTROL
|
|
|
|
|
2015-01-06 18:50:22 +08:00
|
|
|
#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)
|
|
|
|
|
2018-08-27 18:15:38 +08:00
|
|
|
#define RT_VMM_RB_BLK_NR (_RT_VBUS_RING_SZ / 64 - 1)
|
|
|
|
|
2015-01-06 18:50:22 +08:00
|
|
|
#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__ */
|
|
|
|
|