Blame view

common/cmd_portio.c 2.71 KB
7a8e9bed1   wdenk   * Patch by Marc S...
1
2
3
4
  /*
   * (C) Copyright 2003
   * Marc Singer, elf@buici.com
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
7a8e9bed1   wdenk   * Patch by Marc S...
6
7
8
9
10
11
12
13
14
15
   */
  
  /*
   * 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...
16

7a8e9bed1   wdenk   * Patch by Marc S...
17
18
19
20
21
  /* 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...
22
  int do_portio_out (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
7a8e9bed1   wdenk   * Patch by Marc S...
23
24
25
26
  {
  	uint addr = out_last_addr;
  	uint size = out_last_size;
  	uint value = out_last_value;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
27
  	if (argc != 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
28
  		return CMD_RET_USAGE;
7a8e9bed1   wdenk   * Patch by Marc S...
29
30
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
31
32
  		/*
  		 * New command specified.  Check for a size specification.
7a8e9bed1   wdenk   * Patch by Marc S...
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
63
64
65
66
67
68
69
70
71
72
  		 * 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 ...
73
74
  U_BOOT_CMD(
  	out,	3,	1,	do_portio_out,
2fb2604d5   Peter Tyser   Command usage cle...
75
  	"write datum to IO port",
a89c33db9   Wolfgang Denk   General help mess...
76
77
  	"[.b, .w, .l] port value
      - output to IO port"
b0fce99bf   wdenk   Fix some missing ...
78
  );
54841ab50   Wolfgang Denk   Make sure that ar...
79
  int do_portio_in (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
7a8e9bed1   wdenk   * Patch by Marc S...
80
81
82
  {
  	uint addr = in_last_addr;
  	uint size = in_last_size;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
83
  	if (argc != 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
84
  		return CMD_RET_USAGE;
7a8e9bed1   wdenk   * Patch by Marc S...
85
86
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
87
88
  		/*
  		 * New command specified.  Check for a size specification.
7a8e9bed1   wdenk   * Patch by Marc S...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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
  		 * 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 ...
137
138
  U_BOOT_CMD(
  	in,	2,	1,	do_portio_in,
2fb2604d5   Peter Tyser   Command usage cle...
139
  	"read data from an IO port",
b0fce99bf   wdenk   Fix some missing ...
140
141
  	"[.b, .w, .l] port
  "
a89c33db9   Wolfgang Denk   General help mess...
142
  	"    - read datum from IO port"
b0fce99bf   wdenk   Fix some missing ...
143
  );