RTEMS  5.1
m93cxx.h
1 /*===============================================================*\
2 | Project: RTEMS generic MPC5200 BSP |
3 +-----------------------------------------------------------------+
4 | Partially based on the code references which are named below. |
5 | Adaptions, modifications, enhancements and any recent parts of |
6 | the code are: |
7 | Copyright (c) 2005 |
8 | Embedded Brains GmbH |
9 | Obere Lagerstr. 30 |
10 | D-82178 Puchheim |
11 | Germany |
12 | rtems@embedded-brains.de |
13 +-----------------------------------------------------------------+
14 | The license and distribution terms for this file may be |
15 | found in the file LICENSE in this distribution or at |
16 | |
17 | http://www.rtems.org/license/LICENSE. |
18 | |
19 +-----------------------------------------------------------------+
20 | this file contains definitions for the M93Cxx EEPROM devices |
21 \*===============================================================*/
22 /***********************************************************************/
23 /* */
24 /* Module: m93cxx.h */
25 /* Date: 07/17/2003 */
26 /* Purpose: RTEMS M93C64-based header file */
27 /* */
28 /*---------------------------------------------------------------------*/
29 /* */
30 /* Description: M93C46 is a serial microwire EEPROM which contains */
31 /* 1Kbit (128 bytes/64 words) of non-volatile memory. */
32 /* The device can be configured for byte- or word- */
33 /* access. The driver provides a file-like interface */
34 /* to this memory. */
35 /* */
36 /* MPC5x00 PIN settings: */
37 /* */
38 /* PSC3_6 (output) -> MC93C46 serial data in (D) */
39 /* PSC3_7 (input) -> MC93C46 serial data out (Q) */
40 /* PSC3_8 (output) -> MC93C46 chip select input (S) */
41 /* PSC3_9 (output) -> MC93C46 serial clock (C) */
42 /* */
43 /*---------------------------------------------------------------------*/
44 /* */
45 /* Code */
46 /* References: none */
47 /* Module: */
48 /* Project: */
49 /* Version */
50 /* Date: */
51 /* Author: */
52 /* Copyright: */
53 /* */
54 /*---------------------------------------------------------------------*/
55 /* */
56 /* Partially based on the code references which are named above. */
57 /* Adaptions, modifications, enhancements and any recent parts of */
58 /* the code are under the right of */
59 /* */
60 /* IPR Engineering, Dachauer Straße 38, D-80335 München */
61 /* Copyright(C) 2003 */
62 /* */
63 /*---------------------------------------------------------------------*/
64 /* */
65 /* IPR Engineering makes no representation or warranties with */
66 /* respect to the performance of this computer program, and */
67 /* specifically disclaims any responsibility for any damages, */
68 /* special or consequential, connected with the use of this program. */
69 /* */
70 /*---------------------------------------------------------------------*/
71 /* */
72 /* Version history: 1.0 */
73 /* */
74 /***********************************************************************/
75 
76 #ifndef __M93CXX_H__
77 #define __M93CXX_H__
78 
79 #ifdef __cplusplus
80 extern "C" {
81 #endif
82 
83 static void m93cxx_enable_write(void);
84 static void m93cxx_disable_write(void);
85 static void m93cxx_write_byte(uint32_t, uint8_t);
86 static uint8_t m93cxx_read_byte(uint32_t);
87 void wait_usec(unsigned long);
88 
89 #define M93CXX_MODE_WORD
90 /*#define M93C46_MODE_BYTE*/
91 #define M93C46
92 #define M93C46_NVRAM_SIZE 128
93 
94 #define GPIO_PSC3_6 (1 << 12)
95 #define GPIO_PSC3_7 (1 << 13)
96 #define GPIO_PSC3_8 (1 << 26)
97 #define GPIO_PSC3_9 (1 << 26)
98 
99 #define START_BIT 0x1
100 #define EWDS_OPCODE 0x0
101 #define WRAL_OPCODE 0x1
102 #define ERAL_OPCODE 0x2
103 #define EWEN_OPCODE 0x3
104 #define WRITE_OPCODE 0x4
105 #define READ_OPCODE 0x8
106 #define ERASE_OPCODE 0xC
107 
108 #define WAIT(i) wait_usec(i)
109 
110 #define ENABLE_CHIP_SELECT mpc5200.gpiosido |= GPIO_PSC3_8
111 #define DISABLE_CHIP_SELECT mpc5200.gpiosido &= ~GPIO_PSC3_8
112 #define SET_DATA_BIT_HIGH mpc5200.gpiosdo |= GPIO_PSC3_6
113 #define SET_DATA_BIT_LOW mpc5200.gpiosdo &= ~GPIO_PSC3_6
114 
115 #ifdef M93CXX_MODE_BYTE
116 #define GET_DATA_BYTE_SHIFT(val) ((val) |= ((mpc5200.gpiosdi & GPIO_PSC3_7) >> 13)); \
117  ((val) <<= 1)
118 #define SET_DATA_BYTE_SHIFT(val) (((val) & 0x80) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
119  ((val) <<= 1)
120 #else
121 #define GET_DATA_WORD_SHIFT(val) ((val) |= ((mpc5200.gpiosdi & GPIO_PSC3_7) >> 13)); \
122  ((val) <<= 1)
123 #define SET_DATA_WORD_SHIFT(val) (((val) & 0x8000) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
124  ((val) <<= 1)
125 #endif
126 
127 #define MASK_HEAD_SHIFT(head) ((((head) & 0x80000000) >> 31) ? (mpc5200.gpiosdo |= GPIO_PSC3_6) : (mpc5200.gpiosdo &= ~GPIO_PSC3_6)); \
128  ((head) <<= 1)
129 #define DO_CLOCK_CYCLE mpc5200.gpiowdo |= GPIO_PSC3_9; \
130  WAIT(1000); \
131  mpc5200.gpiowdo &= ~GPIO_PSC3_9
132 #define CHECK_WRITE_BUSY while(!(mpc5200.gpiosdi & GPIO_PSC3_7))
133 
134 
135 #ifdef M93CXX_MODE_BYTE
136 #ifdef M93C46
137 #define M93C46_EWDS ((START_BIT << 31) | (EWDS_OPCODE << 27))
138 #define M93C46_WRAL ((START_BIT << 31) | (WRAL_OPCODE << 27))
139 #define M93C46_ERAL ((START_BIT << 31) | (ERAL_OPCODE << 27))
140 #define M93C46_EWEN ((START_BIT << 31) | (EWEN_OPCODE << 27))
141 #define M93C46_READ(addr) ((START_BIT << 31) | (READ_OPCODE << 27) | ((addr) << 22))
142 #define M93C46_WRITE(addr) ((START_BIT << 31) | (WRITE_OPCODE << 27) | ((addr) << 22))
143 #define M93C46_ERASE(addr) ((START_BIT << 31) | (ERASE_OPCODE << 27) | ((addr) << 22))
144 #define M93C46_CLOCK_CYCLES 10
145 #endif
146 #else
147 #ifdef M93C46
148 #define M93C46_EWDS ((START_BIT << 31) | (EWDS_OPCODE << 27))
149 #define M93C46_WRAL ((START_BIT << 31) | (WRAL_OPCODE << 27))
150 #define M93C46_ERAL ((START_BIT << 31) | (ERAL_OPCODE << 27))
151 #define M93C46_EWEN ((START_BIT << 31) | (EWEN_OPCODE << 27))
152 #define M93C46_READ(addr) ((START_BIT << 31) | (READ_OPCODE << 27) | ((addr) << 23))
153 #define M93C46_WRITE(addr) ((START_BIT << 31) | (WRITE_OPCODE << 27) | ((addr) << 23))
154 #define M93C46_ERASE(addr) ((START_BIT << 31) | (ERASE_OPCODE << 27) | ((addr) << 23))
155 #define M93C46_CLOCK_CYCLES 9
156 #endif
157 #endif
158 
159 #ifdef __cplusplus
160 }
161 #endif
162 
163 #endif /* __M93CXX_H__ */