xref: /nrf52832-nimble/rt-thread/components/drivers/spi/spi_dev.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  */
9 
10 #include <rtthread.h>
11 #include <drivers/spi.h>
12 
13 /* SPI bus device interface, compatible with RT-Thread 0.3.x/1.0.x */
14 static rt_size_t _spi_bus_device_read(rt_device_t dev,
15                                       rt_off_t    pos,
16                                       void       *buffer,
17                                       rt_size_t   size)
18 {
19     struct rt_spi_bus *bus;
20 
21     bus = (struct rt_spi_bus *)dev;
22     RT_ASSERT(bus != RT_NULL);
23     RT_ASSERT(bus->owner != RT_NULL);
24 
25     return rt_spi_transfer(bus->owner, RT_NULL, buffer, size);
26 }
27 
28 static rt_size_t _spi_bus_device_write(rt_device_t dev,
29                                        rt_off_t    pos,
30                                        const void *buffer,
31                                        rt_size_t   size)
32 {
33     struct rt_spi_bus *bus;
34 
35     bus = (struct rt_spi_bus *)dev;
36     RT_ASSERT(bus != RT_NULL);
37     RT_ASSERT(bus->owner != RT_NULL);
38 
39     return rt_spi_transfer(bus->owner, buffer, RT_NULL, size);
40 }
41 
42 static rt_err_t _spi_bus_device_control(rt_device_t dev,
43                                         int         cmd,
44                                         void       *args)
45 {
46     /* TODO: add control command handle */
47     switch (cmd)
48     {
49     case 0: /* set device */
50         break;
51     case 1:
52         break;
53     }
54 
55     return RT_EOK;
56 }
57 
58 #ifdef RT_USING_DEVICE_OPS
59 const static struct rt_device_ops spi_bus_ops =
60 {
61     RT_NULL,
62     RT_NULL,
63     RT_NULL,
64     _spi_bus_device_read,
65     _spi_bus_device_write,
66     _spi_bus_device_control
67 };
68 #endif
69 
70 rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name)
71 {
72     struct rt_device *device;
73     RT_ASSERT(bus != RT_NULL);
74 
75     device = &bus->parent;
76 
77     /* set device type */
78     device->type    = RT_Device_Class_SPIBUS;
79     /* initialize device interface */
80 #ifdef RT_USING_DEVICE_OPS
81     device->ops     = &spi_bus_ops;
82 #else
83     device->init    = RT_NULL;
84     device->open    = RT_NULL;
85     device->close   = RT_NULL;
86     device->read    = _spi_bus_device_read;
87     device->write   = _spi_bus_device_write;
88     device->control = _spi_bus_device_control;
89 #endif
90 
91     /* register to device manager */
92     return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
93 }
94 
95 /* SPI Dev device interface, compatible with RT-Thread 0.3.x/1.0.x */
96 static rt_size_t _spidev_device_read(rt_device_t dev,
97                                      rt_off_t    pos,
98                                      void       *buffer,
99                                      rt_size_t   size)
100 {
101     struct rt_spi_device *device;
102 
103     device = (struct rt_spi_device *)dev;
104     RT_ASSERT(device != RT_NULL);
105     RT_ASSERT(device->bus != RT_NULL);
106 
107     return rt_spi_transfer(device, RT_NULL, buffer, size);
108 }
109 
110 static rt_size_t _spidev_device_write(rt_device_t dev,
111                                       rt_off_t    pos,
112                                       const void *buffer,
113                                       rt_size_t   size)
114 {
115     struct rt_spi_device *device;
116 
117     device = (struct rt_spi_device *)dev;
118     RT_ASSERT(device != RT_NULL);
119     RT_ASSERT(device->bus != RT_NULL);
120 
121     return rt_spi_transfer(device, buffer, RT_NULL, size);
122 }
123 
124 static rt_err_t _spidev_device_control(rt_device_t dev,
125                                        int         cmd,
126                                        void       *args)
127 {
128     switch (cmd)
129     {
130     case 0: /* set device */
131         break;
132     case 1:
133         break;
134     }
135 
136     return RT_EOK;
137 }
138 
139 #ifdef RT_USING_DEVICE_OPS
140 const static struct rt_device_ops spi_device_ops =
141 {
142     RT_NULL,
143     RT_NULL,
144     RT_NULL,
145     _spidev_device_read,
146     _spidev_device_write,
147     _spidev_device_control
148 };
149 #endif
150 
151 rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)
152 {
153     struct rt_device *device;
154     RT_ASSERT(dev != RT_NULL);
155 
156     device = &(dev->parent);
157 
158     /* set device type */
159     device->type    = RT_Device_Class_SPIDevice;
160 #ifdef RT_USING_DEVICE_OPS
161     device->ops     = &spi_device_ops;
162 #else
163     device->init    = RT_NULL;
164     device->open    = RT_NULL;
165     device->close   = RT_NULL;
166     device->read    = _spidev_device_read;
167     device->write   = _spidev_device_write;
168     device->control = _spidev_device_control;
169 #endif
170 
171     /* register to device manager */
172     return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
173 }
174