spi_dev.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * File : spi_dev.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. */
  13. #include <rtthread.h>
  14. #include <drivers/spi.h>
  15. /* SPI bus device interface, compatible with RT-Thread 0.3.x/1.0.x */
  16. static rt_err_t _spi_bus_device_init(rt_device_t dev)
  17. {
  18. struct rt_spi_bus *bus;
  19. bus = (struct rt_spi_bus *)dev;
  20. RT_ASSERT(bus != RT_NULL);
  21. return RT_EOK;
  22. }
  23. static rt_size_t _spi_bus_device_read(rt_device_t dev,
  24. rt_off_t pos,
  25. void *buffer,
  26. rt_size_t size)
  27. {
  28. struct rt_spi_bus *bus;
  29. bus = (struct rt_spi_bus *)dev;
  30. RT_ASSERT(bus != RT_NULL);
  31. RT_ASSERT(bus->owner != RT_NULL);
  32. return rt_spi_transfer(bus->owner, RT_NULL, buffer, size);
  33. }
  34. static rt_size_t _spi_bus_device_write(rt_device_t dev,
  35. rt_off_t pos,
  36. const void *buffer,
  37. rt_size_t size)
  38. {
  39. struct rt_spi_bus *bus;
  40. bus = (struct rt_spi_bus *)dev;
  41. RT_ASSERT(bus != RT_NULL);
  42. RT_ASSERT(bus->owner != RT_NULL);
  43. return rt_spi_transfer(bus->owner, buffer, RT_NULL, size);
  44. }
  45. static rt_err_t _spi_bus_device_control(rt_device_t dev,
  46. rt_uint8_t cmd,
  47. void *args)
  48. {
  49. struct rt_spi_bus *bus;
  50. bus = (struct rt_spi_bus *)dev;
  51. RT_ASSERT(bus != RT_NULL);
  52. switch (cmd)
  53. {
  54. case 0: /* set device */
  55. break;
  56. case 1:
  57. break;
  58. }
  59. return RT_EOK;
  60. }
  61. rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name)
  62. {
  63. struct rt_device *device;
  64. RT_ASSERT(bus != RT_NULL);
  65. device = &bus->parent;
  66. /* set device type */
  67. device->type = RT_Device_Class_SPIBUS;
  68. /* initialize device interface */
  69. device->init = _spi_bus_device_init;
  70. device->open = RT_NULL;
  71. device->close = RT_NULL;
  72. device->read = _spi_bus_device_read;
  73. device->write = _spi_bus_device_write;
  74. device->control = _spi_bus_device_control;
  75. /* register to device manager */
  76. return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
  77. }
  78. /* SPI Dev device interface, compatible with RT-Thread 0.3.x/1.0.x */
  79. static rt_err_t _spidev_device_init(rt_device_t dev)
  80. {
  81. struct rt_spi_device *device;
  82. device = (struct rt_spi_device *)dev;
  83. RT_ASSERT(device != RT_NULL);
  84. return RT_EOK;
  85. }
  86. static rt_size_t _spidev_device_read(rt_device_t dev,
  87. rt_off_t pos,
  88. void *buffer,
  89. rt_size_t size)
  90. {
  91. struct rt_spi_device *device;
  92. device = (struct rt_spi_device *)dev;
  93. RT_ASSERT(device != RT_NULL);
  94. RT_ASSERT(device->bus != RT_NULL);
  95. return rt_spi_transfer(device, RT_NULL, buffer, size);
  96. }
  97. static rt_size_t _spidev_device_write(rt_device_t dev,
  98. rt_off_t pos,
  99. const void *buffer,
  100. rt_size_t size)
  101. {
  102. struct rt_spi_device *device;
  103. device = (struct rt_spi_device *)dev;
  104. RT_ASSERT(device != RT_NULL);
  105. RT_ASSERT(device->bus != RT_NULL);
  106. return rt_spi_transfer(device, buffer, RT_NULL, size);
  107. }
  108. static rt_err_t _spidev_device_control(rt_device_t dev,
  109. rt_uint8_t cmd,
  110. void *args)
  111. {
  112. struct rt_spi_device *device;
  113. device = (struct rt_spi_device *)dev;
  114. RT_ASSERT(device != RT_NULL);
  115. switch (cmd)
  116. {
  117. case 0: /* set device */
  118. break;
  119. case 1:
  120. break;
  121. }
  122. return RT_EOK;
  123. }
  124. rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name)
  125. {
  126. struct rt_device *device;
  127. RT_ASSERT(dev != RT_NULL);
  128. device = &(dev->parent);
  129. /* set device type */
  130. device->type = RT_Device_Class_SPIDevice;
  131. device->init = _spidev_device_init;
  132. device->open = RT_NULL;
  133. device->close = RT_NULL;
  134. device->read = _spidev_device_read;
  135. device->write = _spidev_device_write;
  136. device->control = _spidev_device_control;
  137. /* register to device manager */
  138. return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
  139. }