Blame view

common/cmd_portio.c 3.45 KB
7a8e9bed1   wdenk   * Patch by Marc S...
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
  /*
   * (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>
7a8e9bed1   wdenk   * Patch by Marc S...
32

7a8e9bed1   wdenk   * Patch by Marc S...
33
34
35
36
37
  /* 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;
54841ab50   Wolfgang Denk   Make sure that ar...
38
  int do_portio_out (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
7a8e9bed1   wdenk   * Patch by Marc S...
39
40
41
42
  {
  	uint addr = out_last_addr;
  	uint size = out_last_size;
  	uint value = out_last_value;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
43
  	if (argc != 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
44
  		return CMD_RET_USAGE;
7a8e9bed1   wdenk   * Patch by Marc S...
45
46
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
47
48
  		/*
  		 * New command specified.  Check for a size specification.
7a8e9bed1   wdenk   * Patch by Marc S...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  		 * 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;
  }
0d4983930   wdenk   Patch by Kenneth ...
89
90
  U_BOOT_CMD(
  	out,	3,	1,	do_portio_out,
2fb2604d5   Peter Tyser   Command usage cle...
91
  	"write datum to IO port",
a89c33db9   Wolfgang Denk   General help mess...
92
93
  	"[.b, .w, .l] port value
      - output to IO port"
b0fce99bf   wdenk   Fix some missing ...
94
  );
54841ab50   Wolfgang Denk   Make sure that ar...
95
  int do_portio_in (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
7a8e9bed1   wdenk   * Patch by Marc S...
96
97
98
  {
  	uint addr = in_last_addr;
  	uint size = in_last_size;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
99
  	if (argc != 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
100
  		return CMD_RET_USAGE;
7a8e9bed1   wdenk   * Patch by Marc S...
101
102
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
103
104
  		/*
  		 * New command specified.  Check for a size specification.
7a8e9bed1   wdenk   * Patch by Marc S...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  		 * 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
  ", ch);
  		    }
  			break;
  		case 2:
  		    {
  			unsigned short w;
  			__asm__ volatile ("in %%dx, %0":"=a" (w):"d" (port));
  
  			printf (" %04x
  ", w);
  		    }
  			break;
  		case 4:
  		    {
  			unsigned long l;
  			__asm__ volatile ("in %%dx, %0":"=a" (l):"d" (port));
  
  			printf (" %08lx
  ", l);
  		    }
  			break;
  		}
  	}
  #endif	/* CONFIG_X86 */
  
  	in_last_addr = addr;
  	in_last_size = size;
  
  	return 0;
  }
0d4983930   wdenk   Patch by Kenneth ...
153
154
  U_BOOT_CMD(
  	in,	2,	1,	do_portio_in,
2fb2604d5   Peter Tyser   Command usage cle...
155
  	"read data from an IO port",
b0fce99bf   wdenk   Fix some missing ...
156
157
  	"[.b, .w, .l] port
  "
a89c33db9   Wolfgang Denk   General help mess...
158
  	"    - read datum from IO port"
b0fce99bf   wdenk   Fix some missing ...
159
  );