cmd_i2c.c 43.1 KB
Newer Older
W
wdenk 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
/*
 * (C) Copyright 2001
 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/*
 * I2C Functions similar to the standard memory functions.
 *
 * There are several parameters in many of the commands that bear further
 * explanations:
 *
 * {i2c_chip} is the I2C chip address (the first byte sent on the bus).
 *   Each I2C chip on the bus has a unique address.  On the I2C data bus,
 *   the address is the upper seven bits and the LSB is the "read/write"
 *   bit.  Note that the {i2c_chip} address specified on the command
 *   line is not shifted up: e.g. a typical EEPROM memory chip may have
 *   an I2C address of 0x50, but the data put on the bus will be 0xA0
 *   for write and 0xA1 for read.  This "non shifted" address notation
 *   matches at least half of the data sheets :-/.
 *
 * {addr} is the address (or offset) within the chip.  Small memory
 *   chips have 8 bit addresses.  Large memory chips have 16 bit
 *   addresses.  Other memory chips have 9, 10, or 11 bit addresses.
 *   Many non-memory chips have multiple registers and {addr} is used
 *   as the register index.  Some non-memory chips have only one register
 *   and therefore don't need any {addr} parameter.
 *
 *   The default {addr} parameter is one byte (.1) which works well for
 *   memories and registers with 8 bits of address space.
 *
 *   You can specify the length of the {addr} field with the optional .0,
 *   .1, or .2 modifier (similar to the .b, .w, .l modifier).  If you are
 *   manipulating a single register device which doesn't use an address
 *   field, use "0.0" for the address and the ".0" length field will
 *   suppress the address in the I2C data stream.  This also works for
 *   successive reads using the I2C auto-incrementing memory pointer.
 *
 *   If you are manipulating a large memory with 2-byte addresses, use
 *   the .2 address modifier, e.g. 210.2 addresses location 528 (decimal).
 *
 *   Then there are the unfortunate memory chips that spill the most
 *   significant 1, 2, or 3 bits of address into the chip address byte.
 *   This effectively makes one chip (logically) look like 2, 4, or
 *   8 chips.  This is handled (awkwardly) by #defining
63
 *   CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW and using the .1 modifier on the
W
wdenk 已提交
64 65 66
 *   {addr} field (since .1 is the default, it doesn't actually have to
 *   be specified).  Examples: given a memory chip at I2C chip address
 *   0x50, the following would happen...
67
 *     i2c md 50 0 10   display 16 bytes starting at 0x000
W
wdenk 已提交
68
 *                      On the bus: <S> A0 00 <E> <S> A1 <rd> ... <rd>
69
 *     i2c md 50 100 10 display 16 bytes starting at 0x100
W
wdenk 已提交
70
 *                      On the bus: <S> A2 00 <E> <S> A3 <rd> ... <rd>
71
 *     i2c md 50 210 10 display 16 bytes starting at 0x210
W
wdenk 已提交
72 73 74 75 76 77 78 79 80
 *                      On the bus: <S> A4 10 <E> <S> A5 <rd> ... <rd>
 *   This is awfully ugly.  It would be nice if someone would think up
 *   a better way of handling this.
 *
 * Adapted from cmd_mem.c which is copyright Wolfgang Denk (wd@denx.de).
 */

#include <common.h>
#include <command.h>
81
#include <environment.h>
W
wdenk 已提交
82
#include <i2c.h>
83
#include <malloc.h>
W
wdenk 已提交
84
#include <asm/byteorder.h>
85
#include <linux/compiler.h>
W
wdenk 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98

/* Display values from last command.
 * Memory modify remembered values are different from display memory.
 */
static uchar	i2c_dp_last_chip;
static uint	i2c_dp_last_addr;
static uint	i2c_dp_last_alen;
static uint	i2c_dp_last_length = 0x10;

static uchar	i2c_mm_last_chip;
static uint	i2c_mm_last_addr;
static uint	i2c_mm_last_alen;

B
Ben Warren 已提交
99 100 101 102 103
/* If only one I2C bus is present, the list of devices to ignore when
 * the probe command is issued is represented by a 1D array of addresses.
 * When multiple buses are present, the list is an array of bus-address
 * pairs.  The following macros take care of this */

104
#if defined(CONFIG_SYS_I2C_NOPROBES)
B
Ben Warren 已提交
105 106 107 108 109
#if defined(CONFIG_I2C_MULTI_BUS)
static struct
{
	uchar	bus;
	uchar	addr;
110
} i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
B
Ben Warren 已提交
111 112 113 114 115
#define GET_BUS_NUM	i2c_get_bus_num()
#define COMPARE_BUS(b,i)	(i2c_no_probes[(i)].bus == (b))
#define COMPARE_ADDR(a,i)	(i2c_no_probes[(i)].addr == (a))
#define NO_PROBE_ADDR(i)	i2c_no_probes[(i)].addr
#else		/* single bus */
116
static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
B
Ben Warren 已提交
117 118 119 120 121 122 123
#define GET_BUS_NUM	0
#define COMPARE_BUS(b,i)	((b) == 0)	/* Make compiler happy */
#define COMPARE_ADDR(a,i)	(i2c_no_probes[(i)] == (a))
#define NO_PROBE_ADDR(i)	i2c_no_probes[(i)]
#endif	/* CONFIG_MULTI_BUS */

#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0]))
W
wdenk 已提交
124 125
#endif

126 127
#if defined(CONFIG_I2C_MUX)
static I2C_MUX_DEVICE	*i2c_mux_devices = NULL;
128
static	int	i2c_mux_busid = CONFIG_SYS_MAX_I2C_BUS;
129 130 131 132 133

DECLARE_GLOBAL_DATA_PTR;

#endif

134 135
#define DISP_LINE_LEN	16

136 137 138 139 140 141 142
/**
 * i2c_init_board() - Board-specific I2C bus init
 *
 * This function is the default no-op implementation of I2C bus
 * initialization. This function can be overriden by board-specific
 * implementation if needed.
 */
143 144
__weak
void i2c_init_board(void)
145 146 147 148
{
	return;
}

149
/* TODO: Implement architecture-specific get/set functions */
150 151 152 153 154 155 156 157 158 159 160 161 162

/**
 * i2c_get_bus_speed() - Return I2C bus speed
 *
 * This function is the default implementation of function for retrieveing
 * the current I2C bus speed in Hz.
 *
 * A driver implementing runtime switching of I2C bus speed must override
 * this function to report the speed correctly. Simple or legacy drivers
 * can use this fallback.
 *
 * Returns I2C bus speed in Hz.
 */
163 164
__weak
unsigned int i2c_get_bus_speed(void)
165 166 167 168
{
	return CONFIG_SYS_I2C_SPEED;
}

169 170 171 172 173 174 175 176 177 178 179 180 181
/**
 * i2c_set_bus_speed() - Configure I2C bus speed
 * @speed:	Newly set speed of the I2C bus in Hz
 *
 * This function is the default implementation of function for setting
 * the I2C bus speed in Hz.
 *
 * A driver implementing runtime switching of I2C bus speed must override
 * this function to report the speed correctly. Simple or legacy drivers
 * can use this fallback.
 *
 * Returns zero on success, negative value on error.
 */
182 183
__weak
int i2c_set_bus_speed(unsigned int speed)
184 185 186 187 188 189 190
{
	if (speed != CONFIG_SYS_I2C_SPEED)
		return -1;

	return 0;
}

191 192 193 194
/**
 * get_alen() - Small parser helper function to get address length
 *
 * Returns the address length.
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
 */
static uint get_alen(char *arg)
{
	int	j;
	int	alen;

	alen = 1;
	for (j = 0; j < 8; j++) {
		if (arg[j] == '.') {
			alen = arg[j+1] - '0';
			break;
		} else if (arg[j] == '\0')
			break;
	}
	return alen;
}

212 213 214 215 216 217 218 219 220 221
/**
 * do_i2c_read() - Handle the "i2c read" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 *
222 223 224
 * Syntax:
 *	i2c read {i2c_chip} {devaddr}{.0, .1, .2} {len} {memaddr}
 */
225
static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
226 227 228 229 230
{
	u_char	chip;
	uint	devaddr, alen, length;
	u_char  *memaddr;

231
	if (argc != 5)
232
		return CMD_RET_USAGE;
233 234 235 236 237 238 239 240 241 242 243

	/*
	 * I2C chip address
	 */
	chip = simple_strtoul(argv[1], NULL, 16);

	/*
	 * I2C data address within the chip.  This can be 1 or
	 * 2 bytes long.  Some day it might be 3 bytes long :-).
	 */
	devaddr = simple_strtoul(argv[2], NULL, 16);
244
	alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
245
	if (alen > 3)
246
		return CMD_RET_USAGE;
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264

	/*
	 * Length is the number of objects, not number of bytes.
	 */
	length = simple_strtoul(argv[3], NULL, 16);

	/*
	 * memaddr is the address where to store things in memory
	 */
	memaddr = (u_char *)simple_strtoul(argv[4], NULL, 16);

	if (i2c_read(chip, devaddr, alen, memaddr, length) != 0) {
		puts ("Error reading the chip.\n");
		return 1;
	}
	return 0;
}

Y
York Sun 已提交
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	u_char	chip;
	uint	devaddr, alen, length;
	u_char  *memaddr;

	if (argc != 5)
		return cmd_usage(cmdtp);

	/*
	 * memaddr is the address where to store things in memory
	 */
	memaddr = (u_char *)simple_strtoul(argv[1], NULL, 16);

	/*
	 * I2C chip address
	 */
	chip = simple_strtoul(argv[2], NULL, 16);

	/*
	 * I2C data address within the chip.  This can be 1 or
	 * 2 bytes long.  Some day it might be 3 bytes long :-).
	 */
	devaddr = simple_strtoul(argv[3], NULL, 16);
	alen = get_alen(argv[3]);
	if (alen > 3)
		return cmd_usage(cmdtp);

	/*
	 * Length is the number of objects, not number of bytes.
	 */
	length = simple_strtoul(argv[4], NULL, 16);

	while (length-- > 0) {
		if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0) {
			puts("Error writing to the chip.\n");
			return 1;
		}
/*
 * No write delay with FRAM devices.
 */
#if !defined(CONFIG_SYS_I2C_FRAM)
		udelay(11000);
#endif
	}
	return 0;
}

313 314 315 316 317 318 319 320 321 322
/**
 * do_i2c_md() - Handle the "i2c md" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 *
323 324 325
 * Syntax:
 *	i2c md {i2c_chip} {addr}{.0, .1, .2} {len}
 */
326
static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339
{
	u_char	chip;
	uint	addr, alen, length;
	int	j, nbytes, linebytes;

	/* We use the last specified parameters, unless new ones are
	 * entered.
	 */
	chip   = i2c_dp_last_chip;
	addr   = i2c_dp_last_addr;
	alen   = i2c_dp_last_alen;
	length = i2c_dp_last_length;

340
	if (argc < 3)
341
		return CMD_RET_USAGE;
W
wdenk 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357

	if ((flag & CMD_FLAG_REPEAT) == 0) {
		/*
		 * New command specified.
		 */

		/*
		 * I2C chip address
		 */
		chip = simple_strtoul(argv[1], NULL, 16);

		/*
		 * I2C data address within the chip.  This can be 1 or
		 * 2 bytes long.  Some day it might be 3 bytes long :-).
		 */
		addr = simple_strtoul(argv[2], NULL, 16);
358
		alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
359
		if (alen > 3)
360
			return CMD_RET_USAGE;
W
wdenk 已提交
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382

		/*
		 * If another parameter, it is the length to display.
		 * Length is the number of objects, not number of bytes.
		 */
		if (argc > 3)
			length = simple_strtoul(argv[3], NULL, 16);
	}

	/*
	 * Print the lines.
	 *
	 * We buffer all read data, so we can make sure data is read only
	 * once.
	 */
	nbytes = length;
	do {
		unsigned char	linebuf[DISP_LINE_LEN];
		unsigned char	*cp;

		linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;

383
		if (i2c_read(chip, addr, alen, linebuf, linebytes) != 0)
384
			puts ("Error reading the chip.\n");
385
		else {
W
wdenk 已提交
386 387 388 389 390 391
			printf("%04x:", addr);
			cp = linebuf;
			for (j=0; j<linebytes; j++) {
				printf(" %02x", *cp++);
				addr++;
			}
392
			puts ("    ");
W
wdenk 已提交
393 394 395
			cp = linebuf;
			for (j=0; j<linebytes; j++) {
				if ((*cp < 0x20) || (*cp > 0x7e))
396
					puts (".");
W
wdenk 已提交
397 398 399 400
				else
					printf("%c", *cp);
				cp++;
			}
401
			putc ('\n');
W
wdenk 已提交
402 403 404 405 406 407 408 409 410 411 412 413
		}
		nbytes -= linebytes;
	} while (nbytes > 0);

	i2c_dp_last_chip   = chip;
	i2c_dp_last_addr   = addr;
	i2c_dp_last_alen   = alen;
	i2c_dp_last_length = length;

	return 0;
}

414 415 416 417 418 419 420 421 422
/**
 * do_i2c_mw() - Handle the "i2c mw" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
W
wdenk 已提交
423 424
 *
 * Syntax:
425
 *	i2c mw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]
W
wdenk 已提交
426
 */
427
static int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
428 429 430 431 432 433 434
{
	uchar	chip;
	ulong	addr;
	uint	alen;
	uchar	byte;
	int	count;

435
	if ((argc < 4) || (argc > 5))
436
		return CMD_RET_USAGE;
W
wdenk 已提交
437 438

	/*
W
Wolfgang Denk 已提交
439 440
	 * Chip is always specified.
	 */
W
wdenk 已提交
441 442 443 444 445 446
	chip = simple_strtoul(argv[1], NULL, 16);

	/*
	 * Address is always specified.
	 */
	addr = simple_strtoul(argv[2], NULL, 16);
447
	alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
448
	if (alen > 3)
449
		return CMD_RET_USAGE;
W
wdenk 已提交
450 451 452 453 454 455 456 457 458

	/*
	 * Value to write is always specified.
	 */
	byte = simple_strtoul(argv[3], NULL, 16);

	/*
	 * Optional count
	 */
459
	if (argc == 5)
W
wdenk 已提交
460
		count = simple_strtoul(argv[4], NULL, 16);
461
	else
W
wdenk 已提交
462 463 464
		count = 1;

	while (count-- > 0) {
465
		if (i2c_write(chip, addr++, alen, &byte, 1) != 0)
466
			puts ("Error writing the chip.\n");
W
wdenk 已提交
467 468 469 470
		/*
		 * Wait for the write to complete.  The write can take
		 * up to 10mSec (we allow a little more time).
		 */
已提交
471 472 473
/*
 * No write delay with FRAM devices.
 */
474
#if !defined(CONFIG_SYS_I2C_FRAM)
W
wdenk 已提交
475
		udelay(11000);
已提交
476
#endif
W
wdenk 已提交
477 478
	}

479
	return 0;
W
wdenk 已提交
480 481
}

482 483 484 485 486 487 488 489 490 491 492
/**
 * do_i2c_crc() - Handle the "i2c crc32" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Calculate a CRC on memory
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
W
wdenk 已提交
493 494
 *
 * Syntax:
495
 *	i2c crc32 {i2c_chip} {addr}{.0, .1, .2} {count}
W
wdenk 已提交
496
 */
497
static int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
498 499 500 501 502 503 504 505 506
{
	uchar	chip;
	ulong	addr;
	uint	alen;
	int	count;
	uchar	byte;
	ulong	crc;
	ulong	err;

507
	if (argc < 4)
508
		return CMD_RET_USAGE;
W
wdenk 已提交
509 510

	/*
W
Wolfgang Denk 已提交
511 512
	 * Chip is always specified.
	 */
W
wdenk 已提交
513 514 515 516 517 518
	chip = simple_strtoul(argv[1], NULL, 16);

	/*
	 * Address is always specified.
	 */
	addr = simple_strtoul(argv[2], NULL, 16);
519
	alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
520
	if (alen > 3)
521
		return CMD_RET_USAGE;
W
wdenk 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534

	/*
	 * Count is always specified
	 */
	count = simple_strtoul(argv[3], NULL, 16);

	printf ("CRC32 for %08lx ... %08lx ==> ", addr, addr + count - 1);
	/*
	 * CRC a byte at a time.  This is going to be slooow, but hey, the
	 * memories are small and slow too so hopefully nobody notices.
	 */
	crc = 0;
	err = 0;
535 536
	while (count-- > 0) {
		if (i2c_read(chip, addr, alen, &byte, 1) != 0)
W
wdenk 已提交
537 538 539 540
			err++;
		crc = crc32 (crc, &byte, 1);
		addr++;
	}
541
	if (err > 0)
542
		puts ("Error reading the chip,\n");
543
	else
W
wdenk 已提交
544 545 546 547 548
		printf ("%08lx\n", crc);

	return 0;
}

549 550 551 552 553 554 555 556 557 558 559
/**
 * mod_i2c_mem() - Handle the "i2c mm" and "i2c nm" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Modify memory.
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
W
wdenk 已提交
560 561
 *
 * Syntax:
562 563
 *	i2c mm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
 *	i2c nm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
W
wdenk 已提交
564 565
 */
static int
566
mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
W
wdenk 已提交
567 568 569 570 571 572 573 574
{
	uchar	chip;
	ulong	addr;
	uint	alen;
	ulong	data;
	int	size = 1;
	int	nbytes;

575
	if (argc != 3)
576
		return CMD_RET_USAGE;
W
wdenk 已提交
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596

#ifdef CONFIG_BOOT_RETRY_TIME
	reset_cmd_timeout();	/* got a good command to get here */
#endif
	/*
	 * We use the last specified parameters, unless new ones are
	 * entered.
	 */
	chip = i2c_mm_last_chip;
	addr = i2c_mm_last_addr;
	alen = i2c_mm_last_alen;

	if ((flag & CMD_FLAG_REPEAT) == 0) {
		/*
		 * New command specified.  Check for a size specification.
		 * Defaults to byte if no or incorrect specification.
		 */
		size = cmd_get_data_size(argv[0], 1);

		/*
W
Wolfgang Denk 已提交
597 598
		 * Chip is always specified.
		 */
W
wdenk 已提交
599 600 601 602 603 604
		chip = simple_strtoul(argv[1], NULL, 16);

		/*
		 * Address is always specified.
		 */
		addr = simple_strtoul(argv[2], NULL, 16);
605
		alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
606
		if (alen > 3)
607
			return CMD_RET_USAGE;
W
wdenk 已提交
608 609 610 611 612 613 614 615
	}

	/*
	 * Print the address, followed by value.  Then accept input for
	 * the next value.  A non-converted value exits.
	 */
	do {
		printf("%08lx:", addr);
616
		if (i2c_read(chip, addr, alen, (uchar *)&data, size) != 0)
617
			puts ("\nError reading the chip,\n");
618
		else {
W
wdenk 已提交
619
			data = cpu_to_be32(data);
620
			if (size == 1)
W
wdenk 已提交
621
				printf(" %02lx", (data >> 24) & 0x000000FF);
622
			else if (size == 2)
W
wdenk 已提交
623
				printf(" %04lx", (data >> 16) & 0x0000FFFF);
624
			else
W
wdenk 已提交
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641
				printf(" %08lx", data);
		}

		nbytes = readline (" ? ");
		if (nbytes == 0) {
			/*
			 * <CR> pressed as only input, don't modify current
			 * location and move to next.
			 */
			if (incrflag)
				addr += size;
			nbytes = size;
#ifdef CONFIG_BOOT_RETRY_TIME
			reset_cmd_timeout(); /* good enough to not time out */
#endif
		}
#ifdef CONFIG_BOOT_RETRY_TIME
642
		else if (nbytes == -2)
W
wdenk 已提交
643 644 645 646 647 648
			break;	/* timed out, exit the command	*/
#endif
		else {
			char *endp;

			data = simple_strtoul(console_buffer, &endp, 16);
649
			if (size == 1)
W
wdenk 已提交
650
				data = data << 24;
651
			else if (size == 2)
W
wdenk 已提交
652 653 654 655 656 657 658 659 660 661
				data = data << 16;
			data = be32_to_cpu(data);
			nbytes = endp - console_buffer;
			if (nbytes) {
#ifdef CONFIG_BOOT_RETRY_TIME
				/*
				 * good enough to not time out
				 */
				reset_cmd_timeout();
#endif
662
				if (i2c_write(chip, addr, alen, (uchar *)&data, size) != 0)
663
					puts ("Error writing the chip.\n");
664 665
#ifdef CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS
				udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
W
wdenk 已提交
666
#endif
W
wdenk 已提交
667 668 669 670 671 672
				if (incrflag)
					addr += size;
			}
		}
	} while (nbytes);

P
Peter Tyser 已提交
673 674 675
	i2c_mm_last_chip = chip;
	i2c_mm_last_addr = addr;
	i2c_mm_last_alen = alen;
W
wdenk 已提交
676 677 678 679

	return 0;
}

680 681 682 683 684 685 686 687 688 689
/**
 * do_i2c_probe() - Handle the "i2c probe" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 *
W
wdenk 已提交
690
 * Syntax:
691 692 693
 *	i2c probe {addr}
 *
 * Returns zero (success) if one or more I2C devices was found
W
wdenk 已提交
694
 */
695
static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
696 697
{
	int j;
698 699
	int addr = -1;
	int found = 0;
700
#if defined(CONFIG_SYS_I2C_NOPROBES)
W
wdenk 已提交
701
	int k, skip;
B
Ben Warren 已提交
702 703
	uchar bus = GET_BUS_NUM;
#endif	/* NOPROBES */
W
wdenk 已提交
704

705 706 707
	if (argc == 2)
		addr = simple_strtol(argv[1], 0, 16);

708
	puts ("Valid chip addresses:");
709
	for (j = 0; j < 128; j++) {
710 711 712
		if ((0 <= addr) && (j != addr))
			continue;

713
#if defined(CONFIG_SYS_I2C_NOPROBES)
W
wdenk 已提交
714
		skip = 0;
715 716
		for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) {
			if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) {
W
wdenk 已提交
717 718 719 720 721 722 723
				skip = 1;
				break;
			}
		}
		if (skip)
			continue;
#endif
724
		if (i2c_probe(j) == 0) {
W
wdenk 已提交
725
			printf(" %02X", j);
726 727
			found++;
		}
W
wdenk 已提交
728
	}
729
	putc ('\n');
W
wdenk 已提交
730

731
#if defined(CONFIG_SYS_I2C_NOPROBES)
W
wdenk 已提交
732
	puts ("Excluded chip addresses:");
733 734
	for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) {
		if (COMPARE_BUS(bus,k))
B
Ben Warren 已提交
735 736
			printf(" %02X", NO_PROBE_ADDR(k));
	}
737
	putc ('\n');
W
wdenk 已提交
738 739
#endif

740
	return (0 == found);
W
wdenk 已提交
741 742
}

743 744 745 746 747 748 749 750 751 752
/**
 * do_i2c_loop() - Handle the "i2c loop" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 *
W
wdenk 已提交
753
 * Syntax:
754
 *	i2c loop {i2c_chip} {addr}{.0, .1, .2} [{length}] [{delay}]
W
wdenk 已提交
755 756 757
 *	{length} - Number of bytes to read
 *	{delay}  - A DECIMAL number and defaults to 1000 uSec
 */
758
static int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
759 760 761 762 763 764 765 766
{
	u_char	chip;
	ulong	alen;
	uint	addr;
	uint	length;
	u_char	bytes[16];
	int	delay;

767
	if (argc < 3)
768
		return CMD_RET_USAGE;
W
wdenk 已提交
769 770 771 772 773 774 775 776 777 778

	/*
	 * Chip is always specified.
	 */
	chip = simple_strtoul(argv[1], NULL, 16);

	/*
	 * Address is always specified.
	 */
	addr = simple_strtoul(argv[2], NULL, 16);
779
	alen = get_alen(argv[2]);
R
Reinhard Meyer 已提交
780
	if (alen > 3)
781
		return CMD_RET_USAGE;
W
wdenk 已提交
782 783 784 785 786 787

	/*
	 * Length is the number of objects, not number of bytes.
	 */
	length = 1;
	length = simple_strtoul(argv[3], NULL, 16);
788
	if (length > sizeof(bytes))
W
wdenk 已提交
789 790 791 792 793 794
		length = sizeof(bytes);

	/*
	 * The delay time (uSec) is optional.
	 */
	delay = 1000;
795
	if (argc > 3)
W
wdenk 已提交
796 797 798 799
		delay = simple_strtoul(argv[4], NULL, 10);
	/*
	 * Run the loop...
	 */
800 801
	while (1) {
		if (i2c_read(chip, addr, alen, bytes, length) != 0)
802
			puts ("Error reading the chip.\n");
W
wdenk 已提交
803 804 805 806 807 808 809 810 811 812
		udelay(delay);
	}

	/* NOTREACHED */
	return 0;
}

/*
 * The SDRAM command is separately configured because many
 * (most?) embedded boards don't use SDRAM DIMMs.
813 814
 *
 * FIXME: Document and probably move elsewhere!
W
wdenk 已提交
815
 */
816
#if defined(CONFIG_CMD_SDRAM)
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862
static void print_ddr2_tcyc (u_char const b)
{
	printf ("%d.", (b >> 4) & 0x0F);
	switch (b & 0x0F) {
	case 0x0:
	case 0x1:
	case 0x2:
	case 0x3:
	case 0x4:
	case 0x5:
	case 0x6:
	case 0x7:
	case 0x8:
	case 0x9:
		printf ("%d ns\n", b & 0x0F);
		break;
	case 0xA:
		puts ("25 ns\n");
		break;
	case 0xB:
		puts ("33 ns\n");
		break;
	case 0xC:
		puts ("66 ns\n");
		break;
	case 0xD:
		puts ("75 ns\n");
		break;
	default:
		puts ("?? ns\n");
		break;
	}
}

static void decode_bits (u_char const b, char const *str[], int const do_once)
{
	u_char mask;

	for (mask = 0x80; mask != 0x00; mask >>= 1, ++str) {
		if (b & mask) {
			puts (*str);
			if (do_once)
				return;
		}
	}
}
W
wdenk 已提交
863 864 865

/*
 * Syntax:
866
 *	i2c sdram {i2c_chip}
W
wdenk 已提交
867
 */
868
static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
W
wdenk 已提交
869
{
870 871
	enum { unknown, EDO, SDRAM, DDR2 } type;

W
wdenk 已提交
872 873 874 875 876
	u_char	chip;
	u_char	data[128];
	u_char	cksum;
	int	j;

877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
	static const char *decode_CAS_DDR2[] = {
		" TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD"
	};

	static const char *decode_CAS_default[] = {
		" TBD", " 7", " 6", " 5", " 4", " 3", " 2", " 1"
	};

	static const char *decode_CS_WE_default[] = {
		" TBD", " 6", " 5", " 4", " 3", " 2", " 1", " 0"
	};

	static const char *decode_byte21_default[] = {
		"  TBD (bit 7)\n",
		"  Redundant row address\n",
		"  Differential clock input\n",
		"  Registerd DQMB inputs\n",
		"  Buffered DQMB inputs\n",
		"  On-card PLL\n",
		"  Registered address/control lines\n",
		"  Buffered address/control lines\n"
	};

	static const char *decode_byte22_DDR2[] = {
		"  TBD (bit 7)\n",
		"  TBD (bit 6)\n",
		"  TBD (bit 5)\n",
		"  TBD (bit 4)\n",
		"  TBD (bit 3)\n",
		"  Supports partial array self refresh\n",
		"  Supports 50 ohm ODT\n",
		"  Supports weak driver\n"
	};

	static const char *decode_row_density_DDR2[] = {
		"512 MiB", "256 MiB", "128 MiB", "16 GiB",
		"8 GiB", "4 GiB", "2 GiB", "1 GiB"
	};

	static const char *decode_row_density_default[] = {
		"512 MiB", "256 MiB", "128 MiB", "64 MiB",
		"32 MiB", "16 MiB", "8 MiB", "4 MiB"
	};

921
	if (argc < 2)
922
		return CMD_RET_USAGE;
923

W
wdenk 已提交
924 925
	/*
	 * Chip is always specified.
926 927
	 */
	chip = simple_strtoul (argv[1], NULL, 16);
W
wdenk 已提交
928

929
	if (i2c_read (chip, 0, 1, data, sizeof (data)) != 0) {
930
		puts ("No SDRAM Serial Presence Detect found.\n");
W
wdenk 已提交
931 932 933 934 935 936 937
		return 1;
	}

	cksum = 0;
	for (j = 0; j < 63; j++) {
		cksum += data[j];
	}
938
	if (cksum != data[63]) {
W
wdenk 已提交
939
		printf ("WARNING: Configuration data checksum failure:\n"
940
			"  is 0x%02x, calculated 0x%02x\n", data[63], cksum);
W
wdenk 已提交
941
	}
942
	printf ("SPD data revision            %d.%d\n",
W
wdenk 已提交
943
		(data[62] >> 4) & 0x0F, data[62] & 0x0F);
944 945 946
	printf ("Bytes used                   0x%02X\n", data[0]);
	printf ("Serial memory size           0x%02X\n", 1 << data[1]);

947
	puts ("Memory type                  ");
948
	switch (data[2]) {
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964
	case 2:
		type = EDO;
		puts ("EDO\n");
		break;
	case 4:
		type = SDRAM;
		puts ("SDRAM\n");
		break;
	case 8:
		type = DDR2;
		puts ("DDR2\n");
		break;
	default:
		type = unknown;
		puts ("unknown\n");
		break;
W
wdenk 已提交
965
	}
966

967
	puts ("Row address bits             ");
968
	if ((data[3] & 0x00F0) == 0)
969
		printf ("%d\n", data[3] & 0x0F);
970
	else
971 972
		printf ("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F);

973
	puts ("Column address bits          ");
974
	if ((data[4] & 0x00F0) == 0)
975
		printf ("%d\n", data[4] & 0x0F);
976
	else
977
		printf ("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F);
978 979 980

	switch (type) {
	case DDR2:
981 982
		printf ("Number of ranks              %d\n",
			(data[5] & 0x07) + 1);
983 984
		break;
	default:
985
		printf ("Module rows                  %d\n", data[5]);
986 987 988 989 990
		break;
	}

	switch (type) {
	case DDR2:
991
		printf ("Module data width            %d bits\n", data[6]);
992 993
		break;
	default:
994 995
		printf ("Module data width            %d bits\n",
			(data[7] << 8) | data[6]);
996 997 998
		break;
	}

999
	puts ("Interface signal levels      ");
W
wdenk 已提交
1000
	switch(data[8]) {
1001
		case 0:  puts ("TTL 5.0 V\n");	break;
1002
		case 1:  puts ("LVTTL\n");	break;
1003 1004 1005 1006
		case 2:  puts ("HSTL 1.5 V\n");	break;
		case 3:  puts ("SSTL 3.3 V\n");	break;
		case 4:  puts ("SSTL 2.5 V\n");	break;
		case 5:  puts ("SSTL 1.8 V\n");	break;
1007
		default: puts ("unknown\n");	break;
W
wdenk 已提交
1008
	}
1009 1010 1011

	switch (type) {
	case DDR2:
1012 1013
		printf ("SDRAM cycle time             ");
		print_ddr2_tcyc (data[9]);
1014 1015
		break;
	default:
1016 1017
		printf ("SDRAM cycle time             %d.%d ns\n",
			(data[9] >> 4) & 0x0F, data[9] & 0x0F);
1018 1019 1020 1021 1022
		break;
	}

	switch (type) {
	case DDR2:
1023 1024
		printf ("SDRAM access time            0.%d%d ns\n",
			(data[10] >> 4) & 0x0F, data[10] & 0x0F);
1025 1026
		break;
	default:
1027 1028
		printf ("SDRAM access time            %d.%d ns\n",
			(data[10] >> 4) & 0x0F, data[10] & 0x0F);
1029 1030 1031
		break;
	}

1032
	puts ("EDC configuration            ");
1033
	switch (data[11]) {
1034 1035 1036 1037
		case 0:  puts ("None\n");	break;
		case 1:  puts ("Parity\n");	break;
		case 2:  puts ("ECC\n");	break;
		default: puts ("unknown\n");	break;
W
wdenk 已提交
1038
	}
1039

1040
	if ((data[12] & 0x80) == 0)
1041
		puts ("No self refresh, rate        ");
1042
	else
1043
		puts ("Self refresh, rate           ");
1044

W
wdenk 已提交
1045
	switch(data[12] & 0x7F) {
1046 1047 1048 1049 1050 1051
		case 0:  puts ("15.625 us\n");	break;
		case 1:  puts ("3.9 us\n");	break;
		case 2:  puts ("7.8 us\n");	break;
		case 3:  puts ("31.3 us\n");	break;
		case 4:  puts ("62.5 us\n");	break;
		case 5:  puts ("125 us\n");	break;
1052
		default: puts ("unknown\n");	break;
W
wdenk 已提交
1053
	}
1054 1055 1056

	switch (type) {
	case DDR2:
1057
		printf ("SDRAM width (primary)        %d\n", data[13]);
1058 1059
		break;
	default:
1060
		printf ("SDRAM width (primary)        %d\n", data[13] & 0x7F);
1061
		if ((data[13] & 0x80) != 0) {
1062 1063
			printf ("  (second bank)              %d\n",
				2 * (data[13] & 0x7F));
1064 1065 1066 1067 1068 1069 1070
		}
		break;
	}

	switch (type) {
	case DDR2:
		if (data[14] != 0)
1071
			printf ("EDC width                    %d\n", data[14]);
1072 1073 1074
		break;
	default:
		if (data[14] != 0) {
1075 1076
			printf ("EDC width                    %d\n",
				data[14] & 0x7F);
1077 1078

			if ((data[14] & 0x80) != 0) {
1079 1080
				printf ("  (second bank)              %d\n",
					2 * (data[14] & 0x7F));
1081 1082 1083
			}
		}
		break;
W
wdenk 已提交
1084
	}
1085

1086 1087 1088
	if (DDR2 != type) {
		printf ("Min clock delay, back-to-back random column addresses "
			"%d\n", data[15]);
1089 1090
	}

1091 1092 1093 1094 1095 1096 1097
	puts ("Burst length(s)             ");
	if (data[16] & 0x80) puts (" Page");
	if (data[16] & 0x08) puts (" 8");
	if (data[16] & 0x04) puts (" 4");
	if (data[16] & 0x02) puts (" 2");
	if (data[16] & 0x01) puts (" 1");
	putc ('\n');
1098
	printf ("Number of banks              %d\n", data[17]);
1099 1100 1101 1102

	switch (type) {
	case DDR2:
		puts ("CAS latency(s)              ");
1103
		decode_bits (data[18], decode_CAS_DDR2, 0);
1104 1105 1106 1107
		putc ('\n');
		break;
	default:
		puts ("CAS latency(s)              ");
1108
		decode_bits (data[18], decode_CAS_default, 0);
1109 1110 1111 1112 1113 1114
		putc ('\n');
		break;
	}

	if (DDR2 != type) {
		puts ("CS latency(s)               ");
1115
		decode_bits (data[19], decode_CS_WE_default, 0);
1116 1117 1118 1119 1120
		putc ('\n');
	}

	if (DDR2 != type) {
		puts ("WE latency(s)               ");
1121
		decode_bits (data[20], decode_CS_WE_default, 0);
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
		putc ('\n');
	}

	switch (type) {
	case DDR2:
		puts ("Module attributes:\n");
		if (data[21] & 0x80)
			puts ("  TBD (bit 7)\n");
		if (data[21] & 0x40)
			puts ("  Analysis probe installed\n");
		if (data[21] & 0x20)
			puts ("  TBD (bit 5)\n");
		if (data[21] & 0x10)
			puts ("  FET switch external enable\n");
1136
		printf ("  %d PLLs on DIMM\n", (data[21] >> 2) & 0x03);
1137
		if (data[20] & 0x11) {
1138 1139
			printf ("  %d active registers on DIMM\n",
				(data[21] & 0x03) + 1);
1140 1141 1142 1143 1144 1145
		}
		break;
	default:
		puts ("Module attributes:\n");
		if (!data[21])
			puts ("  (none)\n");
1146 1147
		else
			decode_bits (data[21], decode_byte21_default, 0);
1148 1149 1150 1151 1152
		break;
	}

	switch (type) {
	case DDR2:
1153
		decode_bits (data[22], decode_byte22_DDR2, 0);
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
		break;
	default:
		puts ("Device attributes:\n");
		if (data[22] & 0x80) puts ("  TBD (bit 7)\n");
		if (data[22] & 0x40) puts ("  TBD (bit 6)\n");
		if (data[22] & 0x20) puts ("  Upper Vcc tolerance 5%\n");
		else                 puts ("  Upper Vcc tolerance 10%\n");
		if (data[22] & 0x10) puts ("  Lower Vcc tolerance 5%\n");
		else                 puts ("  Lower Vcc tolerance 10%\n");
		if (data[22] & 0x08) puts ("  Supports write1/read burst\n");
		if (data[22] & 0x04) puts ("  Supports precharge all\n");
		if (data[22] & 0x02) puts ("  Supports auto precharge\n");
		if (data[22] & 0x01) puts ("  Supports early RAS# precharge\n");
		break;
	}

	switch (type) {
	case DDR2:
1172 1173
		printf ("SDRAM cycle time (2nd highest CAS latency)        ");
		print_ddr2_tcyc (data[23]);
1174 1175
		break;
	default:
1176 1177
		printf ("SDRAM cycle time (2nd highest CAS latency)        %d."
			"%d ns\n", (data[23] >> 4) & 0x0F, data[23] & 0x0F);
1178 1179 1180 1181 1182
		break;
	}

	switch (type) {
	case DDR2:
1183 1184
		printf ("SDRAM access from clock (2nd highest CAS latency) 0."
			"%d%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
1185 1186
		break;
	default:
1187 1188
		printf ("SDRAM access from clock (2nd highest CAS latency) %d."
			"%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
1189 1190 1191 1192 1193
		break;
	}

	switch (type) {
	case DDR2:
1194 1195
		printf ("SDRAM cycle time (3rd highest CAS latency)        ");
		print_ddr2_tcyc (data[25]);
1196 1197
		break;
	default:
1198 1199
		printf ("SDRAM cycle time (3rd highest CAS latency)        %d."
			"%d ns\n", (data[25] >> 4) & 0x0F, data[25] & 0x0F);
1200 1201 1202 1203 1204
		break;
	}

	switch (type) {
	case DDR2:
1205 1206
		printf ("SDRAM access from clock (3rd highest CAS latency) 0."
			"%d%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
1207 1208
		break;
	default:
1209 1210
		printf ("SDRAM access from clock (3rd highest CAS latency) %d."
			"%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
1211 1212 1213 1214 1215
		break;
	}

	switch (type) {
	case DDR2:
1216 1217
		printf ("Minimum row precharge        %d.%02d ns\n",
			(data[27] >> 2) & 0x3F, 25 * (data[27] & 0x03));
1218 1219
		break;
	default:
1220
		printf ("Minimum row precharge        %d ns\n", data[27]);
1221 1222 1223 1224 1225
		break;
	}

	switch (type) {
	case DDR2:
1226 1227
		printf ("Row active to row active min %d.%02d ns\n",
			(data[28] >> 2) & 0x3F, 25 * (data[28] & 0x03));
1228 1229
		break;
	default:
1230
		printf ("Row active to row active min %d ns\n", data[28]);
1231 1232 1233 1234 1235
		break;
	}

	switch (type) {
	case DDR2:
1236 1237
		printf ("RAS to CAS delay min         %d.%02d ns\n",
			(data[29] >> 2) & 0x3F, 25 * (data[29] & 0x03));
1238 1239
		break;
	default:
1240
		printf ("RAS to CAS delay min         %d ns\n", data[29]);
1241 1242 1243
		break;
	}

1244
	printf ("Minimum RAS pulse width      %d ns\n", data[30]);
1245 1246 1247

	switch (type) {
	case DDR2:
1248 1249 1250
		puts ("Density of each row          ");
		decode_bits (data[31], decode_row_density_DDR2, 1);
		putc ('\n');
1251 1252
		break;
	default:
1253 1254 1255
		puts ("Density of each row          ");
		decode_bits (data[31], decode_row_density_default, 1);
		putc ('\n');
1256 1257 1258 1259 1260
		break;
	}

	switch (type) {
	case DDR2:
1261
		puts ("Command and Address setup    ");
1262
		if (data[32] >= 0xA0) {
1263 1264
			printf ("1.%d%d ns\n",
				((data[32] >> 4) & 0x0F) - 10, data[32] & 0x0F);
1265
		} else {
1266 1267
			printf ("0.%d%d ns\n",
				((data[32] >> 4) & 0x0F), data[32] & 0x0F);
1268 1269 1270
		}
		break;
	default:
1271 1272 1273
		printf ("Command and Address setup    %c%d.%d ns\n",
			(data[32] & 0x80) ? '-' : '+',
			(data[32] >> 4) & 0x07, data[32] & 0x0F);
1274 1275 1276 1277 1278
		break;
	}

	switch (type) {
	case DDR2:
1279
		puts ("Command and Address hold     ");
1280
		if (data[33] >= 0xA0) {
1281 1282
			printf ("1.%d%d ns\n",
				((data[33] >> 4) & 0x0F) - 10, data[33] & 0x0F);
1283
		} else {
1284 1285
			printf ("0.%d%d ns\n",
				((data[33] >> 4) & 0x0F), data[33] & 0x0F);
1286 1287 1288
		}
		break;
	default:
1289 1290 1291
		printf ("Command and Address hold     %c%d.%d ns\n",
			(data[33] & 0x80) ? '-' : '+',
			(data[33] >> 4) & 0x07, data[33] & 0x0F);
1292 1293 1294 1295 1296
		break;
	}

	switch (type) {
	case DDR2:
1297 1298
		printf ("Data signal input setup      0.%d%d ns\n",
			(data[34] >> 4) & 0x0F, data[34] & 0x0F);
1299 1300
		break;
	default:
1301 1302 1303
		printf ("Data signal input setup      %c%d.%d ns\n",
			(data[34] & 0x80) ? '-' : '+',
			(data[34] >> 4) & 0x07, data[34] & 0x0F);
1304 1305 1306 1307 1308
		break;
	}

	switch (type) {
	case DDR2:
1309 1310
		printf ("Data signal input hold       0.%d%d ns\n",
			(data[35] >> 4) & 0x0F, data[35] & 0x0F);
1311 1312
		break;
	default:
1313 1314 1315
		printf ("Data signal input hold       %c%d.%d ns\n",
			(data[35] & 0x80) ? '-' : '+',
			(data[35] >> 4) & 0x07, data[35] & 0x0F);
1316 1317 1318
		break;
	}

1319
	puts ("Manufacturer's JEDEC ID      ");
1320
	for (j = 64; j <= 71; j++)
1321
		printf ("%02X ", data[j]);
1322
	putc ('\n');
1323
	printf ("Manufacturing Location       %02X\n", data[72]);
1324
	puts ("Manufacturer's Part Number   ");
1325
	for (j = 73; j <= 90; j++)
1326
		printf ("%02X ", data[j]);
1327
	putc ('\n');
1328 1329
	printf ("Revision Code                %02X %02X\n", data[91], data[92]);
	printf ("Manufacturing Date           %02X %02X\n", data[93], data[94]);
1330
	puts ("Assembly Serial Number       ");
1331
	for (j = 95; j <= 98; j++)
1332
		printf ("%02X ", data[j]);
1333
	putc ('\n');
W
wdenk 已提交
1334

1335
	if (DDR2 != type) {
1336 1337
		printf ("Speed rating                 PC%d\n",
			data[126] == 0x66 ? 66 : data[126]);
1338
	}
W
wdenk 已提交
1339 1340
	return 0;
}
1341
#endif
W
wdenk 已提交
1342

1343
#if defined(CONFIG_I2C_MUX)
1344 1345 1346 1347 1348 1349 1350 1351 1352
/**
 * do_i2c_add_bus() - Handle the "i2c bus" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero always.
 */
1353
static int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
{
	int ret=0;

	if (argc == 1) {
		/* show all busses */
		I2C_MUX		*mux;
		I2C_MUX_DEVICE	*device = i2c_mux_devices;

		printf ("Busses reached over muxes:\n");
		while (device != NULL) {
			printf ("Bus ID: %x\n", device->busid);
			printf ("  reached over Mux(es):\n");
			mux = device->mux;
			while (mux != NULL) {
				printf ("    %s@%x ch: %x\n", mux->name, mux->chip, mux->channel);
				mux = mux->next;
			}
			device = device->next;
		}
	} else {
1374
		(void)i2c_mux_ident_muxstring ((uchar *)argv[1]);
1375 1376 1377 1378 1379 1380
		ret = 0;
	}
	return ret;
}
#endif  /* CONFIG_I2C_MUX */

B
Ben Warren 已提交
1381
#if defined(CONFIG_I2C_MULTI_BUS)
1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
/**
 * do_i2c_bus_num() - Handle the "i2c dev" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
1392
static int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
B
Ben Warren 已提交
1393 1394 1395
{
	int bus_idx, ret=0;

1396 1397
	if (argc == 1)
		/* querying current setting */
B
Ben Warren 已提交
1398
		printf("Current bus is %d\n", i2c_get_bus_num());
1399
	else {
B
Ben Warren 已提交
1400 1401 1402
		bus_idx = simple_strtoul(argv[1], NULL, 10);
		printf("Setting bus to %d\n", bus_idx);
		ret = i2c_set_bus_num(bus_idx);
1403
		if (ret)
B
Ben Warren 已提交
1404 1405 1406 1407 1408 1409
			printf("Failure changing bus number (%d)\n", ret);
	}
	return ret;
}
#endif  /* CONFIG_I2C_MULTI_BUS */

1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
/**
 * do_i2c_bus_speed() - Handle the "i2c speed" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
1420
static int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
B
Ben Warren 已提交
1421 1422 1423
{
	int speed, ret=0;

1424 1425
	if (argc == 1)
		/* querying current speed */
B
Ben Warren 已提交
1426
		printf("Current bus speed=%d\n", i2c_get_bus_speed());
1427
	else {
B
Ben Warren 已提交
1428 1429 1430
		speed = simple_strtoul(argv[1], NULL, 10);
		printf("Setting bus speed to %d Hz\n", speed);
		ret = i2c_set_bus_speed(speed);
1431
		if (ret)
B
Ben Warren 已提交
1432 1433 1434 1435 1436
			printf("Failure changing bus speed (%d)\n", ret);
	}
	return ret;
}

1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
/**
 * do_i2c_mm() - Handle the "i2c mm" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
1447
static int do_i2c_mm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
B
Ben Warren 已提交
1448
{
1449 1450 1451
	return mod_i2c_mem (cmdtp, 1, flag, argc, argv);
}

1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
/**
 * do_i2c_nm() - Handle the "i2c nm" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
1462
static int do_i2c_nm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
1463 1464 1465
{
	return mod_i2c_mem (cmdtp, 0, flag, argc, argv);
}
1466

1467 1468 1469 1470 1471 1472 1473 1474 1475
/**
 * do_i2c_reset() - Handle the "i2c reset" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero always.
 */
1476
static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
1477 1478 1479 1480 1481 1482
{
	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
	return 0;
}

static cmd_tbl_t cmd_i2c_sub[] = {
1483
#if defined(CONFIG_I2C_MUX)
1484
	U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_add_bus, "", ""),
1485
#endif  /* CONFIG_I2C_MUX */
1486
	U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
B
Ben Warren 已提交
1487
#if defined(CONFIG_I2C_MULTI_BUS)
1488
	U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
B
Ben Warren 已提交
1489
#endif  /* CONFIG_I2C_MULTI_BUS */
1490 1491 1492 1493 1494 1495
	U_BOOT_CMD_MKENT(loop, 3, 1, do_i2c_loop, "", ""),
	U_BOOT_CMD_MKENT(md, 3, 1, do_i2c_md, "", ""),
	U_BOOT_CMD_MKENT(mm, 2, 1, do_i2c_mm, "", ""),
	U_BOOT_CMD_MKENT(mw, 3, 1, do_i2c_mw, "", ""),
	U_BOOT_CMD_MKENT(nm, 2, 1, do_i2c_nm, "", ""),
	U_BOOT_CMD_MKENT(probe, 0, 1, do_i2c_probe, "", ""),
1496
	U_BOOT_CMD_MKENT(read, 5, 1, do_i2c_read, "", ""),
Y
York Sun 已提交
1497
	U_BOOT_CMD_MKENT(write, 5, 0, do_i2c_write, "", ""),
1498
	U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""),
1499
#if defined(CONFIG_CMD_SDRAM)
1500
	U_BOOT_CMD_MKENT(sdram, 1, 1, do_sdram, "", ""),
1501
#endif
1502 1503 1504
	U_BOOT_CMD_MKENT(speed, 1, 1, do_i2c_bus_speed, "", ""),
};

1505
#ifdef CONFIG_NEEDS_MANUAL_RELOC
H
Heiko Schocher 已提交
1506 1507 1508 1509 1510
void i2c_reloc(void) {
	fixup_cmdtable(cmd_i2c_sub, ARRAY_SIZE(cmd_i2c_sub));
}
#endif

1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
/**
 * do_i2c() - Handle the "i2c" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
1521
static int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
1522 1523 1524
{
	cmd_tbl_t *c;

H
Heiko Schocher 已提交
1525
	if (argc < 2)
1526
		return CMD_RET_USAGE;
H
Heiko Schocher 已提交
1527

1528 1529 1530 1531 1532 1533
	/* Strip off leading 'i2c' command argument */
	argc--;
	argv++;

	c = find_cmd_tbl(argv[0], &cmd_i2c_sub[0], ARRAY_SIZE(cmd_i2c_sub));

1534
	if (c)
1535
		return c->cmd(cmdtp, flag, argc, argv);
1536
	else
1537
		return CMD_RET_USAGE;
B
Ben Warren 已提交
1538
}
W
wdenk 已提交
1539 1540

/***************************************************/
K
Kim Phillips 已提交
1541 1542
#ifdef CONFIG_SYS_LONGHELP
static char i2c_help_text[] =
1543
#if defined(CONFIG_I2C_MUX)
1544
	"bus [muxtype:muxaddr:muxchannel] - add a new bus reached over muxes\ni2c "
1545
#endif  /* CONFIG_I2C_MUX */
1546
	"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
1547
#if defined(CONFIG_I2C_MULTI_BUS)
1548
	"i2c dev [dev] - show or set current I2C bus\n"
1549
#endif  /* CONFIG_I2C_MULTI_BUS */
1550
	"i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n"
1551 1552 1553 1554
	"i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
	"i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
	"i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
	"i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
1555
	"i2c probe [address] - test for and show device(s) on the I2C bus\n"
1556
	"i2c read chip address[.0, .1, .2] length memaddress - read to memory \n"
Y
York Sun 已提交
1557
	"i2c write memaddress chip address[.0, .1, .2] length - write memory to i2c\n"
H
Heiko Schocher 已提交
1558
	"i2c reset - re-init the I2C Controller\n"
1559
#if defined(CONFIG_CMD_SDRAM)
1560
	"i2c sdram chip - print SDRAM configuration information\n"
1561
#endif
K
Kim Phillips 已提交
1562 1563 1564 1565 1566 1567 1568
	"i2c speed [speed] - show or set I2C bus speed";
#endif

U_BOOT_CMD(
	i2c, 6, 1, do_i2c,
	"I2C sub-system",
	i2c_help_text
1569
);
1570 1571

#if defined(CONFIG_I2C_MUX)
1572
static int i2c_mux_add_device(I2C_MUX_DEVICE *dev)
1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
{
	I2C_MUX_DEVICE	*devtmp = i2c_mux_devices;

	if (i2c_mux_devices == NULL) {
		i2c_mux_devices = dev;
		return 0;
	}
	while (devtmp->next != NULL)
		devtmp = devtmp->next;

	devtmp->next = dev;
	return 0;
}

I2C_MUX_DEVICE	*i2c_mux_search_device(int id)
{
	I2C_MUX_DEVICE	*device = i2c_mux_devices;

	while (device != NULL) {
		if (device->busid == id)
			return device;
		device = device->next;
	}
	return NULL;
}

/* searches in the buf from *pos the next ':'.
 * returns:
 *     0 if found (with *pos = where)
 *   < 0 if an error occured
 *   > 0 if the end of buf is reached
 */
static int i2c_mux_search_next (int *pos, uchar	*buf, int len)
{
	while ((buf[*pos] != ':') && (*pos < len)) {
		*pos += 1;
	}
	if (*pos >= len)
		return 1;
	if (buf[*pos] != ':')
		return -1;
	return 0;
}

static int i2c_mux_get_busid (void)
{
	int	tmp = i2c_mux_busid;

	i2c_mux_busid ++;
	return tmp;
}

M
Michael Jones 已提交
1625 1626
/* Analyses a Muxstring and immediately sends the
   commands to the muxes. Runs from flash.
1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675
 */
int i2c_mux_ident_muxstring_f (uchar *buf)
{
	int	pos = 0;
	int	oldpos;
	int	ret = 0;
	int	len = strlen((char *)buf);
	int	chip;
	uchar	channel;
	int	was = 0;

	while (ret == 0) {
		oldpos = pos;
		/* search name */
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret != 0)
			printf ("ERROR\n");
		/* search address */
		pos ++;
		oldpos = pos;
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret != 0)
			printf ("ERROR\n");
		buf[pos] = 0;
		chip = simple_strtoul((char *)&buf[oldpos], NULL, 16);
		buf[pos] = ':';
		/* search channel */
		pos ++;
		oldpos = pos;
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret < 0)
			printf ("ERROR\n");
		was = 0;
		if (buf[pos] != 0) {
			buf[pos] = 0;
			was = 1;
		}
		channel = simple_strtoul((char *)&buf[oldpos], NULL, 16);
		if (was)
			buf[pos] = ':';
		if (i2c_write(chip, 0, 0, &channel, 1) != 0) {
			printf ("Error setting Mux: chip:%x channel: \
				%x\n", chip, channel);
			return -1;
		}
		pos ++;
		oldpos = pos;

	}
1676
	i2c_init_board();
1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759

	return 0;
}

/* Analyses a Muxstring and if this String is correct
 * adds a new I2C Bus.
 */
I2C_MUX_DEVICE *i2c_mux_ident_muxstring (uchar *buf)
{
	I2C_MUX_DEVICE	*device;
	I2C_MUX		*mux;
	int	pos = 0;
	int	oldpos;
	int	ret = 0;
	int	len = strlen((char *)buf);
	int	was = 0;

	device = (I2C_MUX_DEVICE *)malloc (sizeof(I2C_MUX_DEVICE));
	device->mux = NULL;
	device->busid = i2c_mux_get_busid ();
	device->next = NULL;
	while (ret == 0) {
		mux = (I2C_MUX *)malloc (sizeof(I2C_MUX));
		mux->next = NULL;
		/* search name of mux */
		oldpos = pos;
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret != 0)
			printf ("%s no name.\n", __FUNCTION__);
		mux->name = (char *)malloc (pos - oldpos + 1);
		memcpy (mux->name, &buf[oldpos], pos - oldpos);
		mux->name[pos - oldpos] = 0;
		/* search address */
		pos ++;
		oldpos = pos;
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret != 0)
			printf ("%s no mux address.\n", __FUNCTION__);
		buf[pos] = 0;
		mux->chip = simple_strtoul((char *)&buf[oldpos], NULL, 16);
		buf[pos] = ':';
		/* search channel */
		pos ++;
		oldpos = pos;
		ret = i2c_mux_search_next(&pos, buf, len);
		if (ret < 0)
			printf ("%s no mux channel.\n", __FUNCTION__);
		was = 0;
		if (buf[pos] != 0) {
			buf[pos] = 0;
			was = 1;
		}
		mux->channel = simple_strtoul((char *)&buf[oldpos], NULL, 16);
		if (was)
			buf[pos] = ':';
		if (device->mux == NULL)
			device->mux = mux;
		else {
			I2C_MUX		*muxtmp = device->mux;
			while (muxtmp->next != NULL) {
				muxtmp = muxtmp->next;
			}
			muxtmp->next = mux;
		}
		pos ++;
		oldpos = pos;
	}
	if (ret > 0) {
		/* Add Device */
		i2c_mux_add_device (device);
		return device;
	}

	return NULL;
}

int i2x_mux_select_mux(int bus)
{
	I2C_MUX_DEVICE  *dev;
	I2C_MUX		*mux;

	if ((gd->flags & GD_FLG_RELOC) != GD_FLG_RELOC) {
		/* select Default Mux Bus */
1760 1761
#if defined(CONFIG_SYS_I2C_IVM_BUS)
		i2c_mux_ident_muxstring_f ((uchar *)CONFIG_SYS_I2C_IVM_BUS);
1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777
#else
		{
		unsigned char *buf;
		buf = (unsigned char *) getenv("EEprom_ivm");
		if (buf != NULL)
			i2c_mux_ident_muxstring_f (buf);
		}
#endif
		return 0;
	}
	dev = i2c_mux_search_device(bus);
	if (dev == NULL)
		return -1;

	mux = dev->mux;
	while (mux != NULL) {
1778 1779
		/* do deblocking on each level of mux, before mux config */
		i2c_init_board();
1780 1781 1782 1783 1784 1785 1786
		if (i2c_write(mux->chip, 0, 0, &mux->channel, 1) != 0) {
			printf ("Error setting Mux: chip:%x channel: \
				%x\n", mux->chip, mux->channel);
			return -1;
		}
		mux = mux->next;
	}
1787 1788
	/* do deblocking on each level of mux and after mux config */
	i2c_init_board();
1789 1790 1791
	return 0;
}
#endif /* CONFIG_I2C_MUX */