1 /******************************************************************************
2 *
3 * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4 * Analog Devices, Inc.),
5 * Copyright (C) 2023-2024 Analog Devices, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 ******************************************************************************/
20
21 #include <stdio.h>
22 #include <stddef.h>
23 #include <stdint.h>
24 #include "mxc_device.h"
25 #include "mxc_assert.h"
26 #include "mxc_lock.h"
27 #include "mxc_sys.h"
28 #include "mxc_delay.h"
29 #include "spimss_reva_regs.h"
30 #include "spimss_reva.h"
31
32 /* **** Functions **** */
33
34 /* ************************************************************************** */
MXC_SPIMSS_Init(mxc_spimss_regs_t * spi,unsigned mode,unsigned freq,const sys_map_t sys_cfg)35 int MXC_SPIMSS_Init(mxc_spimss_regs_t *spi, unsigned mode, unsigned freq, const sys_map_t sys_cfg)
36 {
37 int spi_num;
38
39 spi_num = MXC_SPIMSS_GET_IDX(spi);
40
41 MXC_ASSERT(spi_num >= 0);
42
43 if (mode > 3) {
44 return E_BAD_PARAM;
45 }
46
47 // Check if frequency is too high
48 if (freq > PeripheralClock) {
49 return E_BAD_PARAM;
50 }
51
52 // Configure GPIO for spimss
53 if (spi == MXC_SPIMSS) {
54 MXC_GCR->rst0 |= MXC_F_GCR_RST0_SPI1;
55 while (MXC_GCR->rst0 & MXC_F_GCR_RST0_SPI1) {}
56 MXC_GCR->pclk_dis0 &= ~(MXC_F_GCR_PCLK_DIS0_SPI1D);
57 if (sys_cfg == MAP_A) {
58 MXC_GPIO_Config(&gpio_cfg_spi1a); // SPI1A chosen
59 } else if (sys_cfg == MAP_B) {
60 MXC_GPIO_Config(&gpio_cfg_spi1b); // SPI1B chosen
61 } else {
62 return E_BAD_PARAM;
63 }
64 } else {
65 return E_NO_DEVICE;
66 }
67
68 return MXC_SPIMSS_RevA_Init((mxc_spimss_reva_regs_t *)spi, mode, freq);
69 }
70 /* ************************************************************************* */
MXC_SPIMSS_Shutdown(mxc_spimss_regs_t * spi)71 int MXC_SPIMSS_Shutdown(mxc_spimss_regs_t *spi)
72 {
73 int spi_num;
74 spi_num = MXC_SPIMSS_GET_IDX(spi);
75 MXC_ASSERT(spi_num >= 0);
76
77 MXC_SPIMSS_RevA_Shutdown((mxc_spimss_reva_regs_t *)spi);
78
79 if (spi == MXC_SPIMSS) {
80 MXC_GCR->pclk_dis0 |= (MXC_F_GCR_PCLK_DIS0_SPI1D);
81 }
82 return E_NO_ERROR;
83 }
84 /* ************************************************************************** */
MXC_SPIMSS_Handler(mxc_spimss_regs_t * spi)85 void MXC_SPIMSS_Handler(mxc_spimss_regs_t *spi) // From the IRQ
86 {
87 MXC_SPIMSS_RevA_Handler((mxc_spimss_reva_regs_t *)spi);
88 }
89
90 /* ************************************************************************** */
MXC_SPIMSS_MasterTrans(mxc_spimss_regs_t * spi,mxc_spimss_req_t * req)91 int MXC_SPIMSS_MasterTrans(mxc_spimss_regs_t *spi, mxc_spimss_req_t *req)
92 {
93 return MXC_SPIMSS_RevA_MasterTrans((mxc_spimss_reva_regs_t *)spi, (spimss_reva_req_t *)req);
94 }
95
96 /* ************************************************************************** */
MXC_SPIMSS_MasterTransDMA(mxc_spimss_regs_t * spi,mxc_spimss_req_t * req)97 int MXC_SPIMSS_MasterTransDMA(mxc_spimss_regs_t *spi, mxc_spimss_req_t *req)
98 {
99 return MXC_SPIMSS_RevA_MasterTransDMA((mxc_spimss_reva_regs_t *)spi, (spimss_reva_req_t *)req);
100 }
101
102 /* ************************************************************************** */
MXC_SPIMSS_SlaveTrans(mxc_spimss_regs_t * spi,mxc_spimss_req_t * req)103 int MXC_SPIMSS_SlaveTrans(mxc_spimss_regs_t *spi, mxc_spimss_req_t *req)
104 {
105 return MXC_SPIMSS_RevA_SlaveTrans((mxc_spimss_reva_regs_t *)spi, (spimss_reva_req_t *)req);
106 }
107
108 /* ************************************************************************** */
MXC_SPIMSS_MasterTransAsync(mxc_spimss_regs_t * spi,mxc_spimss_req_t * req)109 int MXC_SPIMSS_MasterTransAsync(mxc_spimss_regs_t *spi, mxc_spimss_req_t *req)
110 {
111 return MXC_SPIMSS_RevA_MasterTransAsync((mxc_spimss_reva_regs_t *)spi,
112 (spimss_reva_req_t *)req);
113 }
114
115 /* ************************************************************************** */
MXC_SPIMSS_SlaveTransAsync(mxc_spimss_regs_t * spi,mxc_spimss_req_t * req)116 int MXC_SPIMSS_SlaveTransAsync(mxc_spimss_regs_t *spi, mxc_spimss_req_t *req)
117 {
118 return MXC_SPIMSS_RevA_SlaveTransAsync((mxc_spimss_reva_regs_t *)spi, (spimss_reva_req_t *)req);
119 }
120
121 /* ************************************************************************* */
MXC_SPIMSS_AbortAsync(mxc_spimss_req_t * req)122 int MXC_SPIMSS_AbortAsync(mxc_spimss_req_t *req)
123 {
124 return MXC_SPIMSS_RevA_AbortAsync((spimss_reva_req_t *)req);
125 }
126
127 /* ************************************************************************* */
MXC_SPIMSS_SetAutoDMAHandlers(mxc_spimss_regs_t * spi,bool enable)128 int MXC_SPIMSS_SetAutoDMAHandlers(mxc_spimss_regs_t *spi, bool enable)
129 {
130 return MXC_SPIMSS_RevA_SetAutoDMAHandlers((mxc_spimss_reva_regs_t *)spi, enable);
131 }
132
133 /* ************************************************************************* */
MXC_SPIMSS_SetTXDMAChannel(mxc_spimss_regs_t * spi,unsigned int channel)134 int MXC_SPIMSS_SetTXDMAChannel(mxc_spimss_regs_t *spi, unsigned int channel)
135 {
136 return MXC_SPIMSS_RevA_SetTXDMAChannel((mxc_spimss_reva_regs_t *)spi, channel);
137 }
138
139 /* ************************************************************************* */
MXC_SPIMSS_GetTXDMAChannel(mxc_spimss_regs_t * spi)140 int MXC_SPIMSS_GetTXDMAChannel(mxc_spimss_regs_t *spi)
141 {
142 return MXC_SPIMSS_RevA_GetTXDMAChannel((mxc_spimss_reva_regs_t *)spi);
143 }
144
145 /* ************************************************************************* */
MXC_SPIMSS_SetRXDMAChannel(mxc_spimss_regs_t * spi,unsigned int channel)146 int MXC_SPIMSS_SetRXDMAChannel(mxc_spimss_regs_t *spi, unsigned int channel)
147 {
148 return MXC_SPIMSS_RevA_SetRXDMAChannel((mxc_spimss_reva_regs_t *)spi, channel);
149 }
150
151 /* ************************************************************************* */
MXC_SPIMSS_GetRXDMAChannel(mxc_spimss_regs_t * spi)152 int MXC_SPIMSS_GetRXDMAChannel(mxc_spimss_regs_t *spi)
153 {
154 return MXC_SPIMSS_RevA_GetRXDMAChannel((mxc_spimss_reva_regs_t *)spi);
155 }
156