drv_spi.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-09-04 Yilin Sun Initial version
  9. */
  10. #include <rtdevice.h>
  11. #include "fsl_spi.h"
  12. #include "drv_spi.h"
  13. #define BSP_DEFAULT_SPI_FREQUENCY (500000U)
  14. typedef struct
  15. {
  16. struct rt_spi_bus parent;
  17. SPI_Type *instance;
  18. uint32_t input_frequency;
  19. } mcx_spi_obj_t;
  20. typedef struct
  21. {
  22. SPI_Type *instance;
  23. uint8_t id;
  24. } mcx_spi_instance_t;
  25. static const mcx_spi_instance_t mcx_spi_instances[] =
  26. {
  27. #ifdef BSP_USING_SPI0
  28. {SPI0, 0},
  29. #endif
  30. #ifdef BSP_USING_SPI1
  31. {SPI1, 1},
  32. #endif
  33. };
  34. static mcx_spi_obj_t mcx_spi_list[ARRAY_SIZE(mcx_spi_instances)];
  35. static rt_ssize_t mcx_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message)
  36. {
  37. spi_transfer_t xfer =
  38. {
  39. .txData = message->send_buf,
  40. .rxData = message->recv_buf,
  41. .dataSize = message->length,
  42. .flags = 0UL,
  43. };
  44. mcx_spi_obj_t *spi = device->bus->parent.user_data;
  45. if (message->cs_take)
  46. {
  47. rt_pin_write(device->cs_pin, PIN_LOW);
  48. }
  49. SPI_MasterTransferBlocking(spi->instance, &xfer);
  50. if (message->cs_release)
  51. {
  52. rt_pin_write(device->cs_pin, PIN_HIGH);
  53. }
  54. return message->length;
  55. }
  56. static rt_err_t mcx_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)
  57. {
  58. mcx_spi_obj_t *spi = device->bus->parent.user_data;
  59. SPI_MasterSetBaudRate(spi->instance, cfg->max_hz, spi->input_frequency);
  60. return RT_EOK;
  61. }
  62. static struct rt_spi_ops mcx_spi_ops =
  63. {
  64. .configure = mcx_spi_configure,
  65. .xfer = mcx_spi_xfer,
  66. };
  67. rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_uint32_t pin)
  68. {
  69. struct rt_spi_device *spi_device = rt_malloc(sizeof(struct rt_spi_device));
  70. if (!spi_device)
  71. {
  72. return -RT_ENOMEM;
  73. }
  74. return rt_spi_bus_attach_device_cspin(spi_device, device_name, bus_name, pin, NULL);
  75. }
  76. int rt_hw_spi_init(void)
  77. {
  78. for (size_t i = 0; i < ARRAY_SIZE(mcx_spi_instances); i++)
  79. {
  80. char name_buf[16];
  81. /* TODO: Initialize SPI interface here. */
  82. mcx_spi_list[i].instance = mcx_spi_instances[i].instance;
  83. mcx_spi_list[i].input_frequency = CLOCK_GetCoreSysClkFreq();
  84. mcx_spi_list[i].parent.parent.user_data = &mcx_spi_list[i];
  85. spi_master_config_t cfg;
  86. SPI_MasterGetDefaultConfig(&cfg);
  87. SPI_MasterInit(mcx_spi_list[i].instance, &cfg, mcx_spi_list[i].input_frequency);
  88. rt_snprintf(name_buf, sizeof(name_buf), "spi%d", mcx_spi_instances[i].id);
  89. rt_spi_bus_register(&mcx_spi_list[i].parent, name_buf, &mcx_spi_ops);
  90. }
  91. return 0;
  92. }
  93. INIT_DEVICE_EXPORT(rt_hw_spi_init);