summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/gen5200/nvram/m93cxx.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/powerpc/gen5200/nvram/m93cxx.h')
-rw-r--r--bsps/powerpc/gen5200/nvram/m93cxx.h163
1 files changed, 163 insertions, 0 deletions
diff --git a/bsps/powerpc/gen5200/nvram/m93cxx.h b/bsps/powerpc/gen5200/nvram/m93cxx.h
new file mode 100644
index 0000000000..a5643dae45
--- /dev/null
+++ b/bsps/powerpc/gen5200/nvram/m93cxx.h
@@ -0,0 +1,163 @@
+/*===============================================================*\
+| Project: RTEMS generic MPC5200 BSP |
++-----------------------------------------------------------------+
+| Partially based on the code references which are named below. |
+| Adaptions, modifications, enhancements and any recent parts of |
+| the code are: |
+| Copyright (c) 2005 |
+| Embedded Brains GmbH |
+| Obere Lagerstr. 30 |
+| D-82178 Puchheim |
+| Germany |
+| rtems@embedded-brains.de |
++-----------------------------------------------------------------+
+| The license and distribution terms for this file may be |
+| found in the file LICENSE in this distribution or at |
+| |
+| http://www.rtems.org/license/LICENSE. |
+| |
++-----------------------------------------------------------------+
+| this file contains definitions for the M93Cxx EEPROM devices |
+\*===============================================================*/
+/***********************************************************************/
+/* */
+/* Module: m93cxx.h */
+/* Date: 07/17/2003 */
+/* Purpose: RTEMS M93C64-based header file */
+/* */
+/*---------------------------------------------------------------------*/
+/* */
+/* Description: M93C46 is a serial microwire EEPROM which contains */
+/* 1Kbit (128 bytes/64 words) of non-volatile memory. */
+/* The device can be configured for byte- or word- */
+/* access. The driver provides a file-like interface */
+/* to this memory. */
+/* */
+/* MPC5x00 PIN settings: */
+/* */
+/* PSC3_6 (output) -> MC93C46 serial data in (D) */
+/* PSC3_7 (input) -> MC93C46 serial data out (Q) */
+/* PSC3_8 (output) -> MC93C46 chip select input (S) */
+/* PSC3_9 (output) -> MC93C46 serial clock (C) */
+/* */
+/*---------------------------------------------------------------------*/
+/* */
+/* Code */
+/* References: none */
+/* Module: */
+/* Project: */
+/* Version */
+/* Date: */
+/* Author: */
+/* Copyright: */
+/* */
+/*---------------------------------------------------------------------*/
+/* */
+/* Partially based on the code references which are named above. */
+/* Adaptions, modifications, enhancements and any recent parts of */
+/* the code are under the right of */
+/* */
+/* IPR Engineering, Dachauer Straße 38, D-80335 München */
+/* Copyright(C) 2003 */
+/* */
+/*---------------------------------------------------------------------*/
+/* */
+/* IPR Engineering makes no representation or warranties with */
+/* respect to the performance of this computer program, and */
+/* specifically disclaims any responsibility for any damages, */
+/* special or consequential, connected with the use of this program. */
+/* */
+/*---------------------------------------------------------------------*/
+/* */
+/* Version history: 1.0 */
+/* */
+/***********************************************************************/
+
+#ifndef __M93CXX_H__
+#define __M93CXX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static void m93cxx_enable_write(void);
+static void m93cxx_disable_write(void);
+static void m93cxx_write_byte(uint32_t, uint8_t);
+static uint8_t m93cxx_read_byte(uint32_t);
+void wait_usec(unsigned long);
+
+#define M93CXX_MODE_WORD
+/*#define M93C46_MODE_BYTE*/
+#define M93C46
+#define M93C46_NVRAM_SIZE 128
+
+#define GPIO_PSC3_6 (1 << 12)
+#define GPIO_PSC3_7 (1 << 13)
+#define GPIO_PSC3_8 (1 << 26)
+#define GPIO_PSC3_9 (1 << 26)
+
+#define START_BIT 0x1
+#define EWDS_OPCODE 0x0
+#define WRAL_OPCODE 0x1
+#define ERAL_OPCODE 0x2
+#define EWEN_OPCODE 0x3
+#define WRITE_OPCODE 0x4
+#define READ_OPCODE 0x8
+#define ERASE_OPCODE 0xC
+
+#define WAIT(i) wait_usec(i)
+
+#define ENABLE_CHIP_SELECT mpc5200.gpiosido |= GPIO_PSC3_8
+#define DISABLE_CHIP_SELECT mpc5200.gpiosido &= ~GPIO_PSC3_8
+#define SET_DATA_BIT_HIGH mpc5200.gpiosdo |= GPIO_PSC3_6
+#define SET_DATA_BIT_LOW mpc5200.gpiosdo &= ~GPIO_PSC3_6
+
+#ifdef M93CXX_MODE_BYTE
+#define GET_DATA_BYTE_SHIFT(val) ((val) |= ((mpc5200.gpiosdi & GPIO_PSC3_7) >> 13)); \
+ ((val) <<= 1)
+#define SET_DATA_BYTE_SHIFT(val) (((val) & 0x80) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
+ ((val) <<= 1)
+#else
+#define GET_DATA_WORD_SHIFT(val) ((val) |= ((mpc5200.gpiosdi & GPIO_PSC3_7) >> 13)); \
+ ((val) <<= 1)
+#define SET_DATA_WORD_SHIFT(val) (((val) & 0x8000) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
+ ((val) <<= 1)
+#endif
+
+#define MASK_HEAD_SHIFT(head) ((((head) & 0x80000000) >> 31) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
+ ((head) <<= 1)
+#define DO_CLOCK_CYCLE mpc5200.gpiowdo |= GPIO_PSC3_9; \
+ WAIT(1000); \
+ mpc5200.gpiowdo &= ~GPIO_PSC3_9
+#define CHECK_WRITE_BUSY while(!(mpc5200.gpiosdi & GPIO_PSC3_7))
+
+
+#ifdef M93CXX_MODE_BYTE
+#ifdef M93C46
+#define M93C46_EWDS ((START_BIT << 31) | (EWDS_OPCODE << 27))
+#define M93C46_WRAL ((START_BIT << 31) | (WRAL_OPCODE << 27))
+#define M93C46_ERAL ((START_BIT << 31) | (ERAL_OPCODE << 27))
+#define M93C46_EWEN ((START_BIT << 31) | (EWEN_OPCODE << 27))
+#define M93C46_READ(addr) ((START_BIT << 31) | (READ_OPCODE << 27) | ((addr) << 22))
+#define M93C46_WRITE(addr) ((START_BIT << 31) | (WRITE_OPCODE << 27) | ((addr) << 22))
+#define M93C46_ERASE(addr) ((START_BIT << 31) | (ERASE_OPCODE << 27) | ((addr) << 22))
+#define M93C46_CLOCK_CYCLES 10
+#endif
+#else
+#ifdef M93C46
+#define M93C46_EWDS ((START_BIT << 31) | (EWDS_OPCODE << 27))
+#define M93C46_WRAL ((START_BIT << 31) | (WRAL_OPCODE << 27))
+#define M93C46_ERAL ((START_BIT << 31) | (ERAL_OPCODE << 27))
+#define M93C46_EWEN ((START_BIT << 31) | (EWEN_OPCODE << 27))
+#define M93C46_READ(addr) ((START_BIT << 31) | (READ_OPCODE << 27) | ((addr) << 23))
+#define M93C46_WRITE(addr) ((START_BIT << 31) | (WRITE_OPCODE << 27) | ((addr) << 23))
+#define M93C46_ERASE(addr) ((START_BIT << 31) | (ERASE_OPCODE << 27) | ((addr) << 23))
+#define M93C46_CLOCK_CYCLES 9
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __M93CXX_H__ */