source: SVN/rincon/u-boot/board/amcc/kilauea/cmd_pll.c @ 55

Last change on this file since 55 was 55, checked in by Tim Harvey, 22 months ago

rincon: added latest u-boot source

restored form server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 6.6 KB
Line 
1/*
2 * (C) Copyright 2000, 2001
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * See file CREDITS for list of people who contributed to this
6 * project.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21 * MA 02111-1307 USA
22 *
23 */
24
25/*
26 * ehnus: change pll frequency.
27 * Wed Sep  5 11:45:17 CST 2007
28 * hsun@udtech.com.cn
29 */
30
31
32#include <common.h>
33#include <config.h>
34#include <command.h>
35#include <i2c.h>
36
37#ifdef CONFIG_CMD_EEPROM
38
39#define EEPROM_CONF_OFFSET              0
40#define EEPROM_TEST_OFFSET              16
41#define EEPROM_SDSTP_PARAM              16
42
43#define PLL_NAME_MAX                    12
44#define BUF_STEP                        8
45
46/* eeprom_wirtes 8Byte per op. */
47#define EEPROM_ALTER_FREQ(freq)                                         \
48        do {                                                            \
49                int __i;                                                \
50                for (__i = 0; __i < 2; __i++)                           \
51                        eeprom_write (CFG_I2C_EEPROM_ADDR,              \
52                                      EEPROM_CONF_OFFSET + __i*BUF_STEP, \
53                                      pll_select[freq],                 \
54                                      BUF_STEP + __i*BUF_STEP);         \
55        } while (0)
56
57#define PDEBUG
58#ifdef  PDEBUG
59#define PLL_DEBUG       pll_debug(EEPROM_CONF_OFFSET)
60#else
61#define PLL_DEBUG
62#endif
63
64typedef enum {
65        PLL_ebc20,
66        PLL_333,
67        PLL_4001,
68        PLL_4002,
69        PLL_533,
70        PLL_600,
71        PLL_666,        /* For now, kilauea can't support */
72        RCONF,
73        WTEST,
74        PLL_TOTAL
75} pll_freq_t;
76
77static const char
78pll_name[][PLL_NAME_MAX] = {
79        "PLL_ebc20",
80        "PLL_333",
81        "PLL_400@1",
82        "PLL_400@2",
83        "PLL_533",
84        "PLL_600",
85        "PLL_666",
86        "RCONF",
87        "WTEST",
88        ""
89};
90
91/*
92 * ehnus:
93 */
94static uchar
95pll_select[][EEPROM_SDSTP_PARAM] = {
96        /* 0: CPU 333MHz EBC 20MHz, for test only */
97        {
98                0x8c, 0x12, 0xec, 0x12, 0x88, 0x00, 0x0a, 0x00,
99                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
100        },
101
102        /* 0: 333 */
103        {
104                0x8c, 0x12, 0xec, 0x12, 0x98, 0x00, 0x0a, 0x00,
105                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
106        },
107
108        /* 1: 400_266 */
109        {
110                0x8e, 0x0e, 0xe8, 0x13, 0x98, 0x00, 0x0a, 0x00,
111                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
112        },
113
114        /* 2: 400 */
115        {
116                0x8e, 0x0e, 0xe8, 0x12, 0x98, 0x00, 0x0a, 0x00,
117                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
118        },
119
120        /* 3: 533 */
121        {
122                0x8e, 0x43, 0x60, 0x13, 0x98, 0x00, 0x0a, 0x00,
123                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
124        },
125
126        /* 4: 600 */
127        {
128                0x8d, 0x02, 0x34, 0x13, 0x98, 0x00, 0x0a, 0x00,
129                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
130        },
131
132        /* 5: 666 */
133        {
134                0x8d, 0x03, 0x78, 0x13, 0x98, 0x00, 0x0a, 0x00,
135                0x40, 0x08, 0x23, 0x50, 0x00, 0x05, 0x00, 0x00
136        },
137
138        {}
139};
140
141static uchar
142testbuf[EEPROM_SDSTP_PARAM] = {
143        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
144        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
145};
146
147static void
148pll_debug(int off)
149{
150        int i;
151        uchar buffer[EEPROM_SDSTP_PARAM];
152
153        memset(buffer, 0, sizeof(buffer));
154        eeprom_read(CFG_I2C_EEPROM_ADDR, off,
155                    buffer, EEPROM_SDSTP_PARAM);
156
157        printf("Debug: SDSTP[0-3] at offset \"0x%02x\" lists as follows: \n", off);
158        for (i = 0; i < EEPROM_SDSTP_PARAM; i++)
159                printf("%02x ", buffer[i]);
160        printf("\n");
161}
162
163static void
164test_write(void)
165{
166        printf("Debug: test eeprom_write ... ");
167
168        /*
169         * Write twice, 8 bytes per write
170         */
171        eeprom_write (CFG_I2C_EEPROM_ADDR, EEPROM_TEST_OFFSET,
172                      testbuf, 8);
173        eeprom_write (CFG_I2C_EEPROM_ADDR, EEPROM_TEST_OFFSET+8,
174                      testbuf, 16);
175        printf("done\n");
176
177        pll_debug(EEPROM_TEST_OFFSET);
178}
179
180int
181do_pll_alter (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
182{
183        char c = '\0';
184        pll_freq_t pll_freq;
185        if (argc < 2) {
186                printf("Usage: \n%s\n", cmdtp->usage);
187                goto ret;
188        }
189
190        for (pll_freq = PLL_ebc20; pll_freq < PLL_TOTAL; pll_freq++)
191                if (!strcmp(pll_name[pll_freq], argv[1]))
192                        break;
193
194        switch (pll_freq) {
195        case PLL_ebc20:
196        case PLL_333:
197        case PLL_4001:
198        case PLL_4002:
199        case PLL_533:
200        case PLL_600:
201                EEPROM_ALTER_FREQ(pll_freq);
202                break;
203
204        case PLL_666:           /* not support */
205                printf("Choose this option will result in a boot failure."
206                       "\nContinue? (Y/N): ");
207
208                c = getc(); putc('\n');
209
210                if ((c == 'y') || (c == 'Y')) {
211                        EEPROM_ALTER_FREQ(pll_freq);
212                        break;
213                }
214                goto ret;
215
216        case RCONF:
217                pll_debug(EEPROM_CONF_OFFSET);
218                goto ret;
219        case WTEST:
220                printf("DEBUG: write test\n");
221                test_write();
222                goto ret;
223
224        default:
225                printf("Invalid options"
226                       "\n\nUsage: \n%s\n", cmdtp->usage);
227                goto ret;
228        }
229
230        printf("PLL set to %s, "
231               "reset the board to take effect\n", pll_name[pll_freq]);
232
233        PLL_DEBUG;
234ret:
235        return 0;
236}
237
238U_BOOT_CMD(
239        pllalter, CFG_MAXARGS, 1,        do_pll_alter,
240        "pllalter- change pll frequence \n",
241        "pllalter <selection>      - change pll frequence \n\n\
242        ** New freq take effect after reset. ** \n\
243        ----------------------------------------------\n\
244        PLL_ebc20: Board: AMCC 405EX(r) Evaluation Board\n\
245        \t      Same as PLL_333 \n\
246        \t      except          \n\
247        \t      EBC: 20 MHz     \n\
248        ----------------------------------------------\n\
249        PLL_333: Board: AMCC 405EX(r) Evaluation Board\n\
250        \t      VCO: 666 MHz  \n\
251        \t      CPU: 333 MHz  \n\
252        \t      PLB: 166 MHz  \n\
253        \t      OPB: 83 MHz   \n\
254        \t      DDR: 83 MHz   \n\
255        ------------------------------------------------\n\
256        PLL_400@1: Board: AMCC 405EX(r) Evaluation Board\n\
257        \t      VCO: 800 MHz  \n\
258        \t      CPU: 400 MHz  \n\
259        \t      PLB: 133 MHz  \n\
260        \t      OPB: 66  MHz  \n\
261        \t      DDR: 133 MHz  \n\
262        ------------------------------------------------\n\
263        PLL_400@2: Board: AMCC 405EX(r) Evaluation Board\n\
264        \t      VCO: 800 MHz  \n\
265        \t      CPU: 400 MHz  \n\
266        \t      PLB: 200 MHz  \n\
267        \t      OPB: 100 MHz  \n\
268        \t      DDR: 200 MHz  \n\
269        ----------------------------------------------\n\
270        PLL_533: Board: AMCC 405EX(r) Evaluation Board\n\
271        \t      VCO: 1066 MHz  \n\
272        \t      CPU: 533  MHz  \n\
273        \t      PLB: 177  MHz  \n\
274        \t      OPB: 88   MHz  \n\
275        \t      DDR: 177  MHz  \n\
276        ----------------------------------------------\n\
277        PLL_600: Board: AMCC 405EX(r) Evaluation Board\n\
278        \t      VCO: 1200 MHz  \n\
279        \t      CPU: 600  MHz  \n\
280        \t      PLB: 200  MHz  \n\
281        \t      OPB: 100  MHz  \n\
282        \t      DDR: 200  MHz  \n\
283        ----------------------------------------------\n\
284        PLL_666: Board: AMCC 405EX(r) Evaluation Board\n\
285        \t      VCO: 1333 MHz  \n\
286        \t      CPU: 666  MHz  \n\
287        \t      PLB: 166  MHz  \n\
288        \t      OPB: 83   MHz  \n\
289        \t      DDR: 166  MHz  \n\
290        -----------------------------------------------\n\
291        RCONF: Read current eeprom configuration.      \n\
292        -----------------------------------------------\n\
293        WTEST: Test EEPROM write with predefined values\n\
294        -----------------------------------------------\n"
295        );
296
297#endif  /* CONFIG_CMD_EEPROM */
Note: See TracBrowser for help on using the repository browser.