00001
00038 #ifndef SPI_SPI_MEGA_H_INCLUDED
00039 #define SPI_SPI_MEGA_H_INCLUDED
00040
00041 #include <clk/sys.h>
00042 #include <spi/spi_polled.h>
00043
00054 #define SPI_MASTER_NATIVE_TYPE spi_master_polled
00055
00056 #define SPI_MASTER_NATIVE_GET_BASE(spim_p) \
00057 (&((struct spi_master_polled *)spim_p)->base)
00058
00060 struct spi_device_priv {
00062 struct spi_device base;
00064 uint8_t spcr;
00066 uint8_t spsr;
00067 };
00068
00069 #define SPI_DEVICE_NATIVE_TYPE spi_device_priv
00070
00071 #define SPI_DEVICE_NATIVE_GET_BASE(spid_p) \
00072 (&((struct spi_device_priv *)spid_p)->base)
00073
00075 typedef uint8_t spi_id_t;
00076
00077 typedef uint8_t spi_flags_t;
00078
00079 static inline struct spi_device_priv *spi_device_priv_of(
00080 struct spi_device *spid)
00081 {
00082 return container_of(spid, struct spi_device_priv, base);
00083 }
00084
00085 static inline void spi_priv_enable(spi_id_t spi_id)
00086 {
00087 sysclk_enable_module(SYSCLK_SPI);
00088 avr_write_reg8(SPCR, AVR_BIT(SPCR_SPE));
00089 }
00090
00091 static inline void spi_priv_disable(spi_id_t spi_id)
00092 {
00093 avr_write_reg8(SPCR, 0);
00094 sysclk_disable_module(SYSCLK_SPI);
00095 }
00096
00097 static inline bool spi_priv_is_enabled(spi_id_t spi_id)
00098 {
00099 return avr_read_reg8(SPCR) & AVR_BIT(SPCR_SPE);
00100 }
00101
00102 static inline bool spi_priv_is_int_flag_set(struct spi_master *spim)
00103 {
00104 return avr_read_reg8(SPSR) & AVR_BIT(SPSR_SPIF);
00105 }
00106
00107 static inline uint8_t spi_priv_read_data(struct spi_master *spim)
00108 {
00109 return avr_read_reg8(SPDR);
00110 }
00111
00112 static inline void spi_priv_write_data(struct spi_master *spim, uint8_t data)
00113 {
00114 avr_write_reg8(SPDR, data);
00115 }
00116
00117 static inline void spi_priv_master_setup_device_regs(struct spi_device *device,
00118 spi_flags_t flags, unsigned long baud_rate)
00119 {
00120 struct spi_device_priv *spid_p = spi_device_priv_of(device);
00121 uint8_t i;
00122 uint32_t prescaled_hz = CONFIG_CPU_HZ >> 1;
00123 uint8_t spcr;
00124 uint8_t spsr;
00125
00126
00127 spcr = AVR_BIT(SPCR_SPE) | AVR_BIT(SPCR_MSTR) | AVR_BF(SPCR_MODE, flags);
00128
00129 for (i = 0; i < 7; i++) {
00130 if (prescaled_hz <= baud_rate)
00131 break;
00132 prescaled_hz >>= 1;
00133 }
00134 if (!(i & 1))
00135 spsr = AVR_BIT(SPSR_SPI2X);
00136 else
00137 spsr = 0;
00138 spcr |= AVR_BF(SPCR_SPR, i >> 1);
00139
00140 spid_p->spcr = spcr;
00141 spid_p->spsr = spsr;
00142 }
00143
00144 static inline void spi_priv_select_device_regs(struct spi_master *spim,
00145 struct spi_device *device)
00146 {
00147 struct spi_device_priv *spid_p = spi_device_priv_of(device);
00148
00149 avr_write_reg8(SPCR, spid_p->spcr);
00150 avr_write_reg8(SPSR, spid_p->spsr);
00151 }
00152
00153 static inline void spi_priv_deselect_device_regs(struct spi_master *spim,
00154 struct spi_device *device)
00155 {
00156 }
00157
00158 static inline void spi_priv_master_init_regs(spi_id_t spi_id,
00159 struct spi_master *spim)
00160 {
00161 avr_write_reg8(SPCR, AVR_BIT(SPCR_SPE) | AVR_BIT(SPCR_MSTR));
00162
00163
00164 avr_read_reg8(SPSR);
00165 avr_read_reg8(SPDR);
00166 }
00167
00169 #endif