xref: /nrf52832-nimble/rt-thread/components/vbus/share_hdr/vbus_api.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  */
9*10465441SEvalZero #ifndef __VBUS_API_H__
10*10465441SEvalZero #define __VBUS_API_H__
11*10465441SEvalZero 
12*10465441SEvalZero #define RT_VBUS_USING_FLOW_CONTROL
13*10465441SEvalZero 
14*10465441SEvalZero #define RT_VBUS_CHANNEL_NR   32
15*10465441SEvalZero 
16*10465441SEvalZero #define RT_VBUS_BLK_HEAD_SZ  4
17*10465441SEvalZero #define RT_VBUS_MAX_PKT_SZ   (256 - RT_VBUS_BLK_HEAD_SZ)
18*10465441SEvalZero 
19*10465441SEvalZero #define RT_VMM_RB_BLK_NR (_RT_VBUS_RING_SZ / 64 - 1)
20*10465441SEvalZero 
21*10465441SEvalZero #ifndef __ASSEMBLY__
22*10465441SEvalZero #include <stddef.h> /* For size_t */
23*10465441SEvalZero 
24*10465441SEvalZero struct rt_vbus_blk
25*10465441SEvalZero {
26*10465441SEvalZero     unsigned char id;
27*10465441SEvalZero     unsigned char qos;
28*10465441SEvalZero     unsigned char len;
29*10465441SEvalZero     unsigned char reserved;
30*10465441SEvalZero     unsigned char data[60];
31*10465441SEvalZero } __attribute__((packed));
32*10465441SEvalZero 
33*10465441SEvalZero struct rt_vbus_ring
34*10465441SEvalZero {
35*10465441SEvalZero     volatile size_t put_idx;
36*10465441SEvalZero     volatile size_t get_idx;
37*10465441SEvalZero     /* whether the writer is blocked on this ring. For RTT, it means the
38*10465441SEvalZero      * central writer thread is waiting. For Linux, it means there are some
39*10465441SEvalZero      * threads waiting for space to write.
40*10465441SEvalZero      *
41*10465441SEvalZero      * Note that we don't record whether there are reading thread blocked. When
42*10465441SEvalZero      * there is new data, the other side will always be waked up. */
43*10465441SEvalZero     volatile unsigned int blocked;
44*10465441SEvalZero     struct rt_vbus_blk blks[RT_VMM_RB_BLK_NR];
45*10465441SEvalZero };
46*10465441SEvalZero 
47*10465441SEvalZero enum
48*10465441SEvalZero {
49*10465441SEvalZero     RT_VBUS_CHN0_CMD_ENABLE,
50*10465441SEvalZero     RT_VBUS_CHN0_CMD_DISABLE,
51*10465441SEvalZero     RT_VBUS_CHN0_CMD_SET,
52*10465441SEvalZero     RT_VBUS_CHN0_CMD_ACK,
53*10465441SEvalZero     RT_VBUS_CHN0_CMD_NAK,
54*10465441SEvalZero     /* If the recieving side reached high water mark. It has the right to
55*10465441SEvalZero      * suspend the channel. All the server/client should know about this
56*10465441SEvalZero      * command but the one that does not implement flow control could ignore
57*10465441SEvalZero      * this command. */
58*10465441SEvalZero     RT_VBUS_CHN0_CMD_SUSPEND,
59*10465441SEvalZero     RT_VBUS_CHN0_CMD_RESUME,
60*10465441SEvalZero     RT_VBUS_CHN0_CMD_MAX,
61*10465441SEvalZero };
62*10465441SEvalZero 
63*10465441SEvalZero enum rt_vbus_chn_status
64*10465441SEvalZero {
65*10465441SEvalZero     /* initial state, available for reuse */
66*10465441SEvalZero     RT_VBUS_CHN_ST_AVAILABLE,
67*10465441SEvalZero     /* ACK DISABLE send(CS) or received(CS), but not ready for reuse.(the
68*10465441SEvalZero      * channel is not closed by this end) */
69*10465441SEvalZero     RT_VBUS_CHN_ST_CLOSED,
70*10465441SEvalZero     /* ENABLE send(client) or received(server) */
71*10465441SEvalZero     RT_VBUS_CHN_ST_ESTABLISHING,
72*10465441SEvalZero     /* ACK SET send(C) or received(S) */
73*10465441SEvalZero     RT_VBUS_CHN_ST_ESTABLISHED,
74*10465441SEvalZero     /* Channel suspended by flow control. */
75*10465441SEvalZero     RT_VBUS_CHN_ST_SUSPEND,
76*10465441SEvalZero     /* DISABLE received(CS) */
77*10465441SEvalZero     RT_VBUS_CHN_ST_CLOSING,
78*10465441SEvalZero };
79*10465441SEvalZero #endif
80*10465441SEvalZero 
81*10465441SEvalZero #undef BUILD_ASSERT
82*10465441SEvalZero /* borrowed from http://lxr.linux.no/linux+v2.6.26.5/include/linux/kernel.h#L494 */
83*10465441SEvalZero #define BUILD_ASSERT(condition) ((void)sizeof(char[1 - 2*!(condition)]))
84*10465441SEvalZero 
85*10465441SEvalZero /* max length of a channel name, including the \0 */
86*10465441SEvalZero #define RT_VBUS_CHN_NAME_MAX   16
87*10465441SEvalZero 
88*10465441SEvalZero #endif /* end of include guard: __VBUS_API_H__ */
89*10465441SEvalZero 
90