mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Added new SerialToLCD user project contributed by Simon Foster.
This commit is contained in:
		
							parent
							
								
									47f6a35013
								
							
						
					
					
						commit
						2e757d8c38
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -15,6 +15,7 @@ | |||||||
|   *  - Library Applications: |   *  - Library Applications: | ||||||
|   *   - Modified the CDC Host demos to set a default CDC Line Encoding on enumerated devices |   *   - Modified the CDC Host demos to set a default CDC Line Encoding on enumerated devices | ||||||
|   *   - Added Dataflash operational checks and aborts to all projects using the Dataflash to ensure it is working correctly before use |   *   - Added Dataflash operational checks and aborts to all projects using the Dataflash to ensure it is working correctly before use | ||||||
|  |   *   - Added new SerialToLCD user project contributed by Simon Foster | ||||||
|   * |   * | ||||||
|   *  <b>Changed:</b> |   *  <b>Changed:</b> | ||||||
|   *  - Core: |   *  - Core: | ||||||
|  | |||||||
							
								
								
									
										272
									
								
								Projects/SerialToLCD/Descriptors.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								Projects/SerialToLCD/Descriptors.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,272 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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
 | ||||||
|  |  * | ||||||
|  |  *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special | ||||||
|  |  *  computer-readable structures which the host requests upon device enumeration, to determine | ||||||
|  |  *  the device's capabilities and functions. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "Descriptors.h" | ||||||
|  | 
 | ||||||
|  | /* On some devices, there is a factory set internal serial number which can be automatically sent to the host as
 | ||||||
|  |  * the device's serial number when the Device Descriptor's .SerialNumStrIndex entry is set to USE_INTERNAL_SERIAL. | ||||||
|  |  * This allows the host to track a device across insertions on different ports, allowing them to retain allocated | ||||||
|  |  * resources like COM port numbers and drivers. On demos using this feature, give a warning on unsupported devices | ||||||
|  |  * so that the user can supply their own serial number descriptor instead or remove the USE_INTERNAL_SERIAL value | ||||||
|  |  * from the Device Descriptor (forcing the host to generate a serial number for each device from the VID, PID and | ||||||
|  |  * port location). | ||||||
|  |  */ | ||||||
|  | #if (USE_INTERNAL_SERIAL == NO_DESCRIPTOR) | ||||||
|  | 	#warning USE_INTERNAL_SERIAL is not available on this AVR - please manually construct a device serial descriptor. | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | ||||||
|  |  *  device characteristics, including the supported USB version, control endpoint size and the | ||||||
|  |  *  number of device configurations. The descriptor is read out by the USB host when the enumeration | ||||||
|  |  *  process begins. | ||||||
|  |  */ | ||||||
|  | const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | ||||||
|  | { | ||||||
|  | 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||||
|  | 
 | ||||||
|  | 	.USBSpecification       = VERSION_BCD(01.10), | ||||||
|  | 	.Class                  = CDC_CSCP_CDCClass, | ||||||
|  | 	.SubClass               = CDC_CSCP_NoSpecificSubclass, | ||||||
|  | 	.Protocol               = CDC_CSCP_NoSpecificProtocol, | ||||||
|  | 
 | ||||||
|  | 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||||
|  | 
 | ||||||
|  | 	.VendorID               = 0x03EB, | ||||||
|  | 	.ProductID              = 0x204B, | ||||||
|  | 	.ReleaseNumber          = VERSION_BCD(00.01), | ||||||
|  | 
 | ||||||
|  | 	.ManufacturerStrIndex   = 0x01, | ||||||
|  | 	.ProductStrIndex        = 0x02, | ||||||
|  | 	.SerialNumStrIndex      = USE_INTERNAL_SERIAL, | ||||||
|  | 
 | ||||||
|  | 	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | ||||||
|  |  *  of the device in one of its supported configurations, including information about any device interfaces | ||||||
|  |  *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting | ||||||
|  |  *  a configuration so that the host may correctly communicate with the USB device. | ||||||
|  |  */ | ||||||
|  | const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | ||||||
|  | { | ||||||
|  | 	.Config = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||||
|  | 
 | ||||||
|  | 			.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), | ||||||
|  | 			.TotalInterfaces        = 2, | ||||||
|  | 
 | ||||||
|  | 			.ConfigurationNumber    = 1, | ||||||
|  | 			.ConfigurationStrIndex  = NO_DESCRIPTOR, | ||||||
|  | 
 | ||||||
|  | 			.ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||||
|  | 
 | ||||||
|  | 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_CCI_Interface = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||||
|  | 
 | ||||||
|  | 			.InterfaceNumber        = 0, | ||||||
|  | 			.AlternateSetting       = 0, | ||||||
|  | 
 | ||||||
|  | 			.TotalEndpoints         = 1, | ||||||
|  | 
 | ||||||
|  | 			.Class                  = CDC_CSCP_CDCClass, | ||||||
|  | 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||||
|  | 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||||
|  | 
 | ||||||
|  | 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_Functional_Header = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, | ||||||
|  | 			.Subtype                = CDC_DSUBTYPE_CSInterface_Header, | ||||||
|  | 
 | ||||||
|  | 			.CDCSpecification       = VERSION_BCD(01.10), | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_Functional_ACM = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, | ||||||
|  | 			.Subtype                = CDC_DSUBTYPE_CSInterface_ACM, | ||||||
|  | 
 | ||||||
|  | 			.Capabilities           = 0x06, | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_Functional_Union = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, | ||||||
|  | 			.Subtype                = CDC_DSUBTYPE_CSInterface_Union, | ||||||
|  | 
 | ||||||
|  | 			.MasterInterfaceNumber  = 0, | ||||||
|  | 			.SlaveInterfaceNumber   = 1, | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_NotificationEndpoint = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||||
|  | 
 | ||||||
|  | 			.EndpointAddress        = CDC_NOTIFICATION_EPADDR, | ||||||
|  | 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||||
|  | 			.EndpointSize           = CDC_NOTIFICATION_EPSIZE, | ||||||
|  | 			.PollingIntervalMS      = 0xFF | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_DCI_Interface = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||||
|  | 
 | ||||||
|  | 			.InterfaceNumber        = 1, | ||||||
|  | 			.AlternateSetting       = 0, | ||||||
|  | 
 | ||||||
|  | 			.TotalEndpoints         = 2, | ||||||
|  | 
 | ||||||
|  | 			.Class                  = CDC_CSCP_CDCDataClass, | ||||||
|  | 			.SubClass               = CDC_CSCP_NoDataSubclass, | ||||||
|  | 			.Protocol               = CDC_CSCP_NoDataProtocol, | ||||||
|  | 
 | ||||||
|  | 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_DataOutEndpoint = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||||
|  | 
 | ||||||
|  | 			.EndpointAddress        = CDC_RX_EPADDR, | ||||||
|  | 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||||
|  | 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||||
|  | 			.PollingIntervalMS      = 0x01 | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 	.CDC_DataInEndpoint = | ||||||
|  | 		{ | ||||||
|  | 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||||
|  | 
 | ||||||
|  | 			.EndpointAddress        = CDC_TX_EPADDR, | ||||||
|  | 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||||
|  | 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||||
|  | 			.PollingIntervalMS      = 0x01 | ||||||
|  | 		} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 | ||||||
|  |  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||||
|  |  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||||
|  |  */ | ||||||
|  | const USB_Descriptor_String_t PROGMEM LanguageString = | ||||||
|  | { | ||||||
|  | 	.Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, | ||||||
|  | 
 | ||||||
|  | 	.UnicodeString          = {LANGUAGE_ID_ENG} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable
 | ||||||
|  |  *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||||
|  |  *  Descriptor. | ||||||
|  |  */ | ||||||
|  | const USB_Descriptor_String_t PROGMEM ManufacturerString = | ||||||
|  | { | ||||||
|  | 	.Header                 = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String}, | ||||||
|  | 
 | ||||||
|  | 	.UnicodeString          = L"Simon Foster" | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 | ||||||
|  |  *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | ||||||
|  |  *  Descriptor. | ||||||
|  |  */ | ||||||
|  | const USB_Descriptor_String_t PROGMEM ProductString = | ||||||
|  | { | ||||||
|  | 	.Header                 = {.Size = USB_STRING_LEN(19), .Type = DTYPE_String}, | ||||||
|  | 
 | ||||||
|  | 	.UnicodeString          = L"USB-HD44780 Adapter" | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | ||||||
|  |  *  documentation) by the application code so that the address and size of a requested descriptor can be given | ||||||
|  |  *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function | ||||||
|  |  *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the | ||||||
|  |  *  USB host. | ||||||
|  |  */ | ||||||
|  | uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||||
|  |                                     const uint8_t wIndex, | ||||||
|  |                                     const void** const DescriptorAddress) | ||||||
|  | { | ||||||
|  | 	const uint8_t  DescriptorType   = (wValue >> 8); | ||||||
|  | 	const uint8_t  DescriptorNumber = (wValue & 0xFF); | ||||||
|  | 
 | ||||||
|  | 	const void* Address = NULL; | ||||||
|  | 	uint16_t    Size    = NO_DESCRIPTOR; | ||||||
|  | 
 | ||||||
|  | 	switch (DescriptorType) | ||||||
|  | 	{ | ||||||
|  | 		case DTYPE_Device: | ||||||
|  | 			Address = &DeviceDescriptor; | ||||||
|  | 			Size    = sizeof(USB_Descriptor_Device_t); | ||||||
|  | 			break; | ||||||
|  | 		case DTYPE_Configuration: | ||||||
|  | 			Address = &ConfigurationDescriptor; | ||||||
|  | 			Size    = sizeof(USB_Descriptor_Configuration_t); | ||||||
|  | 			break; | ||||||
|  | 		case DTYPE_String: | ||||||
|  | 			switch (DescriptorNumber) | ||||||
|  | 			{ | ||||||
|  | 				case 0x00: | ||||||
|  | 					Address = &LanguageString; | ||||||
|  | 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||||
|  | 					break; | ||||||
|  | 				case 0x01: | ||||||
|  | 					Address = &ManufacturerString; | ||||||
|  | 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||||
|  | 					break; | ||||||
|  | 				case 0x02: | ||||||
|  | 					Address = &ProductString; | ||||||
|  | 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	*DescriptorAddress = Address; | ||||||
|  | 	return Size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										90
									
								
								Projects/SerialToLCD/Descriptors.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								Projects/SerialToLCD/Descriptors.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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
 | ||||||
|  |  * | ||||||
|  |  *  Header file for Descriptors.c. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _DESCRIPTORS_H_ | ||||||
|  | #define _DESCRIPTORS_H_ | ||||||
|  | 
 | ||||||
|  | 	/* Includes: */ | ||||||
|  | 		#include <avr/pgmspace.h> | ||||||
|  | 
 | ||||||
|  | 		#include <LUFA/Drivers/USB/USB.h> | ||||||
|  | 
 | ||||||
|  | 	/* Macros: */ | ||||||
|  | 		/** Endpoint address of the CDC device-to-host notification IN endpoint. */ | ||||||
|  | 		#define CDC_NOTIFICATION_EPADDR        (ENDPOINT_DIR_IN  | 2) | ||||||
|  | 
 | ||||||
|  | 		/** Endpoint address of the CDC device-to-host data IN endpoint. */ | ||||||
|  | 		#define CDC_TX_EPADDR                  (ENDPOINT_DIR_IN  | 3) | ||||||
|  | 
 | ||||||
|  | 		/** Endpoint address of the CDC host-to-device data OUT endpoint. */ | ||||||
|  | 		#define CDC_RX_EPADDR                  (ENDPOINT_DIR_OUT | 4) | ||||||
|  | 
 | ||||||
|  | 		/** Size in bytes of the CDC device-to-host notification IN endpoint. */ | ||||||
|  | 		#define CDC_NOTIFICATION_EPSIZE        8 | ||||||
|  | 
 | ||||||
|  | 		/** Size in bytes of the CDC data IN and OUT endpoints. */ | ||||||
|  | 		#define CDC_TXRX_EPSIZE                16 | ||||||
|  | 
 | ||||||
|  | 	/* Type Defines: */ | ||||||
|  | 		/** Type define for the device configuration descriptor structure. This must be defined in the
 | ||||||
|  | 		 *  application code, as the configuration descriptor contains several sub-descriptors which | ||||||
|  | 		 *  vary between devices, and which describe the device's usage to the host. | ||||||
|  | 		 */ | ||||||
|  | 		typedef struct | ||||||
|  | 		{ | ||||||
|  | 			USB_Descriptor_Configuration_Header_t    Config; | ||||||
|  | 
 | ||||||
|  | 			// CDC Command Interface
 | ||||||
|  | 			USB_Descriptor_Interface_t               CDC_CCI_Interface; | ||||||
|  | 			USB_CDC_Descriptor_FunctionalHeader_t    CDC_Functional_Header; | ||||||
|  | 			USB_CDC_Descriptor_FunctionalACM_t       CDC_Functional_ACM; | ||||||
|  | 			USB_CDC_Descriptor_FunctionalUnion_t     CDC_Functional_Union; | ||||||
|  | 			USB_Descriptor_Endpoint_t                CDC_NotificationEndpoint; | ||||||
|  | 
 | ||||||
|  | 			// CDC Data Interface
 | ||||||
|  | 			USB_Descriptor_Interface_t               CDC_DCI_Interface; | ||||||
|  | 			USB_Descriptor_Endpoint_t                CDC_DataOutEndpoint; | ||||||
|  | 			USB_Descriptor_Endpoint_t                CDC_DataInEndpoint; | ||||||
|  | 		} USB_Descriptor_Configuration_t; | ||||||
|  | 
 | ||||||
|  | 	/* Function Prototypes: */ | ||||||
|  | 		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||||
|  | 		                                    const uint8_t wIndex, | ||||||
|  | 		                                    const void** const DescriptorAddress) | ||||||
|  | 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
							
								
								
									
										1814
									
								
								Projects/SerialToLCD/Doxygen.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1814
									
								
								Projects/SerialToLCD/Doxygen.conf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										127
									
								
								Projects/SerialToLCD/Lib/HD44780.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								Projects/SerialToLCD/Lib/HD44780.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,127 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "HD44780.h" | ||||||
|  | 
 | ||||||
|  | static void HD44780_WriteNibble(const uint8_t nib) | ||||||
|  | { | ||||||
|  | 	/* Read PORTD and clear the ENABLE and PD0..3 bits 
 | ||||||
|  | 	   then OR in the data */ | ||||||
|  | 	 | ||||||
|  | 	PORTD = (PORTD & ~(ENABLE | LO4_MASK)) | (nib & LO4_MASK); | ||||||
|  | 	 | ||||||
|  | 	/* Enforce address setup time (tAS) 60ns 
 | ||||||
|  | 	   60 @ 16MHz = <1   | ||||||
|  | 	   Let's us a few NOPs for good measure */ | ||||||
|  | 	asm volatile("nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             :: ); | ||||||
|  | 	 | ||||||
|  | 	/* Take enable high and enforce Enable High time (tEH=450ns)
 | ||||||
|  | 	   450ns @ 16MHz = 7.2 => 7 NOPs */ | ||||||
|  | 	    | ||||||
|  | 	PORTD |= ENABLE; | ||||||
|  | 
 | ||||||
|  | 	asm volatile("nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             :: ); | ||||||
|  | 
 | ||||||
|  | 	/* Take enable low and enforce Enable Low time (tEL=500ns)
 | ||||||
|  | 	   500ns @ 16MHz = 8.0 => 7 NOPs */ | ||||||
|  | 	PORTD &= ~ENABLE; | ||||||
|  | 	 | ||||||
|  | 	asm volatile("nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             "nop\n\t" | ||||||
|  | 	             :: ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void HD44780_WriteByte(const uint8_t c) | ||||||
|  | { | ||||||
|  | 	HD44780_WriteNibble(HI4(c)); | ||||||
|  | 	HD44780_WriteNibble(LO4(c)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void HD44780_PowerUp4Bit(void) | ||||||
|  | { | ||||||
|  | 	/*  Wait for more than 40 ms after VCC rises to 2.7 V */ | ||||||
|  | 	_delay_ms(40); | ||||||
|  | 	HD44780_WriteNibble(0x03);        // FN_SET 8-bit
 | ||||||
|  | 
 | ||||||
|  | 	/*  Wait for more than 4.1 ms */ | ||||||
|  | 	_delay_ms(5); | ||||||
|  | 	HD44780_WriteNibble(0x03);        // FN_SET 8-bit
 | ||||||
|  | 	 | ||||||
|  | 	/* Wait for more than 100 µs */ | ||||||
|  | 	_delay_us(100); | ||||||
|  | 	HD44780_WriteNibble(0x03);        // FN_SET 8-bit
 | ||||||
|  | 	 | ||||||
|  | 	/*  From now on we must allow 40us for each command */ | ||||||
|  | 	_delay_us(50); | ||||||
|  | 	HD44780_WriteNibble(0x02);        // FN_SET 4-bit
 | ||||||
|  | 
 | ||||||
|  | 	/*  The LCD is now in 4-bit mode so we can continue
 | ||||||
|  | 		using the 4-bit API */ | ||||||
|  | 	_delay_us(50); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HD44780_Initialise(void) | ||||||
|  | { | ||||||
|  | 	PORTD &= ~ALL_BITS; | ||||||
|  | 	DDRD  |=  ALL_BITS; | ||||||
|  | 	HD44780_PowerUp4Bit(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HD44780_WriteCommand(const uint8_t c) | ||||||
|  | { | ||||||
|  | 	PORTD &= ~RS; | ||||||
|  | 	HD44780_WriteByte(c); | ||||||
|  | 	_delay_us(50); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HD44780_WriteData(const uint8_t c) | ||||||
|  | { | ||||||
|  | 	PORTD |=  RS; | ||||||
|  | 	HD44780_WriteByte(c); | ||||||
|  | 	PORTD &= ~RS; | ||||||
|  | 	_delay_us(50); | ||||||
|  | } | ||||||
							
								
								
									
										64
									
								
								Projects/SerialToLCD/Lib/HD44780.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								Projects/SerialToLCD/Lib/HD44780.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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
 | ||||||
|  |  * | ||||||
|  |  *  Header file for HD44780.c. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _HD44780_H_ | ||||||
|  | #define _HD44780_H_ | ||||||
|  | 	 | ||||||
|  | 	/* Includes: */ | ||||||
|  | 		#include <avr/io.h> | ||||||
|  | 		#include <util/delay.h> | ||||||
|  | 		#include <avr/power.h> | ||||||
|  | 
 | ||||||
|  | 	/* Macros: */ | ||||||
|  | 		#define RS                  (0x10)      // PD4
 | ||||||
|  | 		#define ENABLE              (0x80)      // PD7
 | ||||||
|  | 
 | ||||||
|  | 		#define HI4_MASK            (0xF0) | ||||||
|  | 		#define LO4_MASK            (0x0F)      // PD0..3
 | ||||||
|  | 
 | ||||||
|  | 		#define ALL_BITS            (RS|ENABLE|LO4_MASK) | ||||||
|  | 
 | ||||||
|  | 		#define HI4( c )            (( c & HI4_MASK ) >> 4 ) | ||||||
|  | 		#define LO4( c )            (( c & LO4_MASK ) >> 0 ) | ||||||
|  | 
 | ||||||
|  | 		#define CMD_DISPLAY_ON      0x0C | ||||||
|  | 
 | ||||||
|  | 	/* Function Prototypes: */ | ||||||
|  | 		void HD44780_Initialise(void); | ||||||
|  | 		void HD44780_WriteData(const uint8_t c); | ||||||
|  | 		void HD44780_WriteCommand(const uint8_t c); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										194
									
								
								Projects/SerialToLCD/SerialToLCD.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								Projects/SerialToLCD/SerialToLCD.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,194 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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 
 | ||||||
|  |  * | ||||||
|  |  *  Main source file for the SerialToLCD program. This file contains the main tasks of | ||||||
|  |  *  the project and is responsible for the initial application hardware configuration. | ||||||
|  |  *     | ||||||
|  |  *  \section Hardware Information | ||||||
|  |  * | ||||||
|  |  *    LCD Datasheet:  See http://www.sparkfun.com/datasheets/LCD/HD44780.pdf
 | ||||||
|  |  *    | ||||||
|  |  *   Also see the two articles from EPE which are linked from here: | ||||||
|  |  *   http://en.wikipedia.org/wiki/HD44780_Character_LCD
 | ||||||
|  |  * | ||||||
|  |  *   Connections from the Minimus to the HD44780 as shown below. | ||||||
|  |  *    | ||||||
|  |  *   =========================================================  \n | ||||||
|  |  *   Minimus                 HD44780     Pin                    \n | ||||||
|  |  *   =========================================================  \n | ||||||
|  |  *   PD0                     DB4         11                     \n | ||||||
|  |  *   PD1                     DB5         12                     \n | ||||||
|  |  *   PD2                     DB6         13                     \n | ||||||
|  |  *   PD3                     DB7         14                     \n | ||||||
|  |  *                                                              \n | ||||||
|  |  *   PD4                     RS          4                      \n | ||||||
|  |  *                           RW          5       GND            \n | ||||||
|  |  *   PD7                     EN          6                      \n | ||||||
|  |  *                                                              \n | ||||||
|  |  *                                       1       GND            \n | ||||||
|  |  *                                       2       USB +5V        \n | ||||||
|  |  *                                       3       2k -> GND      \n | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "SerialToLCD.h" | ||||||
|  | 
 | ||||||
|  | /** Circular buffer to hold data from the host before it is sent to the LCD */ | ||||||
|  | static RingBuffer_t FromHost_Buffer; | ||||||
|  | 
 | ||||||
|  | /** Underlying data buffer for \ref FromHost_Buffer, where the stored bytes are located. */ | ||||||
|  | static uint8_t      FromHost_Buffer_Data[128]; | ||||||
|  | 
 | ||||||
|  | /** LUFA CDC Class driver interface configuration and state information. This structure is
 | ||||||
|  |  *  passed to all CDC Class driver functions, so that multiple instances of the same class | ||||||
|  |  *  within a device can be differentiated from one another. | ||||||
|  |  */ | ||||||
|  | USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = | ||||||
|  | 	{ | ||||||
|  | 		.Config = | ||||||
|  | 			{ | ||||||
|  | 				.ControlInterfaceNumber   = 0, | ||||||
|  | 				.DataINEndpoint           = | ||||||
|  | 					{ | ||||||
|  | 						.Address          = CDC_TX_EPADDR, | ||||||
|  | 						.Size             = CDC_TXRX_EPSIZE, | ||||||
|  | 						.Banks            = 1, | ||||||
|  | 					}, | ||||||
|  | 				.DataOUTEndpoint = | ||||||
|  | 					{ | ||||||
|  | 						.Address          = CDC_RX_EPADDR, | ||||||
|  | 						.Size             = CDC_TXRX_EPSIZE, | ||||||
|  | 						.Banks            = 1, | ||||||
|  | 					}, | ||||||
|  | 				.NotificationEndpoint = | ||||||
|  | 					{ | ||||||
|  | 						.Address          = CDC_NOTIFICATION_EPADDR, | ||||||
|  | 						.Size             = CDC_NOTIFICATION_EPSIZE, | ||||||
|  | 						.Banks            = 1, | ||||||
|  | 					}, | ||||||
|  | 			}, | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** Main program entry point. This routine contains the overall program flow, including initial
 | ||||||
|  |  *  setup of all components and the main program loop. | ||||||
|  |  */ | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  | 	SetupHardware(); | ||||||
|  | 
 | ||||||
|  | 	RingBuffer_InitBuffer(&FromHost_Buffer, FromHost_Buffer_Data, sizeof(FromHost_Buffer_Data)); | ||||||
|  | 
 | ||||||
|  | 	sei(); | ||||||
|  | 
 | ||||||
|  | 	for (;;) | ||||||
|  | 	{ | ||||||
|  | 		/* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ | ||||||
|  | 		if (!(RingBuffer_IsFull(&FromHost_Buffer))) | ||||||
|  | 		{ | ||||||
|  | 			int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); | ||||||
|  | 
 | ||||||
|  | 			/* Read bytes from the USB OUT endpoint into the USART transmit buffer */ | ||||||
|  | 			if (!(ReceivedByte < 0)) | ||||||
|  | 			  RingBuffer_Insert(&FromHost_Buffer, ReceivedByte); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		while (RingBuffer_GetCount(&FromHost_Buffer) > 0) | ||||||
|  | 		{ | ||||||
|  | 			static uint8_t escape_pending = 0; | ||||||
|  | 			int16_t HD44780Byte = RingBuffer_Remove(&FromHost_Buffer); | ||||||
|  | 			 | ||||||
|  | 			if (HD44780Byte == COMMAND_ESCAPE) | ||||||
|  | 			{ | ||||||
|  | 				if (escape_pending) | ||||||
|  | 				{ | ||||||
|  | 					HD44780_WriteData(HD44780Byte); | ||||||
|  | 					escape_pending = 0; | ||||||
|  | 				} | ||||||
|  | 				else | ||||||
|  | 				{ | ||||||
|  | 					escape_pending = 1; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				if (escape_pending) | ||||||
|  | 				{ | ||||||
|  | 					HD44780_WriteCommand(HD44780Byte); | ||||||
|  | 					escape_pending = 0; | ||||||
|  | 				} | ||||||
|  | 				else | ||||||
|  | 				{ | ||||||
|  | 					HD44780_WriteData(HD44780Byte); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		CDC_Device_USBTask(&VirtualSerial_CDC_Interface); | ||||||
|  | 		USB_USBTask(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Configures the board hardware and chip peripherals for the application's functionality. */ | ||||||
|  | void SetupHardware(void) | ||||||
|  | { | ||||||
|  | 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||||
|  | 	MCUSR &= ~(1 << WDRF); | ||||||
|  | 	wdt_disable(); | ||||||
|  | 
 | ||||||
|  | 	/* Disable clock division */ | ||||||
|  | 	clock_prescale_set(clock_div_1); | ||||||
|  | 
 | ||||||
|  | 	/* Hardware Initialization */ | ||||||
|  | 	USB_Init(); | ||||||
|  | 
 | ||||||
|  | 	/* Power up the HD44780 Interface */ | ||||||
|  | 	HD44780_Initialise(); | ||||||
|  | 	HD44780_WriteCommand(CMD_DISPLAY_ON); | ||||||
|  | 	 | ||||||
|  | 	/* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ | ||||||
|  | 	TCCR0B = (1 << CS02); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Event handler for the library USB Configuration Changed event. */ | ||||||
|  | void EVENT_USB_Device_ConfigurationChanged(void) | ||||||
|  | { | ||||||
|  | 	bool ConfigSuccess = true; | ||||||
|  | 
 | ||||||
|  | 	ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Event handler for the library USB Control Request reception event. */ | ||||||
|  | void EVENT_USB_Device_ControlRequest(void) | ||||||
|  | { | ||||||
|  | 	CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								Projects/SerialToLCD/SerialToLCD.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Projects/SerialToLCD/SerialToLCD.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2012. | ||||||
|  | 
 | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |            www.lufa-lib.org | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) | ||||||
|  |   Copyright 2012  Simon Foster (simon.foster [at] inbox [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
 | ||||||
|  |  * | ||||||
|  |  *  Header file for SerialToLCD.c. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SERIALTOLCD_H_ | ||||||
|  | #define _SERIALTOLCD_H_ | ||||||
|  | 
 | ||||||
|  |     /* Includes: */ | ||||||
|  |         #include <avr/io.h> | ||||||
|  |         #include <avr/wdt.h> | ||||||
|  |         #include <avr/interrupt.h> | ||||||
|  |         #include <avr/power.h> | ||||||
|  | 
 | ||||||
|  |         #include "Descriptors.h" | ||||||
|  | 		#include "Lib/HD44780.h" | ||||||
|  | 
 | ||||||
|  |         #include <LUFA/Version.h> | ||||||
|  |         #include <LUFA/Drivers/Misc/RingBuffer.h> | ||||||
|  |         #include <LUFA/Drivers/USB/USB.h> | ||||||
|  | 		 | ||||||
|  | 	/* Macros: */ | ||||||
|  | 		#define COMMAND_ESCAPE     0x1B | ||||||
|  | 
 | ||||||
|  |     /* Function Prototypes: */ | ||||||
|  |         void SetupHardware(void); | ||||||
|  | 
 | ||||||
|  |         void EVENT_USB_Device_ConfigurationChanged(void); | ||||||
|  |         void EVENT_USB_Device_ControlRequest(void); | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
							
								
								
									
										51
									
								
								Projects/SerialToLCD/SerialToLCD.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Projects/SerialToLCD/SerialToLCD.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | /** \file | ||||||
|  |  * | ||||||
|  |  *  This file contains special DoxyGen information for the generation of the main page and other special | ||||||
|  |  *  documentation pages. It is not a project source file. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /** \mainpage Simon Foster's USB Serial to HD44780 LCD Project | ||||||
|  |  * | ||||||
|  |  *  \section Sec_Compat Project Compatibility: | ||||||
|  |  * | ||||||
|  |  *  The following list indicates what microcontrollers are compatible with this project. | ||||||
|  |  * | ||||||
|  |  *  - AT90USB162 | ||||||
|  |  * | ||||||
|  |  *  \section Sec_Info USB Information: | ||||||
|  |  * | ||||||
|  |  *  The following table gives a rundown of the USB utilization of this project. | ||||||
|  |  * | ||||||
|  |  *  <table> | ||||||
|  |  *   <tr> | ||||||
|  |  *    <td><b>USB Mode:</b></td> | ||||||
|  |  *    <td>Device</td> | ||||||
|  |  *   </tr> | ||||||
|  |  *   <tr> | ||||||
|  |  *    <td><b>USB Class:</b></td> | ||||||
|  |  *    <td>Communications Device Class (CDC)</td> | ||||||
|  |  *   </tr> | ||||||
|  |  *   <tr> | ||||||
|  |  *    <td><b>USB Subclass:</b></td> | ||||||
|  |  *    <td>Abstract Control Model (ACM)</td> | ||||||
|  |  *   </tr> | ||||||
|  |  *   <tr> | ||||||
|  |  *    <td><b>Relevant Standards:</b></td> | ||||||
|  |  *    <td>USBIF CDC Class Standard</td> | ||||||
|  |  *   </tr> | ||||||
|  |  *   <tr> | ||||||
|  |  *    <td><b>Usable Speeds:</b></td> | ||||||
|  |  *    <td>Full Speed Mode</td> | ||||||
|  |  *   </tr> | ||||||
|  |  *  </table> | ||||||
|  |  * | ||||||
|  |  *  \section Sec_Description Project Description: | ||||||
|  |  * | ||||||
|  |  *  Firmware for a USB Virtual Serial to HD44780 LCD controller project, by Simon Foster. This | ||||||
|  |  *  project connects a standard HD7780 compatible LCD controller to a PC via a virtual serial | ||||||
|  |  *  link, so that data supplied by the host can be written to the display. This project is | ||||||
|  |  *  designed to use the Minimum USB AVR board, however it can be modified to suit other hardware | ||||||
|  |  *  if desired. | ||||||
|  |  * | ||||||
|  |  *  See comments in the SerialToLCD.c source file for hardware pinouts of the Minimus board. | ||||||
|  |  */ | ||||||
							
								
								
									
										731
									
								
								Projects/SerialToLCD/makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										731
									
								
								Projects/SerialToLCD/makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,731 @@ | |||||||
|  | # Hey Emacs, this is a -*- makefile -*-
 | ||||||
|  | #----------------------------------------------------------------------------
 | ||||||
|  | # WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
 | ||||||
|  | #  >> Modified for use with the LUFA project. <<
 | ||||||
|  | #
 | ||||||
|  | # Released to the Public Domain
 | ||||||
|  | #
 | ||||||
|  | # Additional material for this makefile was written by:
 | ||||||
|  | # Peter Fleury
 | ||||||
|  | # Tim Henigan
 | ||||||
|  | # Colin O'Flynn
 | ||||||
|  | # Reiner Patommel
 | ||||||
|  | # Markus Pfaff
 | ||||||
|  | # Sander Pool
 | ||||||
|  | # Frederik Rouleau
 | ||||||
|  | # Carlos Lamas
 | ||||||
|  | # Dean Camera
 | ||||||
|  | # Opendous Inc.
 | ||||||
|  | # Denver Gingerich
 | ||||||
|  | #
 | ||||||
|  | #----------------------------------------------------------------------------
 | ||||||
|  | # On command line:
 | ||||||
|  | #
 | ||||||
|  | # make all = Make software.
 | ||||||
|  | #
 | ||||||
|  | # make clean = Clean out built project files.
 | ||||||
|  | #
 | ||||||
|  | # make coff = Convert ELF to AVR COFF.
 | ||||||
|  | #
 | ||||||
|  | # make extcoff = Convert ELF to AVR Extended COFF.
 | ||||||
|  | #
 | ||||||
|  | # make program = Download the hex file to the device, using avrdude.
 | ||||||
|  | #                Please customize the avrdude settings below first!
 | ||||||
|  | #
 | ||||||
|  | # make dfu = Download the hex file to the device, using dfu-programmer (must
 | ||||||
|  | #            have dfu-programmer installed).
 | ||||||
|  | #
 | ||||||
|  | # make flip = Download the hex file to the device, using Atmel FLIP (must
 | ||||||
|  | #             have Atmel FLIP installed).
 | ||||||
|  | #
 | ||||||
|  | # make dfu-ee = Download the eeprom file to the device, using dfu-programmer
 | ||||||
|  | #               (must have dfu-programmer installed).
 | ||||||
|  | #
 | ||||||
|  | # make flip-ee = Download the eeprom file to the device, using Atmel FLIP
 | ||||||
|  | #                (must have Atmel FLIP installed).
 | ||||||
|  | #
 | ||||||
|  | # make doxygen = Generate DoxyGen documentation for the project (must have
 | ||||||
|  | #                DoxyGen installed)
 | ||||||
|  | #
 | ||||||
|  | # make debug = Start either simulavr or avarice as specified for debugging,
 | ||||||
|  | #              with avr-gdb or avr-insight as the front end for debugging.
 | ||||||
|  | #
 | ||||||
|  | # make filename.s = Just compile filename.c into the assembler code only.
 | ||||||
|  | #
 | ||||||
|  | # make filename.i = Create a preprocessed source file for use in submitting
 | ||||||
|  | #                   bug reports to the GCC project.
 | ||||||
|  | #
 | ||||||
|  | # To rebuild project do "make clean" then "make all".
 | ||||||
|  | #----------------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # MCU name
 | ||||||
|  | MCU = at90usb162 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Target architecture (see library "Board Types" documentation).
 | ||||||
|  | ARCH = AVR8 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Target board (see library "Board Types" documentation, NONE for projects not requiring
 | ||||||
|  | # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
 | ||||||
|  | # "Board" inside the application directory.
 | ||||||
|  | BOARD = MINIMUS | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Processor frequency.
 | ||||||
|  | #     This will define a symbol, F_CPU, in all source code files equal to the
 | ||||||
|  | #     processor frequency in Hz. You can then use this symbol in your source code to
 | ||||||
|  | #     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
 | ||||||
|  | #     automatically to create a 32-bit value in your source code.
 | ||||||
|  | #
 | ||||||
|  | #     This will be an integer division of F_USB below, as it is sourced by
 | ||||||
|  | #     F_USB after it has run through any CPU prescalers. Note that this value
 | ||||||
|  | #     does not *change* the processor frequency - it should merely be updated to
 | ||||||
|  | #     reflect the processor speed set externally so that the code can use accurate
 | ||||||
|  | #     software delays.
 | ||||||
|  | F_CPU = 16000000 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Input clock frequency.
 | ||||||
|  | #     This will define a symbol, F_USB, in all source code files equal to the
 | ||||||
|  | #     input clock frequency (before any prescaling is performed) in Hz. This value may
 | ||||||
|  | #     differ from F_CPU if prescaling is used on the latter, and is required as the
 | ||||||
|  | #     raw input clock is fed directly to the PLL sections of the AVR for high speed
 | ||||||
|  | #     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
 | ||||||
|  | #     at the end, this will be done automatically to create a 32-bit value in your
 | ||||||
|  | #     source code.
 | ||||||
|  | #
 | ||||||
|  | #     If no clock division is performed on the input clock inside the AVR (via the
 | ||||||
|  | #     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
 | ||||||
|  | F_USB = $(F_CPU) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Output format. (can be srec, ihex, binary)
 | ||||||
|  | FORMAT = ihex | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Target file name (without extension).
 | ||||||
|  | TARGET = SerialToLCD | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Object files directory
 | ||||||
|  | #     To put object files in current directory, use a dot (.), do NOT make
 | ||||||
|  | #     this an empty or blank macro!
 | ||||||
|  | OBJDIR = . | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Path to the LUFA library
 | ||||||
|  | LUFA_PATH = ../.. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # LUFA library compile-time options and predefined tokens
 | ||||||
|  | LUFA_OPTS  = -D USB_DEVICE_ONLY | ||||||
|  | LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0 | ||||||
|  | LUFA_OPTS += -D ORDERED_EP_CONFIG | ||||||
|  | LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 | ||||||
|  | LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 | ||||||
|  | LUFA_OPTS += -D USE_FLASH_DESCRIPTORS | ||||||
|  | LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" | ||||||
|  | LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create the LUFA source path variables by including the LUFA root makefile
 | ||||||
|  | include $(LUFA_PATH)/LUFA/makefile | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # List C source files here. (C dependencies are automatically generated.)
 | ||||||
|  | SRC = $(TARGET).c                                               \
 | ||||||
|  | 	  Lib/HD44780.c                                             \
 | ||||||
|  | 	  Descriptors.c                                             \
 | ||||||
|  | 	  $(LUFA_SRC_USB)                                           \
 | ||||||
|  | 	  $(LUFA_SRC_USBCLASS) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # List C++ source files here. (C dependencies are automatically generated.)
 | ||||||
|  | CPPSRC = | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # List Assembler source files here.
 | ||||||
|  | #     Make them always end in a capital .S.  Files ending in a lowercase .s
 | ||||||
|  | #     will not be considered source files but generated files (assembler
 | ||||||
|  | #     output from the compiler), and will be deleted upon "make clean"!
 | ||||||
|  | #     Even though the DOS/Win* filesystem matches both .s and .S the same,
 | ||||||
|  | #     it will preserve the spelling of the filenames, and gcc itself does
 | ||||||
|  | #     care about how the name is spelled on its command-line.
 | ||||||
|  | ASRC = | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Optimization level, can be [0, 1, 2, 3, s].
 | ||||||
|  | #     0 = turn off optimization. s = optimize for size.
 | ||||||
|  | #     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
 | ||||||
|  | OPT = s | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Debugging format.
 | ||||||
|  | #     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
 | ||||||
|  | #     AVR Studio 4.10 requires dwarf-2.
 | ||||||
|  | #     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
 | ||||||
|  | DEBUG = dwarf-2 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # List any extra directories to look for include files here.
 | ||||||
|  | #     Each directory must be seperated by a space.
 | ||||||
|  | #     Use forward slashes for directory separators.
 | ||||||
|  | #     For a directory that has spaces, enclose it in quotes.
 | ||||||
|  | EXTRAINCDIRS = $(LUFA_PATH)/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compiler flag to set the C Standard level.
 | ||||||
|  | #     c89   = "ANSI" C
 | ||||||
|  | #     gnu89 = c89 plus GCC extensions
 | ||||||
|  | #     c99   = ISO C99 standard (not yet fully implemented)
 | ||||||
|  | #     gnu99 = c99 plus GCC extensions
 | ||||||
|  | CSTANDARD = -std=gnu99 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Place -D or -U options here for C sources
 | ||||||
|  | CDEFS  = -DF_CPU=$(F_CPU)UL | ||||||
|  | CDEFS += -DF_USB=$(F_USB)UL | ||||||
|  | CDEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) | ||||||
|  | CDEFS += $(LUFA_OPTS) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Place -D or -U options here for ASM sources
 | ||||||
|  | ADEFS  = -DF_CPU=$(F_CPU) | ||||||
|  | ADEFS += -DF_USB=$(F_USB)UL | ||||||
|  | ADEFS += -DBOARD=BOARD_$(BOARD) | ||||||
|  | ADEFS += $(LUFA_OPTS) | ||||||
|  | 
 | ||||||
|  | # Place -D or -U options here for C++ sources
 | ||||||
|  | CPPDEFS  = -DF_CPU=$(F_CPU)UL | ||||||
|  | CPPDEFS += -DF_USB=$(F_USB)UL | ||||||
|  | CPPDEFS += -DBOARD=BOARD_$(BOARD) | ||||||
|  | CPPDEFS += $(LUFA_OPTS) | ||||||
|  | #CPPDEFS += -D__STDC_LIMIT_MACROS
 | ||||||
|  | #CPPDEFS += -D__STDC_CONSTANT_MACROS
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Compiler Options C ----------------
 | ||||||
|  | #  -g*:          generate debugging information
 | ||||||
|  | #  -O*:          optimization level
 | ||||||
|  | #  -f...:        tuning, see GCC manual and avr-libc documentation
 | ||||||
|  | #  -Wall...:     warning level
 | ||||||
|  | #  -Wa,...:      tell GCC to pass this to the assembler.
 | ||||||
|  | #    -adhlns...: create assembler listing
 | ||||||
|  | CFLAGS = -g$(DEBUG) | ||||||
|  | CFLAGS += $(CDEFS) | ||||||
|  | CFLAGS += -O$(OPT) | ||||||
|  | CFLAGS += -funsigned-char | ||||||
|  | CFLAGS += -funsigned-bitfields | ||||||
|  | CFLAGS += -ffunction-sections | ||||||
|  | CFLAGS += -fno-inline-small-functions | ||||||
|  | CFLAGS += -fpack-struct | ||||||
|  | CFLAGS += -fshort-enums | ||||||
|  | CFLAGS += -fno-strict-aliasing | ||||||
|  | CFLAGS += -Wall | ||||||
|  | CFLAGS += -Wstrict-prototypes | ||||||
|  | #CFLAGS += -mshort-calls
 | ||||||
|  | #CFLAGS += -fno-unit-at-a-time
 | ||||||
|  | #CFLAGS += -Wundef
 | ||||||
|  | #CFLAGS += -Wunreachable-code
 | ||||||
|  | #CFLAGS += -Wsign-compare
 | ||||||
|  | CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst) | ||||||
|  | CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) | ||||||
|  | CFLAGS += $(CSTANDARD) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Compiler Options C++ ----------------
 | ||||||
|  | #  -g*:          generate debugging information
 | ||||||
|  | #  -O*:          optimization level
 | ||||||
|  | #  -f...:        tuning, see GCC manual and avr-libc documentation
 | ||||||
|  | #  -Wall...:     warning level
 | ||||||
|  | #  -Wa,...:      tell GCC to pass this to the assembler.
 | ||||||
|  | #    -adhlns...: create assembler listing
 | ||||||
|  | CPPFLAGS = -g$(DEBUG) | ||||||
|  | CPPFLAGS += $(CPPDEFS) | ||||||
|  | CPPFLAGS += -O$(OPT) | ||||||
|  | CPPFLAGS += -funsigned-char | ||||||
|  | CPPFLAGS += -funsigned-bitfields | ||||||
|  | CPPFLAGS += -fpack-struct | ||||||
|  | CPPFLAGS += -fshort-enums | ||||||
|  | CPPFLAGS += -fno-exceptions | ||||||
|  | CPPFLAGS += -Wall | ||||||
|  | CPPFLAGS += -Wundef | ||||||
|  | #CPPFLAGS += -mshort-calls
 | ||||||
|  | #CPPFLAGS += -fno-unit-at-a-time
 | ||||||
|  | #CPPFLAGS += -Wstrict-prototypes
 | ||||||
|  | #CPPFLAGS += -Wunreachable-code
 | ||||||
|  | #CPPFLAGS += -Wsign-compare
 | ||||||
|  | CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst) | ||||||
|  | CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) | ||||||
|  | #CPPFLAGS += $(CSTANDARD)
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Assembler Options ----------------
 | ||||||
|  | #  -Wa,...:   tell GCC to pass this to the assembler.
 | ||||||
|  | #  -adhlns:   create listing
 | ||||||
|  | #  -gstabs:   have the assembler create line number information; note that
 | ||||||
|  | #             for use in COFF files, additional information about filenames
 | ||||||
|  | #             and function names needs to be present in the assembler source
 | ||||||
|  | #             files -- see avr-libc docs [FIXME: not yet described there]
 | ||||||
|  | #  -listing-cont-lines: Sets the maximum number of continuation lines of hex
 | ||||||
|  | #       dump that will be displayed for a given single line of source input.
 | ||||||
|  | ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Library Options ----------------
 | ||||||
|  | # Minimalistic printf version
 | ||||||
|  | PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min | ||||||
|  | 
 | ||||||
|  | # Floating point printf version (requires MATH_LIB = -lm below)
 | ||||||
|  | PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt | ||||||
|  | 
 | ||||||
|  | # If this is left blank, then it will use the Standard printf version.
 | ||||||
|  | PRINTF_LIB = | ||||||
|  | #PRINTF_LIB = $(PRINTF_LIB_MIN)
 | ||||||
|  | #PRINTF_LIB = $(PRINTF_LIB_FLOAT)
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Minimalistic scanf version
 | ||||||
|  | SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min | ||||||
|  | 
 | ||||||
|  | # Floating point + %[ scanf version (requires MATH_LIB = -lm below)
 | ||||||
|  | SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt | ||||||
|  | 
 | ||||||
|  | # If this is left blank, then it will use the Standard scanf version.
 | ||||||
|  | SCANF_LIB = | ||||||
|  | #SCANF_LIB = $(SCANF_LIB_MIN)
 | ||||||
|  | #SCANF_LIB = $(SCANF_LIB_FLOAT)
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | MATH_LIB = -lm | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # List any extra directories to look for libraries here.
 | ||||||
|  | #     Each directory must be seperated by a space.
 | ||||||
|  | #     Use forward slashes for directory separators.
 | ||||||
|  | #     For a directory that has spaces, enclose it in quotes.
 | ||||||
|  | EXTRALIBDIRS = | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- External Memory Options ----------------
 | ||||||
|  | 
 | ||||||
|  | # 64 KB of external RAM, starting after internal RAM (ATmega128!),
 | ||||||
|  | # used for variables (.data/.bss) and heap (malloc()).
 | ||||||
|  | #EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
 | ||||||
|  | 
 | ||||||
|  | # 64 KB of external RAM, starting after internal RAM (ATmega128!),
 | ||||||
|  | # only used for heap (malloc()).
 | ||||||
|  | #EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
 | ||||||
|  | 
 | ||||||
|  | EXTMEMOPTS = | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Linker Options ----------------
 | ||||||
|  | #  -Wl,...:     tell GCC to pass this to linker.
 | ||||||
|  | #    -Map:      create map file
 | ||||||
|  | #    --cref:    add cross reference to  map file
 | ||||||
|  | LDFLAGS  = -Wl,-Map=$(TARGET).map,--cref | ||||||
|  | LDFLAGS += -Wl,--relax | ||||||
|  | LDFLAGS += -Wl,--gc-sections | ||||||
|  | LDFLAGS += $(EXTMEMOPTS) | ||||||
|  | LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) | ||||||
|  | LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) | ||||||
|  | #LDFLAGS += -T linker_script.x
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Programming Options (avrdude) ----------------
 | ||||||
|  | 
 | ||||||
|  | # Programming hardware
 | ||||||
|  | # Type: avrdude -c ?
 | ||||||
|  | # to get a full listing.
 | ||||||
|  | #
 | ||||||
|  | AVRDUDE_PROGRAMMER = jtagmkII | ||||||
|  | 
 | ||||||
|  | # com1 = serial port. Use lpt1 to connect to parallel port.
 | ||||||
|  | AVRDUDE_PORT = usb | ||||||
|  | 
 | ||||||
|  | AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex | ||||||
|  | #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Uncomment the following if you want avrdude's erase cycle counter.
 | ||||||
|  | # Note that this counter needs to be initialized first using -Yn,
 | ||||||
|  | # see avrdude manual.
 | ||||||
|  | #AVRDUDE_ERASE_COUNTER = -y
 | ||||||
|  | 
 | ||||||
|  | # Uncomment the following if you do /not/ wish a verification to be
 | ||||||
|  | # performed after programming the device.
 | ||||||
|  | #AVRDUDE_NO_VERIFY = -V
 | ||||||
|  | 
 | ||||||
|  | # Increase verbosity level.  Please use this when submitting bug
 | ||||||
|  | # reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
 | ||||||
|  | # to submit bug reports.
 | ||||||
|  | #AVRDUDE_VERBOSE = -v -v
 | ||||||
|  | 
 | ||||||
|  | AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) | ||||||
|  | AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) | ||||||
|  | AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) | ||||||
|  | AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #---------------- Debugging Options ----------------
 | ||||||
|  | 
 | ||||||
|  | # For simulavr only - target MCU frequency.
 | ||||||
|  | DEBUG_MFREQ = $(F_CPU) | ||||||
|  | 
 | ||||||
|  | # Set the DEBUG_UI to either gdb or insight.
 | ||||||
|  | # DEBUG_UI = gdb
 | ||||||
|  | DEBUG_UI = insight | ||||||
|  | 
 | ||||||
|  | # Set the debugging back-end to either avarice, simulavr.
 | ||||||
|  | DEBUG_BACKEND = avarice | ||||||
|  | #DEBUG_BACKEND = simulavr
 | ||||||
|  | 
 | ||||||
|  | # GDB Init Filename.
 | ||||||
|  | GDBINIT_FILE = __avr_gdbinit | ||||||
|  | 
 | ||||||
|  | # When using avarice settings for the JTAG
 | ||||||
|  | JTAG_DEV = /dev/com1 | ||||||
|  | 
 | ||||||
|  | # Debugging port used to communicate between GDB / avarice / simulavr.
 | ||||||
|  | DEBUG_PORT = 4242 | ||||||
|  | 
 | ||||||
|  | # Debugging host used to communicate between GDB / avarice / simulavr, normally
 | ||||||
|  | #     just set to localhost unless doing some sort of crazy debugging when
 | ||||||
|  | #     avarice is running on a different computer.
 | ||||||
|  | DEBUG_HOST = localhost | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #============================================================================
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Define programs and commands.
 | ||||||
|  | SHELL = sh | ||||||
|  | CC = avr-gcc | ||||||
|  | OBJCOPY = avr-objcopy | ||||||
|  | OBJDUMP = avr-objdump | ||||||
|  | SIZE = avr-size | ||||||
|  | AR = avr-ar rcs | ||||||
|  | NM = avr-nm | ||||||
|  | AVRDUDE = avrdude | ||||||
|  | REMOVE = rm -f | ||||||
|  | REMOVEDIR = rm -rf | ||||||
|  | COPY = cp | ||||||
|  | WINSHELL = cmd | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Define Messages
 | ||||||
|  | # English
 | ||||||
|  | MSG_ERRORS_NONE = Errors: none | ||||||
|  | MSG_BEGIN = -------- begin -------- | ||||||
|  | MSG_END = --------  end  -------- | ||||||
|  | MSG_SIZE_BEFORE = Size before: | ||||||
|  | MSG_SIZE_AFTER = Size after: | ||||||
|  | MSG_COFF = Converting to AVR COFF: | ||||||
|  | MSG_EXTENDED_COFF = Converting to AVR Extended COFF: | ||||||
|  | MSG_FLASH = Creating load file for Flash: | ||||||
|  | MSG_EEPROM = Creating load file for EEPROM: | ||||||
|  | MSG_EXTENDED_LISTING = Creating Extended Listing: | ||||||
|  | MSG_SYMBOL_TABLE = Creating Symbol Table: | ||||||
|  | MSG_LINKING = Linking: | ||||||
|  | MSG_COMPILING = Compiling C: | ||||||
|  | MSG_COMPILING_CPP = Compiling C++: | ||||||
|  | MSG_ASSEMBLING = Assembling: | ||||||
|  | MSG_CLEANING = Cleaning project: | ||||||
|  | MSG_CREATING_LIBRARY = Creating library: | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Define all object files.
 | ||||||
|  | OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) | ||||||
|  | 
 | ||||||
|  | # Define all listing files.
 | ||||||
|  | LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compiler flags to generate dependency files.
 | ||||||
|  | GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Combine all necessary flags and optional flags.
 | ||||||
|  | # Add target processor to flags.
 | ||||||
|  | ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) | ||||||
|  | ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) | ||||||
|  | ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Default target.
 | ||||||
|  | all: begin gccversion sizebefore build sizeafter end | ||||||
|  | 
 | ||||||
|  | # Change the build target to build a HEX file or a library.
 | ||||||
|  | build: elf hex eep lss sym | ||||||
|  | #build: lib
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | elf: $(TARGET).elf | ||||||
|  | hex: $(TARGET).hex | ||||||
|  | eep: $(TARGET).eep | ||||||
|  | lss: $(TARGET).lss | ||||||
|  | sym: $(TARGET).sym | ||||||
|  | LIBNAME=lib$(TARGET).a | ||||||
|  | lib: $(LIBNAME) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Eye candy.
 | ||||||
|  | # AVR Studio 3.x does not check make's exit code but relies on
 | ||||||
|  | # the following magic strings to be generated by the compile job.
 | ||||||
|  | begin: | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_BEGIN) | ||||||
|  | 
 | ||||||
|  | end: | ||||||
|  | 	@echo $(MSG_END) | ||||||
|  | 	@echo | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Display size of file.
 | ||||||
|  | HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex | ||||||
|  | ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf | ||||||
|  | MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) | ||||||
|  | FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | sizebefore: | ||||||
|  | 	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
 | ||||||
|  | 	2>/dev/null; echo; fi | ||||||
|  | 
 | ||||||
|  | sizeafter: | ||||||
|  | 	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
 | ||||||
|  | 	2>/dev/null; echo; fi | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Display compiler version information.
 | ||||||
|  | gccversion : | ||||||
|  | 	@$(CC) --version | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Program the device.
 | ||||||
|  | program: $(TARGET).hex $(TARGET).eep | ||||||
|  | 	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) | ||||||
|  | 
 | ||||||
|  | flip: $(TARGET).hex | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation erase f | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation start reset 0 | ||||||
|  | 
 | ||||||
|  | dfu: $(TARGET).hex | ||||||
|  | 	dfu-programmer $(MCU) erase | ||||||
|  | 	dfu-programmer $(MCU) flash $(TARGET).hex | ||||||
|  | 	dfu-programmer $(MCU) reset | ||||||
|  | 
 | ||||||
|  | flip-ee: $(TARGET).hex $(TARGET).eep | ||||||
|  | 	$(COPY) $(TARGET).eep $(TARGET)eep.hex | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program | ||||||
|  | 	batchisp -hardware usb -device $(MCU) -operation start reset 0 | ||||||
|  | 	$(REMOVE) $(TARGET)eep.hex | ||||||
|  | 
 | ||||||
|  | dfu-ee: $(TARGET).hex $(TARGET).eep | ||||||
|  | 	dfu-programmer $(MCU) eeprom-flash $(TARGET).eep | ||||||
|  | 	dfu-programmer $(MCU) reset | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Generate avr-gdb config/init file which does the following:
 | ||||||
|  | #     define the reset signal, load the target file, connect to target, and set
 | ||||||
|  | #     a breakpoint at main().
 | ||||||
|  | gdb-config: | ||||||
|  | 	@$(REMOVE) $(GDBINIT_FILE) | ||||||
|  | 	@echo define reset >> $(GDBINIT_FILE) | ||||||
|  | 	@echo SIGNAL SIGHUP >> $(GDBINIT_FILE) | ||||||
|  | 	@echo end >> $(GDBINIT_FILE) | ||||||
|  | 	@echo file $(TARGET).elf >> $(GDBINIT_FILE) | ||||||
|  | 	@echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE) | ||||||
|  | ifeq ($(DEBUG_BACKEND),simulavr) | ||||||
|  | 	@echo load  >> $(GDBINIT_FILE) | ||||||
|  | endif | ||||||
|  | 	@echo break main >> $(GDBINIT_FILE) | ||||||
|  | 
 | ||||||
|  | debug: gdb-config $(TARGET).elf | ||||||
|  | ifeq ($(DEBUG_BACKEND), avarice) | ||||||
|  | 	@echo Starting AVaRICE - Press enter when "waiting to connect" message displays. | ||||||
|  | 	@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
 | ||||||
|  | 	$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) | ||||||
|  | 	@$(WINSHELL) /c pause | ||||||
|  | 
 | ||||||
|  | else | ||||||
|  | 	@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
 | ||||||
|  | 	$(DEBUG_MFREQ) --port $(DEBUG_PORT) | ||||||
|  | endif | ||||||
|  | 	@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
 | ||||||
|  | COFFCONVERT = $(OBJCOPY) --debugging | ||||||
|  | COFFCONVERT += --change-section-address .data-0x800000 | ||||||
|  | COFFCONVERT += --change-section-address .bss-0x800000 | ||||||
|  | COFFCONVERT += --change-section-address .noinit-0x800000 | ||||||
|  | COFFCONVERT += --change-section-address .eeprom-0x810000 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | coff: $(TARGET).elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_COFF) $(TARGET).cof | ||||||
|  | 	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | extcoff: $(TARGET).elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof | ||||||
|  | 	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create final output files (.hex, .eep) from ELF output file.
 | ||||||
|  | %.hex: %.elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_FLASH) $@ | ||||||
|  | 	$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@ | ||||||
|  | 
 | ||||||
|  | %.eep: %.elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_EEPROM) $@ | ||||||
|  | 	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
 | ||||||
|  | 	--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 | ||||||
|  | 
 | ||||||
|  | # Create extended listing file from ELF output file.
 | ||||||
|  | %.lss: %.elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_EXTENDED_LISTING) $@ | ||||||
|  | 	$(OBJDUMP) -h -S -z $< > $@ | ||||||
|  | 
 | ||||||
|  | # Create a symbol table from ELF output file.
 | ||||||
|  | %.sym: %.elf | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_SYMBOL_TABLE) $@ | ||||||
|  | 	$(NM) -n $< > $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create library from object files.
 | ||||||
|  | .SECONDARY : $(TARGET).a | ||||||
|  | .PRECIOUS : $(OBJ) | ||||||
|  | %.a: $(OBJ) | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_CREATING_LIBRARY) $@ | ||||||
|  | 	$(AR) $@ $(OBJ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Link: create ELF output file from object files.
 | ||||||
|  | .SECONDARY : $(TARGET).elf | ||||||
|  | .PRECIOUS : $(OBJ) | ||||||
|  | %.elf: $(OBJ) | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_LINKING) $@ | ||||||
|  | 	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compile: create object files from C source files.
 | ||||||
|  | $(OBJDIR)/%.o : %.c | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_COMPILING) $< | ||||||
|  | 	$(CC) -c $(ALL_CFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compile: create object files from C++ source files.
 | ||||||
|  | $(OBJDIR)/%.o : %.cpp | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_COMPILING_CPP) $< | ||||||
|  | 	$(CC) -c $(ALL_CPPFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compile: create assembler files from C source files.
 | ||||||
|  | %.s : %.c | ||||||
|  | 	$(CC) -S $(ALL_CFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Compile: create assembler files from C++ source files.
 | ||||||
|  | %.s : %.cpp | ||||||
|  | 	$(CC) -S $(ALL_CPPFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Assemble: create object files from assembler source files.
 | ||||||
|  | $(OBJDIR)/%.o : %.S | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_ASSEMBLING) $< | ||||||
|  | 	$(CC) -c $(ALL_ASFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create preprocessed source for use in sending a bug report.
 | ||||||
|  | %.i : %.c | ||||||
|  | 	$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Target: clean project.
 | ||||||
|  | clean: begin clean_list end | ||||||
|  | 
 | ||||||
|  | clean_list : | ||||||
|  | 	@echo | ||||||
|  | 	@echo $(MSG_CLEANING) | ||||||
|  | 	$(REMOVE) $(TARGET).hex | ||||||
|  | 	$(REMOVE) $(TARGET).eep | ||||||
|  | 	$(REMOVE) $(TARGET).cof | ||||||
|  | 	$(REMOVE) $(TARGET).elf | ||||||
|  | 	$(REMOVE) $(TARGET).map | ||||||
|  | 	$(REMOVE) $(TARGET).sym | ||||||
|  | 	$(REMOVE) $(TARGET).lss | ||||||
|  | 	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) | ||||||
|  | 	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) | ||||||
|  | 	$(REMOVE) $(SRC:.c=.s) | ||||||
|  | 	$(REMOVE) $(SRC:.c=.d) | ||||||
|  | 	$(REMOVE) $(SRC:.c=.i) | ||||||
|  | 	$(REMOVEDIR) .dep | ||||||
|  | 
 | ||||||
|  | doxygen: | ||||||
|  | 	@echo Generating Project Documentation \($(TARGET)\)... | ||||||
|  | 	@if ( doxygen Doxygen.conf 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then \
 | ||||||
|  | 	  exit 1; \
 | ||||||
|  | 	fi; | ||||||
|  | 	@echo Documentation Generation Complete. | ||||||
|  | 
 | ||||||
|  | clean_doxygen: | ||||||
|  | 	rm -rf Documentation | ||||||
|  | 
 | ||||||
|  | checksource: | ||||||
|  | 	@for f in $(SRC) $(CPPSRC) $(ASRC); do \
 | ||||||
|  | 		if [ -f $$f ]; then \
 | ||||||
|  | 			echo "Found Source File: $$f" ; \
 | ||||||
|  | 		else \
 | ||||||
|  | 			echo "Source File Not Found: $$f" ; \
 | ||||||
|  | 		fi; done  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Create object files directory
 | ||||||
|  | $(shell mkdir $(OBJDIR) 2>/dev/null) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Include the dependency files.
 | ||||||
|  | -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Listing of phony targets.
 | ||||||
|  | .PHONY : all begin finish end sizebefore sizeafter gccversion \ | ||||||
|  | build elf hex eep lss sym coff extcoff doxygen clean          \ | ||||||
|  | clean_list clean_doxygen program dfu flip flip-ee dfu-ee      \ | ||||||
|  | debug gdb-config checksource | ||||||
| @ -41,6 +41,9 @@ all: | |||||||
| 	$(MAKE) -C RelayBoard clean | 	$(MAKE) -C RelayBoard clean | ||||||
| 	$(MAKE) -C RelayBoard all | 	$(MAKE) -C RelayBoard all | ||||||
| 
 | 
 | ||||||
|  | 	$(MAKE) -C SerialToLCD clean | ||||||
|  | 	$(MAKE) -C SerialToLCD all | ||||||
|  | 
 | ||||||
| 	$(MAKE) -C TempDataLogger clean | 	$(MAKE) -C TempDataLogger clean | ||||||
| 	$(MAKE) -C TempDataLogger all | 	$(MAKE) -C TempDataLogger all | ||||||
| 
 | 
 | ||||||
| @ -63,6 +66,7 @@ all: | |||||||
| 	$(MAKE) -C MIDIToneGenerator $@	 | 	$(MAKE) -C MIDIToneGenerator $@	 | ||||||
| 	$(MAKE) -C MissileLauncher $@ | 	$(MAKE) -C MissileLauncher $@ | ||||||
| 	$(MAKE) -C RelayBoard $@ | 	$(MAKE) -C RelayBoard $@ | ||||||
|  | 	$(MAKE) -C SerialToLCD $@ | ||||||
| 	$(MAKE) -C TempDataLogger $@ | 	$(MAKE) -C TempDataLogger $@ | ||||||
| 	$(MAKE) -C USBtoSerial $@ | 	$(MAKE) -C USBtoSerial $@ | ||||||
| 	$(MAKE) -C Webserver $@ | 	$(MAKE) -C Webserver $@ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera