1 /*
2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3 */
4
5 #include "aos/vfs.h"
6 #include "device/aos_device.h"
7 #include "ulog/ulog.h"
8
9 #define TAG "VFS_ADAPTER"
10
_device_open(inode_t * node,file_t * fp)11 static int _device_open(inode_t *node, file_t *fp)
12 {
13 aos_device_t dev = NULL;
14
15 DEV_ASSERT(fp != NULL);
16 DEV_ASSERT(fp->node != NULL);
17 DEV_ASSERT(fp->node->i_name != NULL);
18
19 /* find device */
20 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
21 dev = aos_device_find(fp->node->i_name);
22 #else
23 dev = fp->node->i_arg;
24 #endif
25 if (NULL == dev) {
26 return -1;
27 }
28
29 return aos_device_open(dev, fp->node->i_flags);
30 }
31
_device_close(file_t * fp)32 static int _device_close(file_t *fp)
33 {
34 aos_device_t dev = NULL;
35
36 DEV_ASSERT(fp != NULL);
37 DEV_ASSERT(fp->node != NULL);
38 DEV_ASSERT(fp->node->i_name != NULL);
39
40 /* find device */
41 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
42 dev = aos_device_find(fp->node->i_name);
43 #else
44 dev = fp->node->i_arg;
45 #endif
46 if (NULL == dev) {
47 return -1;
48 }
49
50 return aos_device_close(dev);
51 }
52
_device_read(file_t * fp,void * buf,size_t nbytes)53 static int _device_read(file_t *fp, void *buf, size_t nbytes)
54 {
55 int ret;
56 aos_device_t dev = NULL;
57
58 DEV_ASSERT(fp != NULL);
59 DEV_ASSERT(buf != NULL);
60 DEV_ASSERT(fp->node != NULL);
61 DEV_ASSERT(fp->node->i_name != NULL);
62
63 /* find device */
64 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
65 dev = aos_device_find(fp->node->i_name);
66 #else
67 dev = fp->node->i_arg;
68 #endif
69 if (NULL == dev) {
70 return -1;
71 }
72
73 ret = aos_device_read(dev, fp->offset, buf, nbytes);
74 if (ret >= 0) {
75 fp->offset += ret;
76 }
77
78 return ret;
79 }
80
_device_write(file_t * fp,const void * buf,size_t nbytes)81 static ssize_t _device_write(file_t *fp, const void *buf, size_t nbytes)
82 {
83 int ret;
84 aos_device_t dev = NULL;
85
86 DEV_ASSERT(fp != NULL);
87 DEV_ASSERT(buf != NULL);
88 DEV_ASSERT(fp->node != NULL);
89 DEV_ASSERT(fp->node->i_name != NULL);
90
91 /* find device */
92 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
93 dev = aos_device_find(fp->node->i_name);
94 #else
95 dev = fp->node->i_arg;
96 #endif
97 if (NULL == dev) {
98 return -1;
99 }
100
101 ret = aos_device_write(dev, fp->offset, buf, nbytes);
102 if (ret >= 0) {
103 fp->offset += ret;
104 }
105
106 return ret;
107 }
108
_device_ioctl(file_t * fp,int cmd,unsigned long arg)109 static int _device_ioctl(file_t *fp, int cmd, unsigned long arg)
110 {
111 aos_device_t dev = NULL;
112
113 DEV_ASSERT(fp != NULL);
114 DEV_ASSERT(fp->node != NULL);
115 DEV_ASSERT(fp->node->i_name != NULL);
116
117 /* find device */
118 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
119 dev = aos_device_find(fp->node->i_name);
120 #else
121 dev = fp->node->i_arg;
122 #endif
123 if (NULL == dev) {
124 return -1;
125 }
126
127 return aos_device_control(dev, cmd, (void *)arg);
128 }
129
_device_lseek(file_t * fp,int64_t off,int32_t whence)130 static uint32_t _device_lseek(file_t *fp, int64_t off, int32_t whence)
131 {
132 aos_device_t dev = NULL;
133
134 DEV_ASSERT(fp != NULL);
135 DEV_ASSERT(fp->node != NULL);
136 DEV_ASSERT(fp->node->i_name != NULL);
137
138 /* find device */
139 #ifdef AOS_DEVICE_BRIDGE_USE_VFS
140 dev = aos_device_find(fp->node->i_name);
141 #else
142 dev = fp->node->i_arg;
143 #endif
144 if (NULL == dev) {
145 return -1;
146 }
147
148 fp->offset = off;
149
150 return 0;
151 }
152
153 struct file_ops m_dev_fops = {
154 .open = _device_open,
155 .close = _device_close,
156 .read = _device_read,
157 .write = _device_write,
158 .ioctl = _device_ioctl,
159 .lseek = _device_lseek,
160 };
161