当前位置: 首页 > U-Boot随笔 > 正文

u-boot移植随笔(2):u-boot shell与ASCII码

u-boot移植随笔:u-boot shell与ASCII码
前几天让u-boot的shell更接近“shell”,发现可以使用Ctrl-p等等来控制,心里总在想它们是怎么实现的,怎么能读取到我按下Ctrl-p的呢?今天又看了u-boot的代码,找了好久,蓦然回首,原来是在./common下面的main.c中,——我就说呢,在SI中看这个文件时候,没发现旁边下拉条那么短,聪明人一看就知道这里面有不少东西!唉,一时没注意。
看一下main.c文件中的cread_line函数(这个函数有一个while(1)死循环,遇到回车、Ctrl-c才跳出,命令补齐也在这个函数中体现),由
ichar = getcmd_getch();
获取到输入的字符,经过很复杂的处理后,终于等到回车键按下了(不按下怎么执行命令呢?对吧?),使用cread_add_to_hist保存起来——为了实现命令历史,又牵出另外的很复杂的过程。解析输入的字符就完成了,至于之后的处理,依然是很复杂的很复杂的过程。
找啊找啊,终于发现这么几行:

case CTL_CH(‘a’):

BEGINNING_OF_LINE();

break;

case CTL_CH(‘c’): /* ^C – break */

*buf = ”; /* discard input */

return (-1);

case CTL_CH(‘f’):

if (num < eol_num) {

getcmd_putch(buf[num]);

num++;

}

break;

case CTL_CH(‘b’):

if (num) {

getcmd_putch(CTL_BACKSPACE);

num–;

}

break;

case CTL_CH(‘d’):

if (num < eol_num) {

wlen = eol_num – num – 1;

if (wlen) {

memmove(&buf[num], &buf[num+1], wlen);

putnstr(buf + num, wlen);

}

getcmd_putch(‘ ‘);

do {

getcmd_putch(CTL_BACKSPACE);

} while (wlen–);

eol_num–;

}

break;

 

CTL_CH()是一个宏,从字面上理解是Ctrl加上一个字符,定义如下:
#define CTL_CH(c)  ((c) – ‘a’ + 1)
我很奇怪,怎么减去个’a’再加个1就能判断我按下Ctrl了呢?我打开VC建好工程,测试一下CTL_CH(‘b’),结果给我个笑脸,更百思不得其解。
又想到去查ASCII码表,开始找那几个基本上几乎一样,没有什么有用的信息。后来不小心看到一张内容稍微多一点,上面有一栏是“终端显示”,我一看,前面怎么排列得这么整齐?^A到^Z,难道这个就是Ctrl-A到Ctrl-Z?我猜应该是了,不然找不到其它理由了。你看,^B是2,’b’-‘a’+1就等于2啊!肯定是这个原因!
但是ASCII码前面三十几个具体是干嘛的?网上都说是控制、通信用,但没亲自捣鼓,除了“t”、“n”经常用外,其它的没印象啊。如果要追到底,估计要追究到那个久远的年代了,算了,等哪天闲得没事干了再去追吧。
以前只知道emacs能使用ctrl-p、ctrl-n,现在,u-boot的shell、linux的shell中都能使用ctrl-p、ctrl-n等等,它们的原理应该是一样的。
本文假设已经实现了u-boot shell自动补齐、命令历史等功能(就是加多两个宏),并且没有深入追究那些代码来龙去脉。
本文即兴而写,随意看看,不必当真。

下面附上一份经过山人结合网上许多资料整理出的ASCII码表格,表格整理得不美观,但应该不会影响阅读。

                        ASCII码表

Dec

Hex

Oct

Char

Terminal

    备注

Dec

Hex

Oct

Char

0

0

0

(null)

^@

64

40

100

@

1

1

1

soh

^A

文件头的开始

65

41

101

A

2

2

2

stx

^B

文本的开始

66

42

102

B

3

3

3

etx

^C

文本的结束

67

43

103

C

4

4

4

eot

^D

传输的结束

68

44

104

D

5

5

5

enq

^E

询问

69

45

105

E

6

6

6

ack

^F

确认

70

46

106

F

7

7

7

bel

^G

响铃

71

47

107

G

8

8

10

bs

^H

后退

72

48

110

H

9

9

11

ht

^I

水平跳格

73

49

111

I

10

0A

12

nl

^J

换行

74

4A

112

J

11

0B

13

vt

^K

垂直跳格

75

4B

113

K

12

0C

14

ff

^L

格式馈给

76

4C

114

L

13

0D

15

er

^M

回车

77

4D

115

M

14

0E

16

so

^N

向外移出

78

4E

116

N

15

0F

17

si

^O

向内移入

79

4F

117

O

16

10

20

dle

^P

数据传送换码

80

50

120

P

17

11

21

dc1

^Q

设备控制1

81

51

121

Q

18

12

22

dc2

^R

设备控制2

82

52

122

R

19

13

23

dc3

^S

设备控制3

83

53

123

S

20

14

24

dc4

^T

设备控制4

84

54

124

T

21

15

25

nak

^U

否定

85

55

125

U

22

16

26

syn

^V

同步空闲

86

56

126

V

23

17

27

etb

^W

传输块结束

87

57

127

W

24

18

30

can

^X

取消

88

58

130

X

25

19

31

em

^Y

媒体结束

89

59

131

Y

26

1A

32

sub

^Z

90

5A

132

Z

27

1B

33

esc

^[

退出

91

5B

133

[

28

1C

34

fs

^*

域分隔符

92

5C

134

29

1D

35

gs

^]

组分隔符

93

5D

135

]

30

1E

36

re

^^

记录分隔符

94

5E

136

^

31

1F

37

us

^_

单元分隔符

95

5F

137

_

32

20

40

sp

(Space)

空格

96

60

140

33

21

41

!

97

61

141

a

34

22

42

98

62

142

b

35

23

43

#

99

63

143

c

36

24

44

$

100

64

144

d

37

25

45

%

101

65

145

e

38

26

46

&

102

66

146

f

39

27

47

`

103

67

147

g

40

28

50

(

104

68

150

h

41

29

51

)

105

69

151

i

42

2A

52

*

106

6A

152

j

43

2B

53

+

107

6B

153

k

44

2C

54

,

108

6C

154

l

45

2D

55

-

109

6D

155

m

46

2E

56

.

110

6E

156

n

47

2F

57

/

111

6F

157

o

48

30

60

0

112

70

160

p

49

31

61

1

113

71

161

q

50

32

62

2

114

72

162

r

51

33

63

3

115

73

163

s

52

34

64

4

116

74

164

t

53

35

65

5

117

75

165

u

54

36

66

6

118

76

166

v

55

37

67

7

119

77

167

w

56

38

70

8

120

78

170

x

57

39

71

9

121

79

171

y

58

3A

72

:

122

7A

172

z

59

3B

73

;

123

7B

173

{

60

3C

74

<

124

7C

174

|

61

3D

75

=

125

7D

175

}

62

3E

76

>

126

7E

176

~

63

3F

77

?

127

7F

177

del

1、本表列出了ASCII字符集。每一个字符有它的十进制值,十六进制值,终端上的显示结果,ASCII助记名,和ASCII控制字符定义。

2、ASCII字符60—7Fh不能被存储到内存单元或数据记录文件。这些值被转变到40h – 5Fh范围内的等价大写形式。这些字符可以被存到缓冲区,并且在通讯时被发送和接收。

3、ASCII表0-1F及7F共33个字符是控制字符或通信专用字符,其余均为可显示字符。

本文固定链接: http://www.latelee.org/porting-uboot/u-boot-porting-shell-and-ascii.html

如无特别说明,迟思堂工作室文章均为原创,转载请注明: u-boot移植随笔(2):u-boot shell与ASCII码 | 迟思堂工作室

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter