diff options
| author | wdenk <wdenk> | 2003-05-31 18:35:21 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2003-05-31 18:35:21 +0000 | 
| commit | 7a8e9bed17d7924a9c5c4699b1f6a3a0359524ed (patch) | |
| tree | 5c273df9c5efa7b1b6a4ca88904e48039ef591e8 /common/cmd_portio.c | |
| parent | 3b57fe0a70b903f4db66c558bb9828bc58acf06b (diff) | |
| download | olio-uboot-2014.01-7a8e9bed17d7924a9c5c4699b1f6a3a0359524ed.tar.xz olio-uboot-2014.01-7a8e9bed17d7924a9c5c4699b1f6a3a0359524ed.zip | |
* Patch by Marc Singer, 29 May 2003:LABEL_2003_05_31_2115
  Fixed rarp boot method for IA32 and other little-endian CPUs.
* Patch by Marc Singer, 28 May 2003:
  Added port I/O commands.
* Patch by Matthew McClintock, 28 May 2003
  - cpu/mpc824x/start.S: fix relocation code when booting from RAM
  - minor patches for utx8245
* Patch by Daniel Engström, 28 May 2003:
  x86 update
* Patch by Dave Ellis, 9 May 2003 + 27 May 2003:
  add nand flash support to SXNI855T configuration
  fix/extend nand flash support:
  - fix 'nand erase' command so does not erase bad blocks
  - fix 'nand write' command so does not write to bad blocks
  - fix nand_probe() so handles no flash detected properly
  - add doc/README.nand
  - add .jffs2 and .oob options to nand read/write
  - add 'nand bad' command to list bad blocks
  - add 'clean' option to 'nand erase' to write JFFS2 clean markers
  - make NAND read/write faster
* Patch by Rune Torgersen, 23 May 2003:
  Update for MPC8266ADS board
Diffstat (limited to 'common/cmd_portio.c')
| -rw-r--r-- | common/cmd_portio.c | 157 | 
1 files changed, 157 insertions, 0 deletions
| diff --git a/common/cmd_portio.c b/common/cmd_portio.c new file mode 100644 index 000000000..afa39e1eb --- /dev/null +++ b/common/cmd_portio.c @@ -0,0 +1,157 @@ +/* + * (C) Copyright 2003 + * Marc Singer, elf@buici.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 + */ + +/* + * Port I/O Functions + * + * Copied from FADS ROM, Dan Malek (dmalek@jlc.net) + */ + +#include <common.h> +#include <command.h> +#include <cmd_portio.h> + +#if (CONFIG_COMMANDS & CFG_CMD_PORTIO) + +extern int cmd_get_data_size (char *arg, int default_size); + +/* Display values from last command. + * Memory modify remembered values are different from display memory. + */ +static uint in_last_addr, in_last_size; +static uint out_last_addr, out_last_size, out_last_value; + + +int do_portio_out (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ +	uint addr = out_last_addr; +	uint size = out_last_size; +	uint value = out_last_value; + +	if (argc != 3) { +		printf ("Usage:\n%s\n", cmdtp->usage); +		return 1; +	} + +	if ((flag & CMD_FLAG_REPEAT) == 0) { +		/* New command specified.  Check for a size specification. +		 * Defaults to long if no or incorrect specification. +		 */ +		size = cmd_get_data_size (argv[0], 1); +		addr = simple_strtoul (argv[1], NULL, 16); +		value = simple_strtoul (argv[2], NULL, 16); +	} +#if defined (CONFIG_X86) + +	{ +		unsigned short port = addr; + +		switch (size) { +		default: +		case 1: +		    { +			unsigned char ch = value; +			__asm__ volatile ("out %0, %%dx"::"a" (ch), "d" (port)); +		    } +			break; +		case 2: +		    { +			unsigned short w = value; +			__asm__ volatile ("out %0, %%dx"::"a" (w), "d" (port)); +		    } +			break; +		case 4: +			__asm__ volatile ("out %0, %%dx"::"a" (value), "d" (port)); + +			break; +		} +	} + +#endif							/* CONFIG_X86 */ + +	out_last_addr = addr; +	out_last_size = size; +	out_last_value = value; + +	return 0; +} + +int do_portio_in (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ +	uint addr = in_last_addr; +	uint size = in_last_size; + +	if (argc != 2) { +		printf ("Usage:\n%s\n", cmdtp->usage); +		return 1; +	} + +	if ((flag & CMD_FLAG_REPEAT) == 0) { +		/* New command specified.  Check for a size specification. +		 * Defaults to long if no or incorrect specification. +		 */ +		size = cmd_get_data_size (argv[0], 1); +		addr = simple_strtoul (argv[1], NULL, 16); +	} +#if defined (CONFIG_X86) + +	{ +		unsigned short port = addr; + +		switch (size) { +		default: +		case 1: +		    { +			unsigned char ch; +			__asm__ volatile ("in %%dx, %0":"=a" (ch):"d" (port)); + +			printf (" %02x\n", ch); +		    } +			break; +		case 2: +		    { +			unsigned short w; +			__asm__ volatile ("in %%dx, %0":"=a" (w):"d" (port)); + +			printf (" %04x\n", w); +		    } +			break; +		case 4: +		    { +			unsigned long l; +			__asm__ volatile ("in %%dx, %0":"=a" (l):"d" (port)); + +			printf (" %08lx\n", l); +		    } +			break; +		} +	} +#endif	/* CONFIG_X86 */ + +	in_last_addr = addr; +	in_last_size = size; + +	return 0; +} + +#endif	/* CFG_CMD_PORTIO */ |