mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Add start of an AVR32 SPI driver.
This commit is contained in:
		
							parent
							
								
									ff8e0ea2d6
								
							
						
					
					
						commit
						99a45fa97d
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										145
									
								
								LUFA/Drivers/Peripheral/AVR32/SPI.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								LUFA/Drivers/Peripheral/AVR32/SPI.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,145 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2010. | ||||||
|  |                | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |       www.fourwalledcubicle.com | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  | 
 | ||||||
|  |   Permission to use, copy, modify, distribute, and sell this  | ||||||
|  |   software and its documentation for any purpose is hereby granted | ||||||
|  |   without fee, provided that the above copyright notice appear in  | ||||||
|  |   all copies and that both that the copyright notice and this | ||||||
|  |   permission notice and warranty disclaimer appear in supporting  | ||||||
|  |   documentation, and that the name of the author not be used in  | ||||||
|  |   advertising or publicity pertaining to distribution of the  | ||||||
|  |   software without specific, written prior permission. | ||||||
|  | 
 | ||||||
|  |   The author disclaim all warranties with regard to this | ||||||
|  |   software, including all implied warranties of merchantability | ||||||
|  |   and fitness.  In no event shall the author be liable for any | ||||||
|  |   special, indirect or consequential damages or any damages | ||||||
|  |   whatsoever resulting from loss of use, data or profits, whether | ||||||
|  |   in an action of contract, negligence or other tortious action, | ||||||
|  |   arising out of or in connection with the use or performance of | ||||||
|  |   this software. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /** \file
 | ||||||
|  |  * | ||||||
|  |  *  SPI driver for the 32-bit AVRs. | ||||||
|  |  * | ||||||
|  |  *  \note This file should not be included directly. It is automatically included as needed by the SPI driver | ||||||
|  |  *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  | /** \ingroup Group_SPI
 | ||||||
|  |  *  @defgroup Group_SPI_AVR32 32-Bit AVR SPI Driver | ||||||
|  |  * | ||||||
|  |  *  SPI driver for the 32-bit AVRs. | ||||||
|  |  * | ||||||
|  |  *  \note This file should not be included directly. It is automatically included as needed by the ADC driver | ||||||
|  |  *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. | ||||||
|  |  * | ||||||
|  |  *  @{ | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __SPI_AVR32_H__ | ||||||
|  | #define __SPI_AVR32_H__ | ||||||
|  | 
 | ||||||
|  | 	/* Includes: */ | ||||||
|  | 		#include <stdbool.h> | ||||||
|  | 
 | ||||||
|  | 	/* Preprocessor Checks: */ | ||||||
|  | 		#if !defined(__INCLUDE_FROM_SPI_H) | ||||||
|  | 			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead. | ||||||
|  | 		#endif | ||||||
|  | 
 | ||||||
|  | 	/* Enable C linkage for C++ Compilers: */ | ||||||
|  | 		#if defined(__cplusplus) | ||||||
|  | 			extern "C" { | ||||||
|  | 		#endif | ||||||
|  | 	 | ||||||
|  | 	/* Public Interface - May be used in end-application: */ | ||||||
|  | 		/* Macros: */ | ||||||
|  | 			/** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 1. */ | ||||||
|  | 			#define SPI_SPEED_FCPU_DIV_1           0 | ||||||
|  | 
 | ||||||
|  | 			/** SPI prescaler mask for SPI_Init(). Divides the system clock by a factor of 32. */ | ||||||
|  | 			#define SPI_SPEED_FCPU_DIV_32          AVR32_SPI_MR_FDIV_MASK | ||||||
|  | 			 | ||||||
|  | 			/** SPI mode mask for SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */ | ||||||
|  | 			#define SPI_MODE_SLAVE                 0 | ||||||
|  | 
 | ||||||
|  | 			/** SPI mode mask for SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */ | ||||||
|  | 			#define SPI_MODE_MASTER                AVR32_SPI_MR_MSTR_MASK | ||||||
|  | 
 | ||||||
|  | 		/* Inline Functions: */ | ||||||
|  | 			/** Initialises the SPI subsystem, ready for transfers. Must be called before calling any other
 | ||||||
|  | 			 *  SPI routines. | ||||||
|  | 			 * | ||||||
|  | 			 *  \param[in] SPIOptions  SPI Options, a mask consisting of one of each of the SPI_SPEED_* | ||||||
|  | 			 *                         and SPI_MODE_* masks | ||||||
|  | 			 */ | ||||||
|  | 			static inline void SPI_Init(const uint8_t SPIOptions) | ||||||
|  | 			{ | ||||||
|  | 				AVR32_SPI.cr = AVR32_SPI_CR_SPIEN_MASK | AVR32_SPI_CR_SWRST_MASK; | ||||||
|  | 				AVR32_SPI.mr = SPIOptions; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */ | ||||||
|  | 			static inline void SPI_ShutDown(void) | ||||||
|  | 			{ | ||||||
|  | 				AVR32_SPI.cr = AVR32_SPI_CR_SPIDIS_MASK; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete.
 | ||||||
|  | 			 * | ||||||
|  | 			 *  \param[in] Byte  Byte to send through the SPI interface | ||||||
|  | 			 * | ||||||
|  | 			 *  \return Response byte from the attached SPI device | ||||||
|  | 			 */ | ||||||
|  | 			static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; | ||||||
|  | 			static inline uint8_t SPI_TransferByte(const uint8_t Byte) | ||||||
|  | 			{ | ||||||
|  | 				AVR32_SPI.tdr = Byte; | ||||||
|  | 				// TODO: Wait for receive
 | ||||||
|  | 				return AVR32_SPI.rdr; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response
 | ||||||
|  | 			 *  byte sent to from the attached SPI device is ignored. | ||||||
|  | 			 * | ||||||
|  | 			 *  \param[in] Byte Byte to send through the SPI interface | ||||||
|  | 			 */ | ||||||
|  | 			static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; | ||||||
|  | 			static inline void SPI_SendByte(const uint8_t Byte) | ||||||
|  | 			{ | ||||||
|  | 				AVR32_SPI.tdr = Byte; | ||||||
|  | 				// TODO: Wait for receive				
 | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			/** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response
 | ||||||
|  | 			 *  byte from the attached SPI device is returned. | ||||||
|  | 			 * | ||||||
|  | 			 *  \return The response byte from the attached SPI device | ||||||
|  | 			 */ | ||||||
|  | 			static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; | ||||||
|  | 			static inline uint8_t SPI_ReceiveByte(void) | ||||||
|  | 			{ | ||||||
|  | 				AVR32_SPI.tdr = 0x00; | ||||||
|  | 				// TODO: Wait for receive				
 | ||||||
|  | 				return AVR32_SPI.rdr; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 	/* Disable C linkage for C++ Compilers: */ | ||||||
|  | 		#if defined(__cplusplus) | ||||||
|  | 			} | ||||||
|  | 		#endif | ||||||
|  | 		 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /** @} */ | ||||||
| @ -80,7 +80,7 @@ | |||||||
| 				 */ | 				 */ | ||||||
| 				static inline bool Serial_IsCharReceived(void); | 				static inline bool Serial_IsCharReceived(void); | ||||||
| 			#else | 			#else | ||||||
| 				#define Serial_IsCharReceived() ((UCSR1A & (1 << RXC1)) ? true : false) | 				#define Serial_IsCharReceived() /* TODO */ | ||||||
| 			#endif | 			#endif | ||||||
| 
 | 
 | ||||||
| 		/* Inline Functions: */ | 		/* Inline Functions: */ | ||||||
| @ -92,27 +92,13 @@ | |||||||
| 			 */ | 			 */ | ||||||
| 			static inline void Serial_Init(const uint32_t BaudRate, const bool DoubleSpeed) | 			static inline void Serial_Init(const uint32_t BaudRate, const bool DoubleSpeed) | ||||||
| 			{ | 			{ | ||||||
| 				UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); | 				// TODO
 | ||||||
| 				UCSR1B = ((1 << TXEN1)  | (1 << RXEN1)); |  | ||||||
| 				UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); |  | ||||||
| 				 |  | ||||||
| 				DDRD  |= (1 << 3);	 |  | ||||||
| 				PORTD |= (1 << 2); |  | ||||||
| 				 |  | ||||||
| 				UBRR1  = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); |  | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ | 			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ | ||||||
| 			static inline void Serial_ShutDown(void) | 			static inline void Serial_ShutDown(void) | ||||||
| 			{ | 			{ | ||||||
| 				UCSR1A = 0; | 				// TODO
 | ||||||
| 				UCSR1B = 0; |  | ||||||
| 				UCSR1C = 0; |  | ||||||
| 				 |  | ||||||
| 				DDRD  &= ~(1 << 3);	 |  | ||||||
| 				PORTD &= ~(1 << 2); |  | ||||||
| 				 |  | ||||||
| 				UBRR1  = 0; |  | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
| 			/** Transmits a given byte through the USART.
 | 			/** Transmits a given byte through the USART.
 | ||||||
| @ -121,8 +107,7 @@ | |||||||
| 			 */ | 			 */ | ||||||
| 			static inline void Serial_TxByte(const char DataByte) | 			static inline void Serial_TxByte(const char DataByte) | ||||||
| 			{ | 			{ | ||||||
| 				while (!(UCSR1A & (1 << UDRE1))); | 				// TODO
 | ||||||
| 				UDR1 = DataByte; |  | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			/** Receives a byte from the USART.
 | 			/** Receives a byte from the USART.
 | ||||||
| @ -131,8 +116,7 @@ | |||||||
| 			 */ | 			 */ | ||||||
| 			static inline uint8_t Serial_RxByte(void) | 			static inline uint8_t Serial_RxByte(void) | ||||||
| 			{ | 			{ | ||||||
| 				while (!(UCSR1A & (1 << RXC1))); | 				// TODO
 | ||||||
| 				return UDR1;  |  | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 	/* Disable C linkage for C++ Compilers: */ | 	/* Disable C linkage for C++ Compilers: */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera