|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法? x7 x; q0 G; G7 Y2 n! J1 m
# @" G( Z1 }) _# d( @' e1 Q
#inlcude <linux/config.h>6 e' h$ S! d; A7 n" B1 Q
.text
6 r4 J* G6 Q; m5 t% C2 Z0 z: J.globl _keyboard_interrupt+ r, e3 m9 i: Q* |
& B; C9 g" k. `size =1024 //键盘缓冲区的长度
, ]: D) H$ f2 w, ?$ K) Dhead =4 //缓冲区开头指针字段偏移。% m0 G$ u0 o1 b; G6 R# b7 G6 I- B
tail =8 //缓冲区尾指针字段偏移
6 `; H0 Y; T1 a9 d$ V; X; wproc_list =12 //等待改缓冲区队列的进程字段偏移$ {/ T6 e' J" O( E* B3 n" i5 K# w
buf =16 //缓冲区字段偏移
H4 x0 V& [* X, }1 q1 j" L! }3 ~/*mode是键盘特殊的按下状态标志
; q; u+ l/ A0 c/ _, j* @表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。1 c4 g+ @; {5 ]) M6 J
位7 caps键按下:
5 D$ w3 D( \) D* t ?5 H位6 caps键的状态(应该与LEDs中的对应标志位一样):
# z8 ]. F3 s9 l% X* e位5 右alt键按下:
2 Z2 B w8 W1 Y2 o; v- L位4 左alt键按下:: D" Q% ]; {* E C1 K. E
位3 右ctrl键按下:
, o2 ~$ i6 ^- {位2 左ctrl键按下:
% z% N* D- n% I5 H0 b) x位1 右shift键按下:
1 I1 K( u- R; `( w$ I! K% P位0 左shift键按下。*/+ U+ k4 J0 b- I! S7 C% n4 B6 R% k
mode: .byte 0 //caps,alt,ctrl and shift mode
3 V+ U: @$ t \8 E8 a8 s6 l$ P//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态$ F/ }/ l. I' R5 o3 t: V$ m
//位7-3 全0不用
+ c# C7 ~( v" z6 o1 V//位2 caps-lock6 _1 F8 u" Y* J$ I9 w
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
7 f: s7 q l, |0 ^3 i9 s9 \0 J//位0 scroll-lock8 v' Y/ y5 [1 o6 f) A- t+ [
leds: .byte 2 //num-lock,caps,scroll-lock(num-lock on)
. u) ^7 y, _- B0 _2 ~. _4 I& L7 k$ A//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
; d" a+ A3 T$ [/ C//位1 =1 收到0xe0标志" ?$ @- _3 r/ }. d, P9 E3 U% `5 @
//位0 =1 收到0xe1标志
6 E |" R/ ^( te0: .byte 0, _* v9 F% D7 E( c0 c
/*( V2 v) ]+ L. b* r% D/ i
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符
) \' J8 i8 B4 U6 y*/
; l0 Q7 J/ k8 _7 ]! }9 ~, O////键盘中断处理程序入口
! G; } i8 y0 |0 ]_keyboard_interrupt:, N3 ]* m8 c7 O+ k% ]
pushl %eax
7 s7 z2 [, d# e) K* v3 S pushl %ebx% G- O) j! y/ g, s! |8 V# E% \* s( H
pushl %ecx
, V) L2 n$ Q; \, D) I. g pushl %edx
- u/ N; q- o" k* ]0 }$ @ pushl %ds8 j+ c$ p6 I% t
pushl %es" b7 R: t1 I% ^( m' g3 z5 Q
movl $0x10,%eax
# R& ]' q) v$ j7 v1 Y V) C mov %ax,%ds8 X9 H( |' d" n, d
mov %ax,%al/ X2 a: m$ f7 o6 t; l8 s7 s0 O
xorl %al,%al
) b1 E' m) w/ t8 q( C9 n7 H9 `; } inb $0x60,%al
4 U9 l! V4 C( f- b. g K+ U- x cmpb $0xe0,%al+ ]( z1 d0 Z6 \
je set_e0' J" p4 M( B" t& `# P
cmpb $0xe1,%al
/ l7 K o' H o. U je set_e1; T8 Q) ~3 J, T0 x$ Y5 Y
call key_table(,%eax,4)
; O6 x/ O G: M! d2 S movb $0,e06 Z* F* W0 ?( ~, c/ L
......(略)
( C3 f# S( ]/ Q# C* ?. w5 h
U K. K+ Z# { |
|