diff --git a/.cproject b/.cproject
index 48e4975..3172efb 100644
--- a/.cproject
+++ b/.cproject
@@ -13,35 +13,29 @@
-
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
+
+
-
-
+
@@ -51,7 +45,7 @@
-
+
@@ -91,32 +85,26 @@
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
+
+
-
-
+
@@ -126,7 +114,7 @@
-
+
@@ -288,4 +276,4 @@
-
+
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..3b46cb4
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,77 @@
+cmake_minimum_required(VERSION 3.13)
+project(SIMMProgrammer)
+
+# Create a list of all source files common to all architectures
+set(SOURCES
+ drivers/mcp23s17.c
+ drivers/parallel_flash.c
+ tests/simm_electrical_test.c
+ main.c
+ simm_programmer.c
+)
+
+# Create a list of all source files specific to the AVR
+set(AVRSOURCES
+ hal/at90usb646/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/ConfigDescriptor.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/DeviceStandardReq.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/Events.c
+ hal/at90usb646/LUFA/Drivers/USB/Core/USBTask.c
+ hal/at90usb646/board.c
+ hal/at90usb646/cdc_device_definition.c
+ hal/at90usb646/Descriptors.c
+ hal/at90usb646/gpio.c
+ hal/at90usb646/parallel_bus.c
+ hal/at90usb646/spi.c
+ hal/at90usb646/usbcdc.c
+)
+
+add_executable(SIMMProgrammer.elf ${SOURCES} ${AVRSOURCES})
+
+# Common compiler options
+target_compile_options(SIMMProgrammer.elf PRIVATE
+ -Wall -Os -std=gnu99 -ffunction-sections -fdata-sections
+)
+
+# Common linker options
+target_link_options(SIMMProgrammer.elf PRIVATE
+ -Wl,-Map,SIMMProgrammer.map -Wl,--gc-sections
+)
+
+# AVR-specific include paths
+target_include_directories(SIMMProgrammer.elf PRIVATE
+ hal/at90usb646
+)
+
+# AVR-specific compiler definitions
+target_compile_definitions(SIMMProgrammer.elf PRIVATE
+ F_CPU=16000000UL
+ F_USB=16000000UL
+ USE_LUFA_CONFIG_HEADER
+)
+
+# AVR-specific compiler options
+target_compile_options(SIMMProgrammer.elf PRIVATE
+ -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=at90usb646
+)
+
+# AVR-specific linker options
+target_link_options(SIMMProgrammer.elf PRIVATE
+ -mmcu=at90usb646
+)
+
+# AVR-specific command/target to generate .bin file from the ELF file. This program
+# is flashed using a bootloader, so there's no need to generate a HEX file.
+add_custom_command(OUTPUT SIMMProgrammer.bin
+ COMMAND ${CMAKE_OBJCOPY} -R .eeprom -O binary SIMMProgrammer.elf SIMMProgrammer.bin
+ DEPENDS SIMMProgrammer.elf
+)
+add_custom_target(SIMMProgrammer_bin ALL DEPENDS SIMMProgrammer.bin)
diff --git a/hal/at90usb646/LUFAConfig.h b/hal/at90usb646/LUFAConfig.h
new file mode 100644
index 0000000..bf683c7
--- /dev/null
+++ b/hal/at90usb646/LUFAConfig.h
@@ -0,0 +1,160 @@
+/*
+ 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)
+
+ 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.
+*/
+
+/*
+ This is a header file which can be used to configure LUFA's
+ compile time options, as an alternative to the compile time
+ constants supplied through a makefile. To use this configuration
+ header, copy this into your project's root directory and supply
+ the \c USE_LUFA_CONFIG_HEADER token to the compiler so that it is
+ defined in all compiled source files.
+
+ For information on what each token does, refer to the LUFA
+ manual section "Summary of Compile Tokens".
+*/
+
+#ifndef __LUFA_CONFIG_H__
+#define __LUFA_CONFIG_H__
+
+ #if (ARCH == ARCH_AVR8)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+ #define ORDERED_EP_CONFIG
+ #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
+ #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+ #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+ #define FIXED_CONTROL_ENDPOINT_SIZE 8
+ #define DEVICE_STATE_AS_GPIOR 0
+ #define FIXED_NUM_CONFIGURATIONS 1
+// #define CONTROL_ONLY_DEVICE
+// #define INTERRUPT_CONTROL_ENDPOINT
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define HOST_STATE_AS_GPIOR {Insert Value Here}
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+// #define NO_AUTO_VBUS_MANAGEMENT
+// #define INVERTED_VBUS_ENABLE_LINE
+
+ #elif (ARCH == ARCH_XMEGA)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define USE_STATIC_OPTIONS {Insert Value Here}
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+// #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
+// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
+// #define FIXED_NUM_CONFIGURATIONS {Insert Value Here}
+// #define CONTROL_ONLY_DEVICE
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ #elif (ARCH == ARCH_UC3)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define ORDERED_EP_CONFIG
+// #define USE_STATIC_OPTIONS {Insert Value Here}
+// #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define NO_INTERNAL_SERIAL
+// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
+// #define FIXED_NUM_CONFIGURATIONS {Insert Value Here}
+// #define CONTROL_ONLY_DEVICE
+// #define INTERRUPT_CONTROL_ENDPOINT
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+// #define NO_AUTO_VBUS_MANAGEMENT
+// #define INVERTED_VBUS_ENABLE_LINE
+
+ #endif
+#endif
+
diff --git a/toolchain-avr.cmake b/toolchain-avr.cmake
new file mode 100644
index 0000000..6a31fbd
--- /dev/null
+++ b/toolchain-avr.cmake
@@ -0,0 +1,15 @@
+# This will tell CMake that we are cross compiling
+set(CMAKE_SYSTEM_NAME Generic)
+set(CMAKE_SYSTEM_VERSION 1)
+set(CMAKE_SYSTEM_PROCESSOR avr)
+
+# Make sure it knows what binaries to use
+set(CMAKE_AR avr-ar)
+set(CMAKE_ASM_COMPILER avr-as)
+set(CMAKE_C_COMPILER avr-gcc)
+set(CMAKE_CXX_COMPILER avr-g++)
+set(CMAKE_LINKER avr-ld)
+set(CMAKE_OBJCOPY avr-objcopy)
+set(CMAKE_RANLIB avr-ranlib)
+set(CMAKE_SIZE avr-size)
+set(CMAKE_STRIP avr-strip)