|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?# s. L+ o0 m. m' _. B7 Y
" D& c3 S% |, t+ Z1 z- A#inlcude <linux/config.h>
/ j8 o. u1 n/ U( Z+ M) r, P/ }4 T.text' F" q' d" b) ?( T R+ s
.globl _keyboard_interrupt6 B* K$ ^# F6 Z) F
9 V& ~9 X. Q, W) @( t
size =1024 //键盘缓冲区的长度
" Y$ n9 Z! d3 D& t- ]- m+ ihead =4 //缓冲区开头指针字段偏移。0 E; B. \. q: K( ~
tail =8 //缓冲区尾指针字段偏移8 g! _2 M3 ]' m- ^
proc_list =12 //等待改缓冲区队列的进程字段偏移
) q; b e' K( E3 P. f5 Sbuf =16 //缓冲区字段偏移0 S7 v4 u( T8 q3 a: S1 J
/*mode是键盘特殊的按下状态标志+ i& p& E" z r; I( j `: ]
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
& t9 G7 K- V; O/ T# g位7 caps键按下:8 P8 m7 T9 l) a8 K
位6 caps键的状态(应该与LEDs中的对应标志位一样):
; m- X" @1 D: w) u位5 右alt键按下:4 [) S: [$ ?! U8 p
位4 左alt键按下:) ^9 X3 Z5 [' e5 o6 A% x2 O
位3 右ctrl键按下:
- a, d! Y# {9 {$ G6 c) O, L位2 左ctrl键按下:" A8 h& `) M. Z
位1 右shift键按下:! s( B5 g* s/ k/ S' G2 g: b
位0 左shift键按下。*/
# p2 o8 p; r) Omode: .byte 0 //caps,alt,ctrl and shift mode* I. W- v' o# D. x. H: h
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态" C, K; o9 _- N+ c" F/ Z
//位7-3 全0不用
+ K9 d, g7 e* l//位2 caps-lock/ E, ]7 A/ D# T' U
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
4 Y y! \+ f; B3 T3 w' b//位0 scroll-lock
7 }4 R$ z4 J5 L. ~1 ]" k9 uleds: .byte 2 //num-lock,caps,scroll-lock(num-lock on); @- N# _0 W9 i/ a9 h, X l$ M7 D. a
//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
; W% X5 o6 _) g# ]. r//位1 =1 收到0xe0标志
! G2 V9 K' X9 ^! t//位0 =1 收到0xe1标志
- S" I* v9 ?' m8 w e6 O+ E4 F( Qe0: .byte 0, }; s+ V' U: z, E6 b5 ]9 T
/*
; O, Z8 Q9 \+ K0 icon_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符! _: ]9 C) ]. V
*/
$ T. V% _4 ?: c' g, |: T2 U////键盘中断处理程序入口4 v `. \! X0 u5 [, c0 u
_keyboard_interrupt:
, g/ y6 j: H# O! Y7 G6 u* Q2 w pushl %eax
) u. |2 D" `- c" F( d( j pushl %ebx; R. l& W# |' j
pushl %ecx
7 T! F. S, k9 K5 @4 I8 u pushl %edx
& ]. b+ L C4 m) ^* l1 j4 |0 s pushl %ds
$ I: ^5 V. x" ? pushl %es
+ X% m0 ]2 V9 J$ z movl $0x10,%eax1 O% U' k/ c& b+ B* d* Z
mov %ax,%ds! P. w. k/ ^( u: z6 c
mov %ax,%al$ z; f V5 v( e
xorl %al,%al
$ l% d, i6 E* u! J- d inb $0x60,%al% d; {1 M# L( |, a* ?! `* {+ ?% d9 O
cmpb $0xe0,%al, B9 e5 b% H+ U# g& `
je set_e0
) ?; t5 x% u* W2 ~# x% l cmpb $0xe1,%al3 _, {; F C0 c" Y/ T/ U. \
je set_e1
- p; ?2 r! R. `1 | call key_table(,%eax,4)3 w/ g/ a# U9 _. s% H8 U. |. c( X
movb $0,e0
$ M" F% U2 }; N ......(略)
, [0 g' k2 `8 o- ~9 x4 a/ ~4 R H5 W2 z% X3 x8 N* x3 W
|
|