@@ -43,7 +43,7 @@ static int pipe_fops_open(struct dfs_fd *fd)
4343
4444 if (device -> ref_count == 0 )
4545 {
46- pipe -> fifo = rt_ringbuffer_create (PIPE_BUFSZ );
46+ pipe -> fifo = rt_ringbuffer_create (pipe -> bufsz );
4747 }
4848
4949 switch (fd -> flags & O_ACCMODE )
@@ -182,7 +182,6 @@ static int pipe_fops_read(struct dfs_fd *fd, void *buf, size_t count)
182182
183183out :
184184 rt_mutex_release (& pipe -> lock );
185-
186185 return len ;
187186}
188187
@@ -245,15 +244,14 @@ static int pipe_fops_write(struct dfs_fd *fd, const void *buf, size_t count)
245244 rt_wqueue_wait (& (pipe -> writer_queue ), 0 , -1 );
246245 rt_mutex_take (& pipe -> lock , -1 );
247246 }
248-
249247 rt_mutex_release (& pipe -> lock );
248+
250249 if (wakeup )
251250 {
252251 rt_wqueue_wakeup (& (pipe -> reader_queue ), (void * )POLLIN );
253252 }
254253
255254out :
256-
257255 return ret ;
258256}
259257
@@ -319,8 +317,97 @@ static const struct dfs_file_ops pipe_fops =
319317 RT_NULL ,
320318 pipe_fops_poll ,
321319};
320+ #endif /* end of RT_USING_POSIX */
321+
322+ rt_err_t rt_pipe_open (rt_device_t device , rt_uint16_t oflag )
323+ {
324+ rt_pipe_t * pipe = (rt_pipe_t * )device ;
325+
326+ if (device == RT_NULL ) return - RT_EINVAL ;
327+ rt_mutex_take (& (pipe -> lock ), RT_WAITING_FOREVER );
328+
329+ if (pipe -> fifo == RT_NULL )
330+ {
331+ pipe -> fifo = rt_ringbuffer_create (pipe -> bufsz );
332+ }
333+
334+ rt_mutex_release (& (pipe -> lock ));
335+
336+ return RT_EOK ;
337+ }
338+
339+ rt_err_t rt_pipe_close (rt_device_t device )
340+ {
341+ rt_pipe_t * pipe = (rt_pipe_t * )device ;
342+
343+ if (device == RT_NULL ) return - RT_EINVAL ;
344+ rt_mutex_take (& (pipe -> lock ), RT_WAITING_FOREVER );
345+
346+ if (device -> ref_count == 1 )
347+ {
348+ rt_ringbuffer_destroy (pipe -> fifo );
349+ pipe -> fifo = RT_NULL ;
350+ }
351+
352+ rt_mutex_release (& (pipe -> lock ));
353+
354+ return RT_EOK ;
355+ }
322356
323- rt_pipe_t * rt_pipe_create (const char * name )
357+ rt_size_t rt_pipe_read (rt_device_t device , rt_off_t pos , void * buffer , rt_size_t count )
358+ {
359+ uint8_t * pbuf ;
360+ int read_bytes = 0 ;
361+ rt_pipe_t * pipe = (rt_pipe_t * )device ;
362+
363+ if (device == RT_NULL ) return - EINVAL ;
364+ if (count == 0 ) return 0 ;
365+
366+ pbuf = (uint8_t * )buffer ;
367+ rt_mutex_take (& (pipe -> lock ), RT_WAITING_FOREVER );
368+
369+ while (read_bytes < count )
370+ {
371+ int len = rt_ringbuffer_get (pipe -> fifo , & pbuf [read_bytes ], count - read_bytes );
372+ if (len <= 0 ) break ;
373+
374+ read_bytes += len ;
375+ }
376+ rt_mutex_release (& pipe -> lock );
377+
378+ return read_bytes ;
379+ }
380+
381+ rt_size_t rt_pipe_write (rt_device_t device , rt_off_t pos , const void * buffer , rt_size_t count )
382+ {
383+ uint8_t * pbuf ;
384+ int write_bytes = 0 ;
385+ rt_pipe_t * pipe = (rt_pipe_t * )device ;
386+
387+ if (device == RT_NULL ) return - EINVAL ;
388+ if (count == 0 ) return 0 ;
389+
390+ pbuf = (uint8_t * )buffer ;
391+ rt_mutex_take (& pipe -> lock , -1 );
392+
393+ while (write_bytes < count )
394+ {
395+ int len = rt_ringbuffer_put (pipe -> fifo , & pbuf [write_bytes ], count - write_bytes );
396+ if (len <= 0 ) break ;
397+
398+ write_bytes += len ;
399+ }
400+ rt_mutex_release (& pipe -> lock );
401+
402+ return write_bytes ;
403+ }
404+
405+ rt_err_t rt_pipe_control (rt_device_t dev , int cmd , void * args )
406+ {
407+ return RT_EOK ;
408+ }
409+
410+ rt_pipe_t * rt_pipe_create (const char * name , int bufsz )
324411{
325412 rt_pipe_t * pipe ;
326413 rt_device_t dev ;
@@ -333,15 +420,29 @@ rt_pipe_t *rt_pipe_create(const char *name)
333420 rt_list_init (& (pipe -> reader_queue ));
334421 rt_list_init (& (pipe -> writer_queue ));
335422
423+ RT_ASSERT (bufsz < 0xFFFF );
424+ pipe -> bufsz = bufsz ;
425+
336426 dev = & (pipe -> parent );
337427 dev -> type = RT_Device_Class_Pipe ;
428+ dev -> init = RT_NULL ;
429+ dev -> open = rt_pipe_open ;
430+ dev -> read = rt_pipe_read ;
431+ dev -> write = rt_pipe_write ;
432+ dev -> close = rt_pipe_close ;
433+ dev -> control = rt_pipe_control ;
434+
435+ dev -> rx_indicate = RT_NULL ;
436+ dev -> tx_complete = RT_NULL ;
338437
339438 if (rt_device_register (& (pipe -> parent ), name , RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE ) != 0 )
340439 {
341440 rt_free (pipe );
342441 return RT_NULL ;
343442 }
443+ #ifdef RT_USING_POSIX
344444 dev -> fops = (void * )& pipe_fops ;
445+ #endif
345446
346447 return pipe ;
347448}
@@ -368,21 +469,28 @@ int rt_pipe_delete(const char *name)
368469 rt_mutex_detach (& (pipe -> lock ));
369470 rt_device_unregister (device );
370471
472+ /* close fifo ringbuffer */
473+ if (pipe -> fifo )
474+ {
475+ rt_ringbuffer_destroy (pipe -> fifo );
476+ pipe -> fifo = RT_NULL ;
477+ }
371478 rt_free (pipe );
372479 }
373480 else
374481 {
375- result = -1 ;
482+ result = - ENODEV ;
376483 }
377484 }
378485 else
379486 {
380- result = -1 ;
487+ result = - ENODEV ;
381488 }
382489
383490 return result ;
384491}
385492
493+ #ifdef RT_USING_POSIX
386494int pipe (int fildes [2 ])
387495{
388496 rt_pipe_t * pipe ;
@@ -392,7 +500,7 @@ int pipe(int fildes[2])
392500
393501 rt_snprintf (dname , sizeof (dname ), "pipe%d" , pipeno ++ );
394502
395- pipe = rt_pipe_create (dname );
503+ pipe = rt_pipe_create (dname , PIPE_BUFSZ );
396504 if (pipe == RT_NULL )
397505 {
398506 return -1 ;
@@ -419,7 +527,7 @@ int mkfifo(const char *path, mode_t mode)
419527{
420528 rt_pipe_t * pipe ;
421529
422- pipe = rt_pipe_create (path );
530+ pipe = rt_pipe_create (path , PIPE_BUFSZ );
423531 if (pipe == RT_NULL )
424532 {
425533 return -1 ;
0 commit comments