Skip to content

Commit 09f2d42

Browse files
committed
[DeviceDrivers] Add device API in pipe device.
1 parent 6fe16bb commit 09f2d42

File tree

2 files changed

+119
-13
lines changed

2 files changed

+119
-13
lines changed

components/drivers/include/ipc/pipe.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include <rtthread.h>
88
#include <rtdevice.h>
99

10-
#if defined(RT_USING_POSIX)
11-
1210
#ifndef RT_PIPE_BUFSZ
1311
#define PIPE_BUFSZ 512
1412
#else
@@ -21,6 +19,7 @@ struct rt_pipe_device
2119

2220
/* ring buffer in pipe device */
2321
struct rt_ringbuffer *fifo;
22+
rt_uint16_t bufsz;
2423

2524
rt_uint8_t readers;
2625
rt_uint8_t writers;
@@ -32,7 +31,6 @@ struct rt_pipe_device
3231
};
3332
typedef struct rt_pipe_device rt_pipe_t;
3433

35-
rt_pipe_t *rt_pipe_create(const char *name);
34+
rt_pipe_t *rt_pipe_create(const char *name, int bufsz);
3635

37-
#endif /* RT_USING_POSIX */
3836
#endif /* PIPE_H__ */

components/drivers/src/pipe.c

Lines changed: 117 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

183183
out:
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

255254
out:
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
386494
int 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

Comments
 (0)