00001
00038 #ifndef SPI_SPI_XMEGA_H_INCLUDED
00039 #define SPI_SPI_XMEGA_H_INCLUDED
00040
00041 #include <clk/sys.h>
00042 #include <spi/spi_polled.h>
00043
00054
00055 struct spi_master_priv {
00057 struct spi_master_polled base;
00059 void *regs;
00060 };
00061
00062 #define SPI_MASTER_NATIVE_TYPE spi_master_priv
00063
00064 #define SPI_MASTER_NATIVE_GET_BASE(spim_p) \
00065 (&((struct spi_master_priv *)spim_p)->base.base)
00066
00068 struct spi_device_priv {
00070 struct spi_device base;
00072 uint8_t ctrl;
00073 };
00074
00075 #define SPI_DEVICE_NATIVE_TYPE spi_device_priv
00076
00077 #define SPI_DEVICE_NATIVE_GET_BASE(spid_p) \
00078 (&((struct spi_device_priv *)spid_p)->base)
00079
00081 typedef uint8_t spi_id_t;
00082
00084 typedef uint8_t spi_flags_t;
00085
00086 static inline struct spi_master_priv *spi_master_priv_of(
00087 struct spi_master *spim)
00088 {
00089 return container_of(spim, struct spi_master_priv, base.base);
00090 }
00091
00092 static inline struct spi_device_priv *spi_device_priv_of(
00093 struct spi_device *spid)
00094 {
00095 return container_of(spid, struct spi_device_priv, base);
00096 }
00097
00098 static inline void spi_priv_enable(spi_id_t spi_id)
00099 {
00100 sysclk_enable_module(spi_get_sysclk_port(spi_id), SYSCLK_SPI);
00101 spi_write_reg(spi_get_base(spi_id), CTRL, SPI_BIT(CTRL_ENABLE));
00102 }
00103
00104 static inline void spi_priv_disable(spi_id_t spi_id)
00105 {
00106 spi_write_reg(spi_get_base(spi_id), CTRL, 0);
00107 sysclk_disable_module(spi_get_sysclk_port(spi_id), SYSCLK_SPI);
00108 }
00109
00110 static inline bool spi_priv_is_enabled(spi_id_t spi_id)
00111 {
00112 return spi_read_reg(spi_get_base(spi_id), CTRL) &
00113 SPI_BIT(CTRL_ENABLE);
00114 }
00115
00116 static inline bool spi_priv_is_int_flag_set(struct spi_master *spim)
00117 {
00118 struct spi_master_priv *spim_p = spi_master_priv_of(spim);
00119
00120 return spi_read_reg(spim_p->regs, STATUS) & SPI_BIT(STATUS_IF);
00121 }
00122
00123 static inline uint8_t spi_priv_read_data(struct spi_master *spim)
00124 {
00125 struct spi_master_priv *spim_p = spi_master_priv_of(spim);
00126
00127 return spi_read_reg(spim_p->regs, DATA);
00128 }
00129
00130 static inline void spi_priv_write_data(struct spi_master *spim, uint8_t data)
00131 {
00132 struct spi_master_priv *spim_p = spi_master_priv_of(spim);
00133
00134 spi_write_reg(spim_p->regs, DATA, data);
00135 }
00136
00137 static inline void spi_priv_master_setup_device_regs(struct spi_device *device,
00138 spi_flags_t flags, unsigned long baud_rate)
00139 {
00140 struct spi_device_priv *spid_p = spi_device_priv_of(device);
00141 uint8_t i;
00142 uint32_t prescaled_hz = CONFIG_CPU_HZ >> 1;
00143 uint8_t ctrl;
00144
00145
00146 ctrl = SPI_BIT(CTRL_ENABLE) | SPI_BIT(CTRL_MASTER) |
00147 SPI_BF(CTRL_MODE, flags);
00148
00149 for (i = 0; i < 7; i++) {
00150 if (prescaled_hz <= baud_rate)
00151 break;
00152 prescaled_hz >>= 1;
00153 }
00154 if (!(i & 1))
00155 ctrl |= SPI_BIT(CTRL_CLK2X);
00156 ctrl |= SPI_BF(CTRL_PRESCALER, i >> 1);
00157
00158 spid_p->ctrl = ctrl;
00159 }
00160
00161 static inline void spi_priv_select_device_regs(struct spi_master *spim,
00162 struct spi_device *device)
00163 {
00164 struct spi_master_priv *spim_p = spi_master_priv_of(spim);
00165 struct spi_device_priv *spid_p = spi_device_priv_of(device);
00166
00167 spi_write_reg(spim_p->regs, CTRL, spid_p->ctrl);
00168 }
00169
00170 static inline void spi_priv_deselect_device_regs(struct spi_master *spim,
00171 struct spi_device *device)
00172 {
00173 }
00174
00175 static inline void spi_priv_master_init_regs(spi_id_t spi_id,
00176 struct spi_master *spim)
00177 {
00178 struct spi_master_priv *spim_p = spi_master_priv_of(spim);
00179
00180 spim_p->regs = spi_get_base(spi_id);
00181
00182 spi_write_reg(spim_p->regs, CTRL,
00183 SPI_BIT(CTRL_ENABLE) | SPI_BIT(CTRL_MASTER));
00184
00185
00186 spi_read_reg(spim_p->regs, STATUS);
00187 spi_read_reg(spim_p->regs, DATA);
00188 }
00189
00191 #endif