]> git.sur5r.net Git - freertos/blob - Demo/WizNET_DEMO_TERN_186/include/i2chip_hw.h
Add printf-stdarg.c to the new MicroBlaze demo.
[freertos] / Demo / WizNET_DEMO_TERN_186 / include / i2chip_hw.h
1 /*\r
2 ********************************************************************************\r
3 * TERN, Inc.\r
4 * (c) Copyright 2005, http://www.tern.com\r
5 *\r
6 * - Created to support i2chip module on a variety of TERN hardware platforms.\r
7 ********************************************************************************\r
8 */\r
9 \r
10 #ifndef _I2CHIP_HW_H_\r
11 #define _I2CHIP_HW_H_\r
12 \r
13 #include "types.h"\r
14 \r
15 #ifdef TERN_SC    // SensorCore controller, has mapping identical to the RL\r
16 #define TERN_RL\r
17 #endif\r
18 \r
19 #ifdef TERN_RL    // R-Engine-L controller, with mapping at MCS0.\r
20 #define I2CHIP_MCS_DIRECT\r
21 #define I2CHIP_INT4\r
22 #define TERN_RE\r
23 #endif                // TERN_RL\r
24 \r
25 #ifdef TERN_5E\r
26 #define TERN_586\r
27 #endif\r
28 \r
29 #ifdef TERN_RD\r
30 #define TERN_RE\r
31 #endif                // TERN_RD\r
32 \r
33 #ifdef TERN_RE\r
34 #define TERN_186\r
35 #endif\r
36 \r
37 #ifdef TERN_P51\r
38 void p51_window(unsigned int page);\r
39 #define I2CHIP_WINDOW\r
40 #define I2CHIP_P51\r
41 #ifdef  TERN_186\r
42 #define I2CHIP_INT4\r
43 #define TERN_16_BIT\r
44 #endif                // TERN_186\r
45 #ifdef  TERN_586\r
46 #define I2CHIP_INT0\r
47 #define I2CHIP_WINDOW_IO\r
48 #endif                // TERN_586\r
49 #endif                // TERN_P51\r
50 \r
51 #ifdef TERN_CEYE\r
52 #define TERN_EE       // C-Eye configured with onboard i2chip, same as EE\r
53 #endif\r
54 \r
55 #ifdef TERN_EE\r
56 #define TERN_186\r
57 #define I2CHIP_MCS_DIRECT\r
58 #define I2CHIP_INT4\r
59 #define TERN_16_BIT\r
60 #endif                    // TERN_EE\r
61 \r
62 #ifdef TERN_MMC\r
63 #define I2CHIP_WINDOW\r
64 #define I2CHIP_MMC\r
65 #ifdef TERN_RD\r
66 #define I2CHIP_INT3\r
67 #else\r
68 #ifdef TERN_186\r
69 #define I2CHIP_INT4\r
70 #endif                   // TERN_186\r
71 #endif                   // TERN_RD\r
72 #ifdef TERN_586\r
73 #define I2CHIP_INT0\r
74 #define I2CHIP_WINDOW_IO\r
75 #endif                   // TERN_586\r
76 #endif                   // TERN_MMC\r
77 \r
78 #ifdef TERN_586\r
79 #include "586.h"\r
80 void interrupt far int0_isr(void);\r
81 void interrupt far spu_m_isr(void);\r
82 void interrupt far spu_1_isr(void);\r
83 void interrupt far spu_2_isr(void);\r
84 #define MMCR 0xdf00\r
85 #endif                   // TERN_586\r
86 \r
87 #ifdef TERN_186\r
88 #ifndef TERN_RE\r
89 #include "ae.h"\r
90 #else\r
91 #include "re.h"\r
92 #define I2CHIP_SHIFTED_ADDRESS\r
93 #endif\r
94 #endif\r
95 \r
96 \r
97 #ifndef I2CHIP_MCS_DIRECT\r
98 #ifndef I2CHIP_WINDOW\r
99 #ifndef I2CHIP_WINDOW_IO\r
100 #error You must define the TERN address mapping used to drive the I2CHIP module!\r
101 #endif  // I2CHIP_WINDOW_IO\r
102 #endif  // I2CHIP_MMC_WINDOW\r
103 #endif  // I2CHIP_MCS_DIRECT\r
104 \r
105 #ifndef I2CHIP_INT0\r
106 #ifndef I2CHIP_INT3\r
107 #ifndef I2CHIP_INT4\r
108 #ifndef I2CHIP_POLL\r
109 #error You must specify an interrupt/polling mechanism for the I2CHIP module!\r
110 #endif  // I2CHIP_POLL\r
111 #endif  // I2CHIP_INT3\r
112 #endif  // I2CHIP_INT4\r
113 #endif  // I2CHIP_INT0\r
114 \r
115 #ifdef   I2CHIP_POLL\r
116 #define  I2CHIP_POLL_ISR(a)   { delay_ms(20); disable(); a(); enable(); }\r
117 #define  INT_INIT(isr)\r
118 #define  INT_EOI\r
119 #endif   // I2CHIP_POLL\r
120 \r
121 #ifdef   I2CHIP_INT4\r
122 #define  INT_INIT(isr) int4_init(1, isr)\r
123 #define  INT_EOI       outport(0xff22,0x0010)\r
124 #define  I2CHIP_POLL_ISR(a)\r
125 #endif\r
126 \r
127 #ifdef   I2CHIP_INT3\r
128 #define  INT_INIT(isr) int3_init(1, isr)\r
129 #define  INT_EOI       outport(0xff22,0x000f)\r
130 #define  I2CHIP_POLL_ISR(a)\r
131 #endif\r
132 \r
133 #ifdef   I2CHIP_INT0\r
134 #define  INT_INIT(isr) int0_init(1, isr)\r
135 #define  INT_EOI        outportb(_MPICOCW2_IO,0x61); // 586 only EOI\r
136 #define  I2CHIP_POLL_ISR(a)\r
137 #endif\r
138 \r
139 \r
140 #ifdef   I2CHIP_SHIFTED_ADDRESS\r
141 #define  SA_OFFSET(a)   ((a) << 1)\r
142 #else\r
143 #define  SA_OFFSET(a)   a\r
144 #endif   // I2CHIP_SHIFTED_ADDRESS ... *if*\r
145 \r
146 \r
147 // -------------------- WINDOW-RELATED DEFINES ----------------------\r
148 #ifdef   I2CHIP_WINDOW\r
149 void        i2chip_set_page(u_int addr);\r
150 #define  I2CHIP_SET_PAGE(p) i2chip_set_page(p)\r
151 \r
152 u_char far* i2chip_mkptr(u_int addr);\r
153 void                    i2chip_push_window(u_int addr);\r
154 void                    i2chip_pop_window(void);\r
155 u_int       i2chip_get_window(void);\r
156 void i2chip_set_window(u_int window_addr);\r
157 \r
158 // Set to command window.\r
159 // Note that if you're using other MMC chips within your application, you will\r
160 // need to call this function regularly, if you've changed the MMC chip/page\r
161 // selection via mmc_window().  The driver code otherwise assume that you never\r
162 // change away from chip 7, page 0.\r
163 #define  WINDOW_RESTORE_BASE    i2chip_mkptr(0)\r
164 \r
165 //  ----------------------- I2CHIP_WINDOW_IO ----------------------------\r
166 #ifdef   I2CHIP_WINDOW_IO\r
167 \r
168 #ifdef   TERN_5E\r
169 #define I2CHIP_BASE_SEG    0x2000                       // Address offset for W3100A\r
170 #else\r
171 #define I2CHIP_BASE_SEG    0x1800                       // Address offset for W3100A\r
172 #endif\r
173 \r
174 #define  COMMAND_BASE_SEG     0x0000\r
175 #define SEND_DATA_BUF              0x4000                       // Internal Tx buffer address of W3100A\r
176 #define RECV_DATA_BUF              0x6000                       // Internal Rx buffer address of W3100A\r
177 #define  WINDOW_BASE_SEGM     COMMAND_BASE_SEG\r
178 \r
179 #define  MK_FP_WINDOW(a, b)   i2chip_mkptr(a+SA_OFFSET(b))\r
180 #define  MK_FP_SA             MK_FP_WINDOW\r
181 \r
182 u_char   io_read_value(u_char far* addr);\r
183 void     io_write_value(u_char far* addr, u_char value);\r
184 #define  READ_VALUE(a)        io_read_value(a)\r
185 #define  WRITE_VALUE(a, v)    io_write_value(a, v)\r
186 \r
187 #define  WINDOW_PTR_INC(a)    \\r
188          if ((FP_OFF(a) & 0xff) == 0xff) \\r
189             a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \\r
190          else \\r
191                 a++;\r
192 \r
193 #endif  // I2CHIP_WINDOW_IO\r
194 \r
195 //  -------------------- !NOT! I2CHIP_WINDOW_IO ----------------------------\r
196 #ifndef  I2CHIP_WINDOW_IO\r
197 \r
198 #define  READ_VALUE(a)        *(a)\r
199 #define  WRITE_VALUE(a, v)    *(a) = v\r
200 \r
201 #define  WINDOW_BASE_SEGM  0x8000\r
202 #define  MK_FP_WINDOW(a, b)   i2chip_mkptr(a+SA_OFFSET(b))\r
203 #define  MK_FP_SA  MK_FP_WINDOW\r
204 \r
205 #ifdef   I2CHIP_SHIFTED_ADDRESS\r
206 #define  COMMAND_BASE_SEG  0x0000\r
207 #define  SEND_DATA_BUF     0x8000\r
208 #define  RECV_DATA_BUF     0xC000\r
209 #define  WINDOW_PTR_INC(a)    \\r
210          if ((FP_OFF(a) & 0xff) == 0xfe) \\r
211             a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \\r
212          else \\r
213                 a+=2;\r
214 #else\r
215 #define  COMMAND_BASE_SEG  0x0000\r
216 #define  SEND_DATA_BUF     0x4000\r
217 #define  RECV_DATA_BUF     0x6000\r
218 #define  WINDOW_PTR_INC(a)    \\r
219          if ((FP_OFF(a) & 0xff) == 0xff) \\r
220             a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \\r
221          else \\r
222                 a++;\r
223 #endif   // I2CHIP_SHIFTED_ADDRESS\r
224 #endif   // NOT I2CHIP_WINDOW_IO\r
225 \r
226 #endif   // I2CHIP_WINDOW\r
227 \r
228 //  --------------------  I2CHIP_DIRECT ----------------------------\r
229 #ifdef   I2CHIP_MCS_DIRECT\r
230 \r
231 #define  READ_VALUE(a)        *(a)\r
232 #define  WRITE_VALUE(a, v)    *(a) = v\r
233 \r
234 #define  I2CHIP_BASE_SEG  0x8000\r
235 #define  MK_FP_SA(a, b)   MK_FP(a, SA_OFFSET(b))\r
236 #define  WINDOW_PTR_INC(a)   a+=SA_OFFSET(1);\r
237 #define  WINDOW_RESTORE_BASE\r
238 #define  MK_FP_WINDOW           MK_FP_SA\r
239 #define  WINDOW_BASE_SEG        I2CHIP_BASE_SEG\r
240 #define  COMMAND_BASE_SEG       I2CHIP_BASE_SEG\r
241 \r
242 #ifdef   I2CHIP_SHIFTED_ADDRESS\r
243 #define SEND_DATA_BUF           0x8800                  // Internal Tx buffer address of W3100A\r
244 #define RECV_DATA_BUF           0x8C00                  // Internal Rx buffer address of W3100A\r
245 #else\r
246 #define SEND_DATA_BUF           0x8400                  // Internal Tx buffer address of W3100A\r
247 #define RECV_DATA_BUF           0x8600                  // Internal Rx buffer address of W3100A\r
248 #endif   // I2CHIP_SHIFTED_ADDRESS\r
249 \r
250 #endif   // I2CHIP_MCS_DIRECT\r
251 \r
252 /* Internal register set of W3100A */\r
253 #define COMMAND(i)              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, i)))\r
254 #define INT_STATUS(i)   ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_C0_ISR + i)))\r
255 #define INT_REG                 ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_IR)))\r
256 #define INTMASK         ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_IMR)))\r
257 #define RESETSOCK      ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x0A)))\r
258 \r
259 #define RX_PTR_BASE             I2CHIP_C0_RW_PR\r
260 #define RX_PTR_SIZE             (I2CHIP_C1_RW_PR - I2CHIP_C0_RW_PR)\r
261 \r
262 #define RX_WR_PTR(i)    ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i)))\r
263 #define RX_RD_PTR(i)    ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i + 0x04)))\r
264 #define RX_ACK_PTR(i)   ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i + 0x08)))\r
265 \r
266 #define TX_PTR_BASE             I2CHIP_C0_TW_PR\r
267 #define TX_PTR_SIZE             (I2CHIP_C1_TW_PR - I2CHIP_C0_TW_PR)\r
268 \r
269 #define TX_WR_PTR(i)    ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i)))\r
270 #define TX_RD_PTR(i)    ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i + 0x04)))\r
271 #define TX_ACK_PTR(i)   ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i + 0x08)))\r
272 \r
273 /* Shadow Register Pointer Define */\r
274 /* For windowing purposes, these are definitely outside the first 256-byte Window...\r
275 therefore, use the MK_FP_WINDOW macros instead. */\r
276 #define SHADOW_RXWR_PTR(i)              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E0 + 3*i)))\r
277 #define SHADOW_RXRD_PTR(i)              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E1 + 3*i)))\r
278 #define SHADOW_TXACK_PTR(i)     ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E2 + 3*i)))\r
279 #define SHADOW_TXWR_PTR(i)              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1F0 + 3*i)))\r
280 #define SHADOW_TXRD_PTR(i)              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1F1 + 3*i)))\r
281 \r
282 #define SOCK_BASE               I2CHIP_C0_SSR\r
283 #define SOCK_SIZE               (I2CHIP_C1_SSR - I2CHIP_C0_SSR)\r
284 \r
285 #define SOCK_STATUS(i)  ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i)))\r
286 #define OPT_PROTOCOL(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x01)))\r
287 #define DST_HA_PTR(i)   ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x02)))\r
288 #define DST_IP_PTR(i)   ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x08)))\r
289 #define DST_PORT_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x0C)))\r
290 #define SRC_PORT_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x0E)))\r
291 #define IP_PROTOCOL(i)  ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x10)))\r
292 #define TOS(i)                          ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,SOCK_BASE + SOCK_SIZE * i + 0x11)))\r
293 #define MSS(i)                          ((u_int far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x12)))\r
294 #define P_WINDOW(i)             ((u_int far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,SOCK_BASE + SOCK_SIZE * i + 0x14)))\r
295 #define WINDOW(i)                       ((u_int far*)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x16)))\r
296 \r
297 #define GATEWAY_PTR             ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_GAR)))\r
298 #define SUBNET_MASK_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SMR)))\r
299 \r
300 #define SRC_HA_PTR              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SHAR)))\r
301 #define SRC_IP_PTR              ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SIPR)))\r
302 #define TIMEOUT_PTR             ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_IRTR)))\r
303 \r
304 #define RX_DMEM_SIZE            ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_RMSR)))\r
305 #define TX_DMEM_SIZE            ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_TMSR)))\r
306 \r
307 void i2chip_init(void);\r
308 \r
309 #endif  // _irchip_hw_h\r