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