Lines Matching refs:serial
40 rt_err_t rt_serial_bypass_init(struct rt_serial_device* serial) in rt_serial_bypass_init() argument
42 serial->bypass = rt_malloc(sizeof(struct rt_serial_bypass)); in rt_serial_bypass_init()
43 rt_memset(serial->bypass, 0, sizeof(struct rt_serial_bypass)); in rt_serial_bypass_init()
45 serial->bypass->pipe = rt_ringbuffer_create(serial->config.rx_bufsz); in rt_serial_bypass_init()
47 serial->bypass->pipe = rt_ringbuffer_create(serial->config.bufsz); in rt_serial_bypass_init()
49 serial->bypass->mutex = rt_mutex_create("serial_bypass", RT_IPC_FLAG_FIFO); in rt_serial_bypass_init()
104 rt_err_t rt_bypass_upper_register(struct rt_serial_device* serial, const char* name, rt_uint8_t lev… in rt_bypass_upper_register() argument
106 if (!serial->bypass) in rt_bypass_upper_register()
107 rt_serial_bypass_init(serial); in rt_bypass_upper_register()
109 if (!serial->bypass->upper_h) in rt_bypass_upper_register()
111 serial->bypass->upper_h = rt_malloc(sizeof(struct rt_serial_bypass_head)); in rt_bypass_upper_register()
112 rt_spin_lock_init(&serial->bypass->upper_h->spinlock); in rt_bypass_upper_register()
113 rt_list_init(&serial->bypass->upper_h->head); in rt_bypass_upper_register()
117 return rt_bypass_register(serial->bypass->upper_h, name, level, func, data); in rt_bypass_upper_register()
122 void rt_bypass_putchar(struct rt_serial_device* serial, rt_uint8_t ch) in rt_bypass_putchar() argument
124 rt_mutex_take(serial->bypass->mutex, RT_WAITING_FOREVER); in rt_bypass_putchar()
125 rt_ringbuffer_putchar(serial->bypass->pipe, ch); in rt_bypass_putchar()
126 rt_mutex_release(serial->bypass->mutex); in rt_bypass_putchar()
129 rt_size_t rt_bypass_getchar(struct rt_serial_device* serial, rt_uint8_t* ch) in rt_bypass_getchar() argument
132 rt_mutex_take(serial->bypass->mutex, RT_WAITING_FOREVER); in rt_bypass_getchar()
133 flags = rt_ringbuffer_getchar(serial->bypass->pipe, ch); in rt_bypass_getchar()
134 rt_mutex_release(serial->bypass->mutex); in rt_bypass_getchar()
138 static inline rt_err_t _bypass_getchar_form_serial_fifo(struct rt_serial_device* serial, char* ch) in _bypass_getchar_form_serial_fifo() argument
142 rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; in _bypass_getchar_form_serial_fifo()
144 level = rt_spin_lock_irqsave(&(serial->spinlock)); in _bypass_getchar_form_serial_fifo()
153 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _bypass_getchar_form_serial_fifo()
159 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _bypass_getchar_form_serial_fifo()
166 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _bypass_getchar_form_serial_fifo()
173 if (rx_fifo->get_index >= serial->config.bufsz) rx_fifo->get_index = 0; in _bypass_getchar_form_serial_fifo()
181 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _bypass_getchar_form_serial_fifo()
186 static void _lower_work(struct rt_serial_device* serial) in _lower_work() argument
190 if (serial->bypass && serial->bypass->lower_h) in _lower_work()
195 if (_bypass_getchar_form_serial_fifo(serial, &ch)) in _lower_work()
198 node = serial->bypass->lower_h->head.next; in _lower_work()
200 while (node != &serial->bypass->lower_h->head) in _lower_work()
204 if (!temp_curr->bypass(serial, ch, temp_curr->data)) in _lower_work()
211 if (node == &serial->bypass->lower_h->head) in _lower_work()
213 rt_bypass_putchar(serial, ch); in _lower_work()
222 struct rt_serial_device* serial = (struct rt_serial_device*)work_data; in rt_lower_work() local
224 RT_ASSERT(serial != RT_NULL); in rt_lower_work()
226 _lower_work(serial); in rt_lower_work()
229 rt_err_t rt_bypass_lower_register(struct rt_serial_device* serial, const char* name, rt_uint8_t lev… in rt_bypass_lower_register() argument
231 if (!serial->bypass) in rt_bypass_lower_register()
232 rt_serial_bypass_init(serial); in rt_bypass_lower_register()
234 if (!serial->bypass->lower_h) in rt_bypass_lower_register()
236 … serial->bypass->lower_workq = rt_workqueue_create("serial bypass", RT_SYSTEM_WORKQUEUE_STACKSIZE, in rt_bypass_lower_register()
238 rt_work_init(&serial->bypass->work, rt_lower_work, (void*)serial); in rt_bypass_lower_register()
240 serial->bypass->lower_h = rt_malloc(sizeof(struct rt_serial_bypass_head)); in rt_bypass_lower_register()
241 rt_spin_lock_init(&serial->bypass->lower_h->spinlock); in rt_bypass_lower_register()
242 rt_list_init(&serial->bypass->lower_h->head); in rt_bypass_lower_register()
246 return rt_bypass_register(serial->bypass->lower_h, name, level, func, data); in rt_bypass_lower_register()
249 void rt_bypass_work_straight(struct rt_serial_device* serial) in rt_bypass_work_straight() argument
251 if (serial->bypass && serial->bypass->lower_h) in rt_bypass_work_straight()
253 _lower_work(serial); in rt_bypass_work_straight()
260 if (_bypass_getchar_form_serial_fifo(serial, &ch)) in rt_bypass_work_straight()
263 rt_bypass_putchar(serial, ch); in rt_bypass_work_straight()
303 rt_err_t rt_bypass_upper_unregister(struct rt_serial_device* serial, rt_uint8_t level) in rt_bypass_upper_unregister() argument
305 if (!serial->bypass || !serial->bypass->upper_h) in rt_bypass_upper_unregister()
307 return rt_bypass_unregister(serial->bypass->upper_h, level); in rt_bypass_upper_unregister()
310 rt_err_t rt_bypass_lower_unregister(struct rt_serial_device* serial, rt_uint8_t level) in rt_bypass_lower_unregister() argument
312 if (!serial->bypass || !serial->bypass->lower_h) in rt_bypass_lower_unregister()
314 return rt_bypass_unregister(serial->bypass->lower_h, level); in rt_bypass_lower_unregister()
319 struct rt_serial_device* serial = RT_NULL; in serial_bypass_list() local
324 serial = (struct rt_serial_device*)rt_console_get_device(); in serial_bypass_list()
325 if (!serial || !serial->bypass) in serial_bypass_list()
332 if (serial->bypass->upper_h) in serial_bypass_list()
335 node = serial->bypass->upper_h->head.next; in serial_bypass_list()
337 flags = rt_spin_lock_irqsave(&(serial->bypass->upper_h->spinlock)); /* 加锁*/ in serial_bypass_list()
338 while (node != &serial->bypass->upper_h->head) in serial_bypass_list()
344 rt_spin_unlock_irqrestore(&(serial->bypass->upper_h->spinlock), flags); /* 解锁*/ in serial_bypass_list()
352 if (serial->bypass->lower_h) in serial_bypass_list()
355 node = serial->bypass->lower_h->head.next; in serial_bypass_list()
357 flags = rt_spin_lock_irqsave(&(serial->bypass->lower_h->spinlock)); /* 加锁*/ in serial_bypass_list()
358 while (node != &serial->bypass->lower_h->head) in serial_bypass_list()
364 rt_spin_unlock_irqrestore(&(serial->bypass->lower_h->spinlock), flags); /* 解锁*/ in serial_bypass_list()
375 MSH_CMD_EXPORT(serial_bypass_list, serial bypass list)