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