1 |
27 |
unneback |
//=============================================================================
|
2 |
|
|
//
|
3 |
|
|
// hal_aux.c
|
4 |
|
|
//
|
5 |
|
|
// HAL auxiliary objects and code; per platform
|
6 |
|
|
//
|
7 |
|
|
//=============================================================================
|
8 |
|
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
9 |
|
|
// -------------------------------------------
|
10 |
|
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
11 |
|
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
12 |
|
|
//
|
13 |
|
|
// eCos is free software; you can redistribute it and/or modify it under
|
14 |
|
|
// the terms of the GNU General Public License as published by the Free
|
15 |
|
|
// Software Foundation; either version 2 or (at your option) any later version.
|
16 |
|
|
//
|
17 |
|
|
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
18 |
|
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
19 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
20 |
|
|
// for more details.
|
21 |
|
|
//
|
22 |
|
|
// You should have received a copy of the GNU General Public License along
|
23 |
|
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
24 |
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
25 |
|
|
//
|
26 |
|
|
// As a special exception, if other files instantiate templates or use macros
|
27 |
|
|
// or inline functions from this file, or you compile this file and link it
|
28 |
|
|
// with other works to produce a work based on this file, this file does not
|
29 |
|
|
// by itself cause the resulting work to be covered by the GNU General Public
|
30 |
|
|
// License. However the source code for this file must still be made available
|
31 |
|
|
// in accordance with section (3) of the GNU General Public License.
|
32 |
|
|
//
|
33 |
|
|
// This exception does not invalidate any other reasons why a work based on
|
34 |
|
|
// this file might be covered by the GNU General Public License.
|
35 |
|
|
//
|
36 |
|
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
37 |
|
|
// at http://sources.redhat.com/ecos/ecos-license/
|
38 |
|
|
// -------------------------------------------
|
39 |
|
|
//####ECOSGPLCOPYRIGHTEND####
|
40 |
|
|
//=============================================================================
|
41 |
|
|
//#####DESCRIPTIONBEGIN####
|
42 |
|
|
//
|
43 |
|
|
// Author(s): hmt
|
44 |
|
|
// Contributors:hmt
|
45 |
|
|
// Date: 1999-06-08
|
46 |
|
|
// Purpose: HAL aux objects: startup tables.
|
47 |
|
|
// Description: Tables for per-platform initialization
|
48 |
|
|
//
|
49 |
|
|
//####DESCRIPTIONEND####
|
50 |
|
|
//
|
51 |
|
|
//=============================================================================
|
52 |
|
|
|
53 |
|
|
#include <pkgconf/hal.h>
|
54 |
|
|
#include <cyg/hal/hal_mem.h> // HAL memory definitions
|
55 |
|
|
#include <pkgconf/hal_powerpc_quicc.h>
|
56 |
|
|
#include <cyg/infra/cyg_type.h>
|
57 |
|
|
#include <cyg/hal/quicc/ppc8xx.h>
|
58 |
|
|
#include <cyg/hal/hal_if.h> // hal_if_init
|
59 |
|
|
|
60 |
|
|
// The memory map is weakly defined, allowing the application to redefine
|
61 |
|
|
// it if necessary. The regions defined below are the minimum requirements.
|
62 |
|
|
CYGARC_MEMDESC_TABLE CYGBLD_ATTRIB_WEAK = {
|
63 |
|
|
// Mapping for the Motorola MBX860 development board
|
64 |
|
|
CYGARC_MEMDESC_CACHE( 0xfe000000, 0x00400000 ), // ROM region
|
65 |
|
|
CYGARC_MEMDESC_NOCACHE( 0xfa000000, 0x00400000 ), // Control/Status+LEDs
|
66 |
|
|
CYGARC_MEMDESC_CACHE( 0x00000000, 0x00800000 ), // Main memory
|
67 |
|
|
|
68 |
|
|
CYGARC_MEMDESC_TABLE_END
|
69 |
|
|
};
|
70 |
|
|
|
71 |
|
|
#ifdef _DOWNLOAD_UCODE_UPDATE // Not currently used
|
72 |
|
|
//
|
73 |
|
|
// The MPC8xx CPM (Control Processor) has some problems (overlapping structures) which
|
74 |
|
|
// can be fixed by downloading new ucode. This code came from:
|
75 |
|
|
// http://www.mot.com/SPS/ADC/pps/subpgs/etoolbox/8XX/i2c_spi.html
|
76 |
|
|
//
|
77 |
|
|
|
78 |
|
|
static unsigned char i2c_ucode_low[] = {
|
79 |
|
|
0x7F, 0xFF, 0xEF, 0xD9, 0x3F, 0xFD, 0x00, 0x00,
|
80 |
|
|
0x7F, 0xFB, 0x49, 0xF7, 0x7F, 0xF9, 0x00, 0x00,
|
81 |
|
|
0x5F, 0xEF, 0xAD, 0xF7, 0x5F, 0x89, 0xAD, 0xF7,
|
82 |
|
|
0x5F, 0xEF, 0xAF, 0xF7, 0x5F, 0x89, 0xAF, 0xF7,
|
83 |
|
|
0x3A, 0x9C, 0xFB, 0xC8, 0xE7, 0xC0, 0xED, 0xF0,
|
84 |
|
|
0x77, 0xC1, 0xE1, 0xBB, 0xF4, 0xDC, 0x7F, 0x1D,
|
85 |
|
|
0xAB, 0xAD, 0x93, 0x2F, 0x4E, 0x08, 0xFD, 0xCF,
|
86 |
|
|
0x6E, 0x0F, 0xAF, 0xF8, 0x7C, 0xCF, 0x76, 0xCF,
|
87 |
|
|
0xFD, 0x1F, 0xF9, 0xCF, 0xAB, 0xF8, 0x8D, 0xC6,
|
88 |
|
|
0xAB, 0x56, 0x79, 0xF7, 0xB0, 0x93, 0x73, 0x83,
|
89 |
|
|
0xDF, 0xCE, 0x79, 0xF7, 0xB0, 0x91, 0xE6, 0xBB,
|
90 |
|
|
0xE5, 0xBB, 0xE7, 0x4F, 0xB3, 0xFA, 0x6F, 0x0F,
|
91 |
|
|
0x6F, 0xFB, 0x76, 0xCE, 0xEE, 0x0D, 0xF9, 0xCF,
|
92 |
|
|
0x2B, 0xFB, 0xEF, 0xEF, 0xCF, 0xEE, 0xF9, 0xCF,
|
93 |
|
|
0x76, 0xCE, 0xAD, 0x24, 0x90, 0xB2, 0xDF, 0x9A,
|
94 |
|
|
0x7F, 0xDD, 0xD0, 0xBF, 0x4B, 0xF8, 0x47, 0xFD,
|
95 |
|
|
0x7C, 0xCF, 0x76, 0xCE, 0xCF, 0xEF, 0x7E, 0x1F,
|
96 |
|
|
0x7F, 0x1D, 0x7D, 0xFD, 0xF0, 0xB6, 0xEF, 0x71,
|
97 |
|
|
0x7F, 0xC1, 0x77, 0xC1, 0xFB, 0xC8, 0x60, 0x79,
|
98 |
|
|
0xE7, 0x22, 0xFB, 0xC8, 0x5F, 0xFF, 0xDF, 0xFF,
|
99 |
|
|
0x5F, 0xB2, 0xFF, 0xFB, 0xFB, 0xC8, 0xF3, 0xC8,
|
100 |
|
|
0x94, 0xA6, 0x7F, 0x01, 0x7F, 0x1D, 0x5F, 0x39,
|
101 |
|
|
0xAF, 0xE8, 0x5F, 0x5E, 0xFF, 0xDF, 0xDF, 0x96,
|
102 |
|
|
0xCB, 0x9F, 0xAF, 0x7D, 0x5F, 0xC1, 0xAF, 0xED,
|
103 |
|
|
0x8C, 0x1C, 0x5F, 0xC1, 0xAF, 0xDD, 0x5F, 0xC3,
|
104 |
|
|
0xDF, 0x9A, 0x7E, 0xFD, 0xB0, 0xB2, 0x5F, 0xB2,
|
105 |
|
|
0xFF, 0xFE, 0xAB, 0xAD, 0x5F, 0xB2, 0xFF, 0xFE,
|
106 |
|
|
0x5F, 0xCE, 0x60, 0x0B, 0xE6, 0xBB, 0x60, 0x0B,
|
107 |
|
|
0x5F, 0xCE, 0xDF, 0xC6, 0x27, 0xFB, 0xEF, 0xDF,
|
108 |
|
|
0x5F, 0xC8, 0xCF, 0xDE, 0x3A, 0x9C, 0xE7, 0xC0,
|
109 |
|
|
0xED, 0xF0, 0xF3, 0xC8, 0x7F, 0x01, 0x54, 0xCD,
|
110 |
|
|
0x7F, 0x1D, 0x2D, 0x3D, 0x36, 0x3A, 0x75, 0x70,
|
111 |
|
|
0x7E, 0x0A, 0xF1, 0xCE, 0x37, 0xEF, 0x2E, 0x68,
|
112 |
|
|
0x7F, 0xEE, 0x10, 0xEC, 0xAD, 0xF8, 0xEF, 0xDE,
|
113 |
|
|
0xCF, 0xEA, 0xE5, 0x2F, 0x7D, 0x0F, 0xE1, 0x2B,
|
114 |
|
|
0xF1, 0xCE, 0x5F, 0x65, 0x7E, 0x0A, 0x4D, 0xF8,
|
115 |
|
|
0xCF, 0xEA, 0x5F, 0x72, 0x7D, 0x0B, 0xEF, 0xEE,
|
116 |
|
|
0xCF, 0xEA, 0x5F, 0x74, 0xE5, 0x22, 0xEF, 0xDE,
|
117 |
|
|
0x5F, 0x74, 0xCF, 0xDA, 0x0B, 0x62, 0x73, 0x85,
|
118 |
|
|
0xDF, 0x62, 0x7E, 0x0A, 0x30, 0xD8, 0x14, 0x5B,
|
119 |
|
|
0xBF, 0xFF, 0xF3, 0xC8, 0x5F, 0xFF, 0xDF, 0xFF,
|
120 |
|
|
0xA7, 0xF8, 0x5F, 0x5E, 0xBF, 0xFE, 0x7F, 0x7D,
|
121 |
|
|
0x10, 0xD3, 0x14, 0x50, 0x5F, 0x36, 0xBF, 0xFF,
|
122 |
|
|
0xAF, 0x78, 0x5F, 0x5E, 0xBF, 0xFD, 0xA7, 0xF8,
|
123 |
|
|
0x5F, 0x36, 0xBF, 0xFE, 0x77, 0xFD, 0x30, 0xC0,
|
124 |
|
|
0x4E, 0x08, 0xFD, 0xCF, 0xE5, 0xFF, 0x6E, 0x0F,
|
125 |
|
|
0xAF, 0xF8, 0x7E, 0x1F, 0x7E, 0x0F, 0xFD, 0x1F,
|
126 |
|
|
0xF1, 0xCF, 0x5F, 0x1B, 0xAB, 0xF8, 0x0D, 0x5E,
|
127 |
|
|
0x5F, 0x5E, 0xFF, 0xEF, 0x79, 0xF7, 0x30, 0xA2,
|
128 |
|
|
0xAF, 0xDD, 0x5F, 0x34, 0x47, 0xF8, 0x5F, 0x34,
|
129 |
|
|
0xAF, 0xED, 0x7F, 0xDD, 0x50, 0xB2, 0x49, 0x78,
|
130 |
|
|
0x47, 0xFD, 0x7F, 0x1D, 0x7D, 0xFD, 0x70, 0xAD,
|
131 |
|
|
0xEF, 0x71, 0x7E, 0xC1, 0x6B, 0xA4, 0x7F, 0x01,
|
132 |
|
|
0x2D, 0x26, 0x7E, 0xFD, 0x30, 0xDE, 0x5F, 0x5E,
|
133 |
|
|
0xFF, 0xFD, 0x5F, 0x5E, 0xFF, 0xEF, 0x5F, 0x5E,
|
134 |
|
|
0xFF, 0xDF, 0x0C, 0xA0, 0xAF, 0xED, 0x0A, 0x9E,
|
135 |
|
|
0xAF, 0xDD, 0x0C, 0x3A, 0x5F, 0x3A, 0xAF, 0xBD,
|
136 |
|
|
0x7F, 0xBD, 0xB0, 0x82, 0x5F, 0x82, 0x47, 0xF8,
|
137 |
|
|
};
|
138 |
|
|
static unsigned char i2c_ucode_high[] = {
|
139 |
|
|
0x3E, 0x30, 0x34, 0x30, 0x34, 0x34, 0x37, 0x37,
|
140 |
|
|
0xAB, 0xF7, 0xBF, 0x9B, 0x99, 0x4B, 0x4F, 0xBD,
|
141 |
|
|
0xBD, 0x59, 0x94, 0x93, 0x34, 0x9F, 0xFF, 0x37,
|
142 |
|
|
0xFB, 0x9B, 0x17, 0x7D, 0xD9, 0x93, 0x69, 0x56,
|
143 |
|
|
0xBB, 0xFD, 0xD6, 0x97, 0xBD, 0xD2, 0xFD, 0x11,
|
144 |
|
|
0x31, 0xDB, 0x9B, 0xB3, 0x63, 0x13, 0x96, 0x37,
|
145 |
|
|
0x93, 0x73, 0x36, 0x93, 0x19, 0x31, 0x37, 0xF7,
|
146 |
|
|
0x33, 0x17, 0x37, 0xAF, 0x7B, 0xB9, 0xB9, 0x99,
|
147 |
|
|
0xBB, 0x19, 0x79, 0x57, 0x7F, 0xDF, 0xD3, 0xD5,
|
148 |
|
|
0x73, 0xB7, 0x73, 0xF7, 0x37, 0x93, 0x3B, 0x99,
|
149 |
|
|
0x1D, 0x11, 0x53, 0x16, 0x99, 0x31, 0x53, 0x15,
|
150 |
|
|
0x31, 0x69, 0x4B, 0xF4, 0xFB, 0xDB, 0xD3, 0x59,
|
151 |
|
|
0x31, 0x49, 0x73, 0x53, 0x76, 0x95, 0x6D, 0x69,
|
152 |
|
|
0x7B, 0x9D, 0x96, 0x93, 0x13, 0x13, 0x19, 0x79,
|
153 |
|
|
0x79, 0x37, 0x69, 0x35,
|
154 |
|
|
};
|
155 |
|
|
#endif
|
156 |
|
|
|
157 |
|
|
#define QUICC_I2C_MOD_EN 0x01 // Enable I2C controller
|
158 |
|
|
#define QUICC_I2C_MOD_PDIV_CLK32 0x00 // I2C BRG - /32
|
159 |
|
|
#define QUICC_I2C_MOD_PDIV_CLK16 0x02 // /16
|
160 |
|
|
#define QUICC_I2C_MOD_PDIV_CLK8 0x04 // /8
|
161 |
|
|
#define QUICC_I2C_MOD_PDIV_CLK4 0x06 // /4
|
162 |
|
|
#define QUICC_I2C_MOD_FLT 0x08 // 1 = input clock is filtered
|
163 |
|
|
#define QUICC_I2C_MOD_GCD 0x10 // 1 = deny general call address
|
164 |
|
|
#define QUICC_I2C_MOD_REVD 0x20 // 1 = reverse TxD and RxD order
|
165 |
|
|
|
166 |
|
|
#define QUICC_I2C_CMD_MASTER 0x01 // 1 = master, 0 = slave
|
167 |
|
|
#define QUICC_I2C_CMD_START 0x80 // 1 = start transmit
|
168 |
|
|
|
169 |
|
|
#define QUICC_I2C_FCR_BE 0x10 // Big Endian operation
|
170 |
|
|
|
171 |
|
|
#define MBX_CONFIG_EEPROM 0xA5 // I2C address of configuration ROM
|
172 |
|
|
|
173 |
|
|
static unsigned char _MBX_eeprom_data[0x100];
|
174 |
|
|
#define VPD_EOD 0xFF
|
175 |
|
|
|
176 |
|
|
static void
|
177 |
|
|
_mbx_init_i2c(void)
|
178 |
|
|
{
|
179 |
|
|
volatile EPPC *eppc = eppc_base();
|
180 |
|
|
unsigned char *sp, *ep;
|
181 |
|
|
int i, len, RxBD, TxBD;
|
182 |
|
|
struct i2c_pram *i2c;
|
183 |
|
|
volatile struct cp_bufdesc *rxbd, *txbd;
|
184 |
|
|
unsigned char i2c_address[521];
|
185 |
|
|
static int i2c_init = 0;
|
186 |
|
|
|
187 |
|
|
if (i2c_init) return;
|
188 |
|
|
i2c_init = 1;
|
189 |
|
|
eppc->cp_rccr = 0; // Disables any current ucode running
|
190 |
|
|
#ifdef _DOWNLOAD_UCODE_UPDATE // Not currently used
|
191 |
|
|
// Patch the ucode
|
192 |
|
|
sp = i2c_ucode_low;
|
193 |
|
|
ep = (unsigned char *)eppc->udata_ucode;
|
194 |
|
|
for (i = 0; i < sizeof(i2c_ucode_low); i++) {
|
195 |
|
|
*ep++ = *sp++;
|
196 |
|
|
}
|
197 |
|
|
sp = i2c_ucode_high;
|
198 |
|
|
ep = (unsigned char *)eppc->udata_ext;
|
199 |
|
|
for (i = 0; i < sizeof(i2c_ucode_high); i++) {
|
200 |
|
|
*ep++ = *sp++;
|
201 |
|
|
}
|
202 |
|
|
eppc->cp_rctr1 = 0x802A;
|
203 |
|
|
eppc->cp_rctr2 = 0x8028;
|
204 |
|
|
eppc->cp_rctr3 = 0x802E;
|
205 |
|
|
eppc->cp_rctr4 = 0x802C;
|
206 |
|
|
diag_printf("RCCR: %x, RTCRx: %x/%x/%x/%x\n",
|
207 |
|
|
eppc->cp_rccr, eppc->cp_rctr1, eppc->cp_rctr2, eppc->cp_rctr3, eppc->cp_rctr4);
|
208 |
|
|
diag_dump_buf(eppc->udata_ucode, 256);
|
209 |
|
|
diag_dump_buf(&eppc->pram[0].scc.pothers.i2c_idma, 0x40);
|
210 |
|
|
eppc->cp_rccr = 0x01; // Enable ucode
|
211 |
|
|
diag_printf("RCCR: %x, RTCRx: %x/%x/%x/%x\n",
|
212 |
|
|
eppc->cp_rccr, eppc->cp_rctr1, eppc->cp_rctr2, eppc->cp_rctr3, eppc->cp_rctr4);
|
213 |
|
|
diag_dump_buf(eppc->udata_ucode, 256);
|
214 |
|
|
diag_dump_buf(&eppc->pram[0].scc.pothers.i2c_idma, 0x40);
|
215 |
|
|
diag_printf("RPBASE = %x/%x\n", eppc->pram[0].scc.pothers.i2c_idma.i2c.rpbase, &eppc->pram[0].scc.pothers.i2c_idma.i2c.rpbase);
|
216 |
|
|
eppc->pram[0].scc.pothers.i2c_idma.i2c.rpbase = (unsigned long)&eppc->i2c_spare_pram - (unsigned long)eppc;
|
217 |
|
|
diag_printf("RPBASE = %x/%x\n", eppc->pram[0].scc.pothers.i2c_idma.i2c.rpbase, &eppc->pram[0].scc.pothers.i2c_idma.i2c.rpbase);
|
218 |
|
|
eppc->i2c_i2mod = 0; // Disable I2C controller
|
219 |
|
|
i2c = (struct i2c_pram *)&eppc->i2c_spare_pram;
|
220 |
|
|
#else
|
221 |
|
|
eppc->i2c_i2mod = 0; // Disable I2C controller
|
222 |
|
|
i2c = (struct i2c_pram *)&eppc->pram[0].scc.pothers.i2c_idma.i2c;
|
223 |
|
|
#endif // _DOWNLOAD_UCODE_UPDATE
|
224 |
|
|
sp = (unsigned char *)i2c;
|
225 |
|
|
for (i = 0; i < sizeof(*i2c); i++) {
|
226 |
|
|
*sp++ = 0;
|
227 |
|
|
}
|
228 |
|
|
RxBD = 0x2E08; // CAUTION
|
229 |
|
|
TxBD = 0x2E00;
|
230 |
|
|
i2c->rbase = RxBD;
|
231 |
|
|
i2c->tbase = TxBD;
|
232 |
|
|
i2c->rfcr = QUICC_I2C_FCR_BE;
|
233 |
|
|
i2c->tfcr = QUICC_I2C_FCR_BE;
|
234 |
|
|
i2c->mrblr = sizeof(i2c_address);
|
235 |
|
|
rxbd = (volatile struct cp_bufdesc *)((char *)eppc + RxBD);
|
236 |
|
|
rxbd->ctrl = QUICC_BD_CTL_Ready | QUICC_BD_CTL_Wrap | QUICC_BD_CTL_Last;
|
237 |
|
|
rxbd->length = 257;
|
238 |
|
|
rxbd->buffer = i2c_address;
|
239 |
|
|
txbd = (volatile struct cp_bufdesc *)((char *)eppc + TxBD);
|
240 |
|
|
txbd->length = 1+520;
|
241 |
|
|
i2c_address[0] = MBX_CONFIG_EEPROM;
|
242 |
|
|
txbd->buffer = i2c_address;
|
243 |
|
|
txbd->ctrl = QUICC_BD_CTL_Ready | QUICC_BD_CTL_Wrap | QUICC_BD_CTL_Last;
|
244 |
|
|
eppc->i2c_i2add = 0x00;
|
245 |
|
|
eppc->i2c_i2brg = 0x50;
|
246 |
|
|
eppc->i2c_i2mod = QUICC_I2C_MOD_EN; // Enable I2C interface
|
247 |
|
|
// Initialize the CPM (set up buffer pointers, etc).
|
248 |
|
|
// This needs to be done *after* the interface is enabled.
|
249 |
|
|
eppc->cp_cr = QUICC_CPM_I2C | QUICC_CPM_CR_INIT_RX | QUICC_CPM_CR_BUSY;
|
250 |
|
|
while (eppc->cp_cr & QUICC_CPM_CR_BUSY) ;
|
251 |
|
|
eppc->cp_cr = QUICC_CPM_I2C | QUICC_CPM_CR_INIT_TX | QUICC_CPM_CR_BUSY;
|
252 |
|
|
while (eppc->cp_cr & QUICC_CPM_CR_BUSY) ;
|
253 |
|
|
eppc->i2c_i2com = QUICC_I2C_CMD_MASTER | QUICC_I2C_CMD_START;
|
254 |
|
|
i = 0;
|
255 |
|
|
while (txbd->ctrl & QUICC_BD_CTL_Ready) {
|
256 |
|
|
if (++i > 50000) break;
|
257 |
|
|
}
|
258 |
|
|
// Rebuild the actual VPD
|
259 |
|
|
for (i = 0; i < sizeof(_MBX_eeprom_data); i++) {
|
260 |
|
|
_MBX_eeprom_data[i] = VPD_EOD; // Undefined
|
261 |
|
|
}
|
262 |
|
|
sp = (unsigned char *)&i2c_address[1];
|
263 |
|
|
ep = (unsigned char *)&i2c_address[sizeof(i2c_address)];
|
264 |
|
|
while (sp != ep) {
|
265 |
|
|
if ((sp[0] == 'M') && (sp[1] == 'O') && (sp[2] == 'T')) {
|
266 |
|
|
// Found the "eye catcher" string
|
267 |
|
|
sp += 8;
|
268 |
|
|
len = (sp[0] << 8) | sp[1];
|
269 |
|
|
sp += 2;
|
270 |
|
|
for (i = 0; i < len; i++) {
|
271 |
|
|
_MBX_eeprom_data[i] = *sp++;
|
272 |
|
|
if (sp == ep) sp = (unsigned char *)&i2c_address[1];
|
273 |
|
|
}
|
274 |
|
|
break;
|
275 |
|
|
}
|
276 |
|
|
sp++;
|
277 |
|
|
}
|
278 |
|
|
eppc->i2c_i2mod = 0; // Disable I2C interface
|
279 |
|
|
}
|
280 |
|
|
|
281 |
|
|
//
|
282 |
|
|
// Fetch a value from the VPD and return it's length.
|
283 |
|
|
// Returns a length of zero if not found
|
284 |
|
|
//
|
285 |
|
|
int
|
286 |
|
|
_mbx_fetch_VPD(int code, unsigned char *buf, int size)
|
287 |
|
|
{
|
288 |
|
|
unsigned char *vp, *ep;
|
289 |
|
|
int i, len;
|
290 |
|
|
|
291 |
|
|
_mbx_init_i2c(); // Fetch the data if not already
|
292 |
|
|
vp = &_MBX_eeprom_data[0];
|
293 |
|
|
ep = &_MBX_eeprom_data[sizeof(_MBX_eeprom_data)];
|
294 |
|
|
while (vp < ep) {
|
295 |
|
|
if (*vp == (unsigned char)code) {
|
296 |
|
|
// Found the desired item
|
297 |
|
|
len = (int)vp[1];
|
298 |
|
|
if (len > size) len = size;
|
299 |
|
|
vp += 2;
|
300 |
|
|
for (i = 0; i < len; i++) {
|
301 |
|
|
*buf++ = *vp++;
|
302 |
|
|
}
|
303 |
|
|
return len;
|
304 |
|
|
}
|
305 |
|
|
len = (int)vp[1];
|
306 |
|
|
vp += 2 + len; // Skip to next item
|
307 |
|
|
if (*vp == VPD_EOD) break;
|
308 |
|
|
}
|
309 |
|
|
return 0;
|
310 |
|
|
}
|
311 |
|
|
|
312 |
|
|
//--------------------------------------------------------------------------
|
313 |
|
|
// Platform init code.
|
314 |
|
|
void
|
315 |
|
|
hal_platform_init(void)
|
316 |
|
|
{
|
317 |
|
|
hal_if_init();
|
318 |
|
|
}
|
319 |
|
|
|
320 |
|
|
// EOF hal_aux.c
|