From bae00a3d42f150482c973a7238f3501ccd026063 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 3 Dec 2009 08:59:12 +0000
Subject: Added support for the Dataflash mounted on the XPLAIN board. Added
 new XPLAIN_REV1 board target for the first revision XPLAIN board, which used
 a different (smaller) Dataflash IC to later revisions.

---
 LUFA/Common/BoardTypes.h               |   7 +-
 LUFA/Drivers/Board/Dataflash.h         |   4 ++
 LUFA/Drivers/Board/LEDs.h              |   2 +
 LUFA/Drivers/Board/STK525/Dataflash.h  |   2 +-
 LUFA/Drivers/Board/STK526/Dataflash.h  |   2 +-
 LUFA/Drivers/Board/USBKEY/Dataflash.h  |   2 +-
 LUFA/Drivers/Board/XPLAIN/AT45DB642D.h | 102 +++++++++++++++++++++++++++
 LUFA/Drivers/Board/XPLAIN/Dataflash.h  | 124 +++++++++++++++++++++++++++++++++
 LUFA/ManPages/ChangeLog.txt            |   2 +
 LUFA/ManPages/DeviceSupport.txt        |   3 +-
 10 files changed, 244 insertions(+), 6 deletions(-)
 create mode 100644 LUFA/Drivers/Board/XPLAIN/AT45DB642D.h
 create mode 100644 LUFA/Drivers/Board/XPLAIN/Dataflash.h

(limited to 'LUFA')

diff --git a/LUFA/Common/BoardTypes.h b/LUFA/Common/BoardTypes.h
index 38d0af14c..5d5535801 100644
--- a/LUFA/Common/BoardTypes.h
+++ b/LUFA/Common/BoardTypes.h
@@ -80,9 +80,12 @@
 
 			/** Selects the BUMBLEB specific board drivers, using the officially recommended peripheral layout. */
 			#define BOARD_BUMBLEB       6
-
-			/** Selects the XPLAIN specific board drivers, including LED driver. */
+			
+			/** Selects the XPLAIN (Revision 2 or newer) specific board drivers, including LED and Dataflash driver. */
 			#define BOARD_XPLAIN        7
+
+			/** Selects the XPLAIN (Revision 1) specific board drivers, including LED and Dataflash driver. */
+			#define BOARD_XPLAIN_REV1   8
 			
 #endif
 
diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h
index 3502dca41..28ac99677 100644
--- a/LUFA/Drivers/Board/Dataflash.h
+++ b/LUFA/Drivers/Board/Dataflash.h
@@ -158,6 +158,10 @@
 				#include "STK525/Dataflash.h"
 			#elif (BOARD == BOARD_STK526)
 				#include "STK526/Dataflash.h"
+			#elif (BOARD == BOARD_XPLAIN)
+				#include "XPLAIN/Dataflash.h"
+			#elif (BOARD == BOARD_XPLAIN_REV1)
+				#include "XPLAIN/Dataflash.h"
 			#elif (BOARD == BOARD_USER)
 				#include "Board/Dataflash.h"
 			#else
diff --git a/LUFA/Drivers/Board/LEDs.h b/LUFA/Drivers/Board/LEDs.h
index f710734d0..2f217006f 100644
--- a/LUFA/Drivers/Board/LEDs.h
+++ b/LUFA/Drivers/Board/LEDs.h
@@ -90,6 +90,8 @@
 		#include "ATAVRUSBRF01/LEDs.h"
 	#elif (BOARD == BOARD_XPLAIN)
 		#include "XPLAIN/LEDs.h"
+	#elif (BOARD == BOARD_XPLAIN_REV1)
+		#include "XPLAIN/LEDs.h"
 	#elif (BOARD == BOARD_BUMBLEB)
 		#include "BUMBLEB/LEDs.h"
 	#elif (BOARD == BOARD_USER)
diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h
index 33787569a..8fbbb4175 100644
--- a/LUFA/Drivers/Board/STK525/Dataflash.h
+++ b/LUFA/Drivers/Board/STK525/Dataflash.h
@@ -92,7 +92,7 @@
 			{
 				Dataflash_DeselectChip();
 				
-				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				if (PageAddress >= DATAFLASH_PAGES)
 				  return;
 
 				Dataflash_SelectChip(DATAFLASH_CHIP1);
diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h
index 0b388e301..66d23ef10 100644
--- a/LUFA/Drivers/Board/STK526/Dataflash.h
+++ b/LUFA/Drivers/Board/STK526/Dataflash.h
@@ -92,7 +92,7 @@
 			{
 				Dataflash_DeselectChip();
 				
-				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				if (PageAddress >= DATAFLASH_PAGES)
 				  return;
 
 				Dataflash_SelectChip(DATAFLASH_CHIP1);
diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h
index 52681dedb..41ca278a9 100644
--- a/LUFA/Drivers/Board/USBKEY/Dataflash.h
+++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h
@@ -30,7 +30,7 @@
 
 /** \file
  *
- *  Board specific Dataflash driver header for the STK525.
+ *  Board specific Dataflash driver header for the USBKEY.
  *
  *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
  *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
diff --git a/LUFA/Drivers/Board/XPLAIN/AT45DB642D.h b/LUFA/Drivers/Board/XPLAIN/AT45DB642D.h
new file mode 100644
index 000000000..db8728508
--- /dev/null
+++ b/LUFA/Drivers/Board/XPLAIN/AT45DB642D.h
@@ -0,0 +1,102 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2009.
+              
+  dean [at] fourwalledcubicle [dot] com
+      www.fourwalledcubicle.com
+*/
+
+/*
+  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, and distribute this software
+  and its documentation for any purpose and without fee is hereby
+  granted, 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
+ *
+ *  Board specific Dataflash commands header for the AT45DB642D as mounted on the XPLAIN.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash_XPLAIN
+ *  @defgroup Group_Dataflash_XPLAIN_AT45DB642D AT45DB642D
+ *
+ *  @{
+ */
+ 
+#ifndef __DATAFLASH_CMDS_H__
+#define __DATAFLASH_CMDS_H__
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#define DF_STATUS_READY                         (1 << 7)
+			#define DF_STATUS_COMPMISMATCH                  (1 << 6)
+			#define DF_STATUS_SECTORPROTECTION_ON           (1 << 1)
+			#define DF_STATUS_BINARYPAGESIZE_ON             (1 << 0)
+			
+			#define DF_MANUFACTURER_ATMEL                   0x1F
+		
+			#define DF_CMD_GETSTATUS                        0xD7
+			#define DF_CMD_POWERDOWN                        0xB9
+			#define DF_CMD_WAKEUP                           0xAB
+
+			#define DF_CMD_MAINMEMTOBUFF1                   0x53
+			#define DF_CMD_MAINMEMTOBUFF2                   0x55
+			#define DF_CMD_MAINMEMTOBUFF1COMP               0x60
+			#define DF_CMD_MAINMEMTOBUFF2COMP               0x61
+			#define DF_CMD_AUTOREWRITEBUFF1                 0x58
+			#define DF_CMD_AUTOREWRITEBUFF2                 0x59
+			
+			#define DF_CMD_MAINMEMPAGEREAD                  0xD2
+			#define DF_CMD_CONTARRAYREAD_LF                 0x03
+			#define DF_CMD_BUFF1READ_LF                     0xD1
+			#define DF_CMD_BUFF2READ_LF                     0xD3
+			
+			#define DF_CMD_BUFF1WRITE                       0x84
+			#define DF_CMD_BUFF2WRITE                       0x87
+			#define DF_CMD_BUFF1TOMAINMEMWITHERASE          0x83
+			#define DF_CMD_BUFF2TOMAINMEMWITHERASE          0x86
+			#define DF_CMD_BUFF1TOMAINMEM                   0x88
+			#define DF_CMD_BUFF2TOMAINMEM                   0x89
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF1          0x82
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF2          0x85
+			
+			#define DF_CMD_PAGEERASE                        0x81
+			#define DF_CMD_BLOCKERASE                       0x50
+			#define DF_CMD_SECTORERASE                      0x7C
+
+			#define DF_CMD_CHIPERASE                        ((char[]){0xC7, 0x94, 0x80, 0x9A})
+			#define DF_CMD_CHIPERASE_BYTE1                  0xC7
+			#define DF_CMD_CHIPERASE_BYTE2                  0x94
+			#define DF_CMD_CHIPERASE_BYTE3                  0x80
+			#define DF_CMD_CHIPERASE_BYTE4                  0x9A
+			
+			#define DF_CMD_SECTORPROTECTIONOFF              ((char[]){0x3D, 0x2A, 0x7F, 0x9A})
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE1        0x3D
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE2        0x2A
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE3        0x7F
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE4        0x9A
+			
+			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/XPLAIN/Dataflash.h b/LUFA/Drivers/Board/XPLAIN/Dataflash.h
new file mode 100644
index 000000000..ef9555282
--- /dev/null
+++ b/LUFA/Drivers/Board/XPLAIN/Dataflash.h
@@ -0,0 +1,124 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2009.
+              
+  dean [at] fourwalledcubicle [dot] com
+      www.fourwalledcubicle.com
+*/
+
+/*
+  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, and distribute this software
+  and its documentation for any purpose and without fee is hereby
+  granted, 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
+ *
+ *  Board specific Dataflash driver header for the XPLAIN.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  @defgroup Group_Dataflash_XPLAIN XPLAIN
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_XPLAIN_H__
+#define __DATAFLASH_XPLAIN_H__
+
+	/* Includes: */
+		#include "AT45DB642D.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+		
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                (1 << 5)
+			#define DATAFLASH_CHIPCS_DDR                 DDRB
+			#define DATAFLASH_CHIPCS_PORT                PORTB
+	#endif
+	
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    DATAFLASH_CHIPCS_MASK
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 5)
+
+			#if BOAD == XPLAIN_REV1
+				#define DATAFLASH_PAGE_SIZE              256
+
+				#define DATAFLASH_PAGES                  2048							
+			#else
+				/** Internal main memory page size for the board's dataflash ICs. */
+				#define DATAFLASH_PAGE_SIZE              1024
+
+				/** Total number of pages inside each of the board's dataflash ICs. */
+				#define DATAFLASH_PAGES                  8192			
+			#endif
+			
+		/* Inline Functions: */
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+				
+				if (PageAddress >= DATAFLASH_PAGES)
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-byte address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+			{	
+				PageAddress >>= 1;
+				
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}		
+
+#endif
+
+/** @} */
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index bbded93f3..4d89a293a 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -17,6 +17,8 @@
   *  - Added new RNDIS Ethernet Host ClassDriver demo
   *  - Added CDC_Host_Flush() function to the CDC Host Class driver to flush sent data to the attached device
   *  - Added PDI programming support for XMEGA devices to the AVRISP programmer project
+  *  - Added support for the XPLAIN dataflash, with new XPLAIN_REV1 board target for the different dataflash used on the
+  *    first revision boards compared to the ones mounted on later revisions
   *
   *  <b>Changed:</b>
   *  - Removed code in the Keyboard demos to send zeroed reports between two reports with differing numbers of keycodes
diff --git a/LUFA/ManPages/DeviceSupport.txt b/LUFA/ManPages/DeviceSupport.txt
index 2ee1bf5ac..9cbcadae2 100644
--- a/LUFA/ManPages/DeviceSupport.txt
+++ b/LUFA/ManPages/DeviceSupport.txt
@@ -27,7 +27,8 @@
  *   - STK526
  *   - RZUSBSTICK
  *   - ATAVRUSBRF01
- *   - XPLAIN (AT90USB1287 only)
+ *   - XPLAIN Revision 1 (Board AT90USB1287 only, original 45DB041D Dataflash IC)
+ *   - XPLAIN Revision 2 onwards (Board AT90USB1287 only, newer 45DB642D Dataflash IC)
  *
  *  Currently supported third-party boards (via hardware drivers):
  *   - BUMBLEB (using officially recommended peripheral layout)
-- 
cgit v1.2.3