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