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 */
_spi_bus_device_read(rt_device_t dev,rt_off_t pos,void * buffer,rt_size_t size)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
_spi_bus_device_write(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)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
_spi_bus_device_control(rt_device_t dev,int cmd,void * args)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
rt_spi_bus_device_init(struct rt_spi_bus * bus,const char * name)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 */
_spidev_device_read(rt_device_t dev,rt_off_t pos,void * buffer,rt_size_t size)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
_spidev_device_write(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)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
_spidev_device_control(rt_device_t dev,int cmd,void * args)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
rt_spidev_device_init(struct rt_spi_device * dev,const char * name)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