| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /*
- * Copyright (c) 2006-2024 RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2024-09-04 Yilin Sun Initial version
- */
- #include <rtdevice.h>
- #include "fsl_spi.h"
- #include "drv_spi.h"
- #define BSP_DEFAULT_SPI_FREQUENCY (500000U)
- typedef struct
- {
- struct rt_spi_bus parent;
- SPI_Type *instance;
- uint32_t input_frequency;
- } mcx_spi_obj_t;
- typedef struct
- {
- SPI_Type *instance;
- uint8_t id;
- } mcx_spi_instance_t;
- static const mcx_spi_instance_t mcx_spi_instances[] =
- {
- #ifdef BSP_USING_SPI0
- {SPI0, 0},
- #endif
- #ifdef BSP_USING_SPI1
- {SPI1, 1},
- #endif
- };
- static mcx_spi_obj_t mcx_spi_list[ARRAY_SIZE(mcx_spi_instances)];
- static rt_ssize_t mcx_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message)
- {
- spi_transfer_t xfer =
- {
- .txData = message->send_buf,
- .rxData = message->recv_buf,
- .dataSize = message->length,
- .flags = 0UL,
- };
- mcx_spi_obj_t *spi = device->bus->parent.user_data;
- if (message->cs_take)
- {
- rt_pin_write(device->cs_pin, PIN_LOW);
- }
- SPI_MasterTransferBlocking(spi->instance, &xfer);
- if (message->cs_release)
- {
- rt_pin_write(device->cs_pin, PIN_HIGH);
- }
- return message->length;
- }
- static rt_err_t mcx_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)
- {
- mcx_spi_obj_t *spi = device->bus->parent.user_data;
- SPI_MasterSetBaudRate(spi->instance, cfg->max_hz, spi->input_frequency);
- return RT_EOK;
- }
- static struct rt_spi_ops mcx_spi_ops =
- {
- .configure = mcx_spi_configure,
- .xfer = mcx_spi_xfer,
- };
- rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_uint32_t pin)
- {
- struct rt_spi_device *spi_device = rt_malloc(sizeof(struct rt_spi_device));
- if (!spi_device)
- {
- return -RT_ENOMEM;
- }
- return rt_spi_bus_attach_device_cspin(spi_device, device_name, bus_name, pin, NULL);
- }
- int rt_hw_spi_init(void)
- {
- for (size_t i = 0; i < ARRAY_SIZE(mcx_spi_instances); i++)
- {
- char name_buf[16];
- /* TODO: Initialize SPI interface here. */
- mcx_spi_list[i].instance = mcx_spi_instances[i].instance;
- mcx_spi_list[i].input_frequency = CLOCK_GetCoreSysClkFreq();
- mcx_spi_list[i].parent.parent.user_data = &mcx_spi_list[i];
- spi_master_config_t cfg;
- SPI_MasterGetDefaultConfig(&cfg);
- SPI_MasterInit(mcx_spi_list[i].instance, &cfg, mcx_spi_list[i].input_frequency);
- rt_snprintf(name_buf, sizeof(name_buf), "spi%d", mcx_spi_instances[i].id);
- rt_spi_bus_register(&mcx_spi_list[i].parent, name_buf, &mcx_spi_ops);
- }
- return 0;
- }
- INIT_DEVICE_EXPORT(rt_hw_spi_init);
|