178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * Change Logs: | ||
|  |  * Date           Author       Notes | ||
|  |  * 2014-06-09     Grissiom     version 2.0.2; add comment | ||
|  |  * 2015-01-06     Grissiom     version 2.0.3; API change, no functional changes | ||
|  |  */ | ||
|  | #ifndef __VBUS_H__
 | ||
|  | #define __VBUS_H__
 | ||
|  | 
 | ||
|  | #include <vbus_api.h>
 | ||
|  | 
 | ||
|  | int rt_vbus_init(void *outr, void *inr); | ||
|  | 
 | ||
|  | void rt_vbus_resume_out_thread(void); | ||
|  | 
 | ||
|  | /** Post data on channel.
 | ||
|  |  * | ||
|  |  * @param chnr the channel number | ||
|  |  * @param prio the priority of the data | ||
|  |  * @param datap pointer to the actual data | ||
|  |  * @param size number of byte of the data | ||
|  |  * @param timeout the value used in the blocking API | ||
|  |  * | ||
|  |  * Note: rt_vbus_post is an asynchronous function that when it returns, the | ||
|  |  * @datap and @size is recorded in the post queue at least but there is no | ||
|  |  * guarantee that the data is copied into the ring buffer. To avoid data | ||
|  |  * corruption, you need to wait on the RT_VBUS_EVENT_ID_TX event. | ||
|  |  * | ||
|  |  * However, if you just post static data such as static string, there is no | ||
|  |  * need to wait. | ||
|  |  * | ||
|  |  * @sa rt_vbus_register_listener . | ||
|  |  */ | ||
|  | rt_err_t rt_vbus_post(rt_uint8_t chnr, | ||
|  |                       rt_uint8_t prio, | ||
|  |                       const void *datap, | ||
|  |                       rt_size_t size, | ||
|  |                       rt_int32_t timeout); | ||
|  | 
 | ||
|  | struct rt_vbus_data { | ||
|  |     /* Number of bytes in current data package. */ | ||
|  |     unsigned char size; | ||
|  |     /* Used internally in VBus. Don't modify this field as it may corrupt the
 | ||
|  |      * receive queue. */ | ||
|  |     struct rt_vbus_data *next; | ||
|  |     /* Data follows the struct */ | ||
|  | }; | ||
|  | 
 | ||
|  | struct rt_vbus_wm_cfg { | ||
|  |     unsigned int low, high; | ||
|  | }; | ||
|  | 
 | ||
|  | struct rt_vbus_request { | ||
|  |     unsigned char prio; | ||
|  |     const char *name; | ||
|  |     int is_server; | ||
|  |     struct rt_vbus_wm_cfg recv_wm, post_wm; | ||
|  | }; | ||
|  | 
 | ||
|  | /** Request a channel.
 | ||
|  |  * | ||
|  |  * @return channel number. Negative if error happened. | ||
|  |  */ | ||
|  | int rt_vbus_request_chn(struct rt_vbus_request *req, int timeout); | ||
|  | 
 | ||
|  | /** Close channel @chnr */ | ||
|  | void rt_vbus_close_chn(unsigned char chnr); | ||
|  | 
 | ||
|  | /** Set the water mark level for posting into the channel @chnr. */ | ||
|  | void rt_vbus_set_post_wm(unsigned char chnr, unsigned int low, unsigned int high); | ||
|  | /** Set the water mark level for receiving from the channel @chnr. */ | ||
|  | void rt_vbus_set_recv_wm(unsigned char chnr, unsigned int low, unsigned int high); | ||
|  | 
 | ||
|  | typedef void (*rt_vbus_event_listener)(void *ctx); | ||
|  | 
 | ||
|  | enum rt_vbus_event_id { | ||
|  |     /* On a packet received in channel. */ | ||
|  |     RT_VBUS_EVENT_ID_RX, | ||
|  |     /* On the data of rt_vbus_post has been written to the ring buffer. */ | ||
|  |     RT_VBUS_EVENT_ID_TX, | ||
|  |     /* On the channel has been closed. */ | ||
|  |     RT_VBUS_EVENT_ID_DISCONN, | ||
|  |     RT_VBUS_EVENT_ID_MAX, | ||
|  | }; | ||
|  | 
 | ||
|  | /** Register callback @indi on the event @eve on the @chnr.
 | ||
|  |  * | ||
|  |  * @ctx will passed to @indi on calling the @indi. | ||
|  |  */ | ||
|  | void rt_vbus_register_listener(unsigned char chnr, | ||
|  |                                enum rt_vbus_event_id eve, | ||
|  |                                rt_vbus_event_listener indi, | ||
|  |                                void *ctx); | ||
|  | 
 | ||
|  | /** Listen on any events happen on the @chnr for @timeout ticks.
 | ||
|  |  * | ||
|  |  * This function blocks until events occur or timeout happened. | ||
|  |  */ | ||
|  | rt_err_t rt_vbus_listen_on(rt_uint8_t chnr, | ||
|  |                            rt_int32_t timeout); | ||
|  | 
 | ||
|  | /** Push a data package into the receive queue of the channel @chnr. */ | ||
|  | void rt_vbus_data_push(unsigned int chnr, | ||
|  |                        struct rt_vbus_data *data); | ||
|  | /** Pop a data package from the receive queue of the channel @chnr.
 | ||
|  |  * | ||
|  |  * The actual data is following the struct rt_vbus_data. After using it, it | ||
|  |  * should be freed by rt_free. | ||
|  |  */ | ||
|  | struct rt_vbus_data* rt_vbus_data_pop(unsigned int chnr); | ||
|  | 
 | ||
|  | struct rt_vbus_dev | ||
|  | { | ||
|  |     /* Runtime infomations. */ | ||
|  |     rt_uint8_t chnr; | ||
|  |     struct rt_vbus_data *act; | ||
|  |     rt_size_t pos; | ||
|  | 
 | ||
|  |     /* There will be a request for each channel. So no need to seperate them so
 | ||
|  |      * clearly. */ | ||
|  |     struct rt_vbus_request req; | ||
|  | }; | ||
|  | 
 | ||
|  | rt_err_t rt_vbus_chnx_init(void); | ||
|  | /** Get the corresponding channel number from the VBus device @dev. */ | ||
|  | rt_uint8_t rt_vbus_get_chnnr(rt_device_t dev); | ||
|  | /** Register a call back on the other side disconnect the channel.
 | ||
|  |  * | ||
|  |  * @sa rt_vbus_register_listener . | ||
|  |  */ | ||
|  | void rt_vbus_chnx_register_disconn(rt_device_t dev, | ||
|  |                                    rt_vbus_event_listener indi, | ||
|  |                                    void *ctx); | ||
|  | 
 | ||
|  | /* Commands for the device control interface. */ | ||
|  | #define VBUS_IOCRECV_WM      0xD1
 | ||
|  | #define VBUS_IOCPOST_WM      0xD2
 | ||
|  | /** Configure event listener */ | ||
|  | #define VBUS_IOC_LISCFG      0xD3
 | ||
|  | 
 | ||
|  | struct rt_vbus_dev_liscfg | ||
|  | { | ||
|  |     enum rt_vbus_event_id event; | ||
|  |     rt_vbus_event_listener listener; | ||
|  |     void *ctx; | ||
|  | }; | ||
|  | 
 | ||
|  | int rt_vbus_shell_start(void); | ||
|  | #ifdef RT_USING_VBUS_RFS
 | ||
|  | int dfs_rfs_init(void); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /** VBus hardware init function.
 | ||
|  |  * | ||
|  |  * BSP should implement this function to initialize the interrupts etc. | ||
|  |  */ | ||
|  | int rt_vbus_hw_init(void); | ||
|  | 
 | ||
|  | /** VBus ISR function.
 | ||
|  |  * | ||
|  |  * BSP should call this function when the interrupt from other core is | ||
|  |  * triggered. @param is not used by VBus and will pass to rt_vbus_hw_eoi. | ||
|  |  */ | ||
|  | void rt_vbus_isr(int irqnr, void *param); | ||
|  | 
 | ||
|  | /** VBus End Of Interrupt function.
 | ||
|  |  * | ||
|  |  * This function will be called when VBus finished the ISR handling. BSP should | ||
|  |  * define this function to clear the interrupt flag etc. | ||
|  |  */ | ||
|  | int rt_vbus_hw_eoi(int irqnr, void *param); | ||
|  | 
 | ||
|  | #endif /* end of include guard: __VBUS_H__ */
 |