|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?
* ~1 L7 E7 v- X( t, @& b6 N9 o# Q4 _8 A/ L
#inlcude <linux/config.h>5 ?+ ?' Y0 d* E7 g5 z
.text
, h( N# A- r' W: e" c8 a.globl _keyboard_interrupt
1 J, Q4 I, z O% G! g; e
# k( X N* V$ u0 |; n* Fsize =1024 //键盘缓冲区的长度
. l0 ?% u9 G4 F; }" ~head =4 //缓冲区开头指针字段偏移。
% g1 f) g; X6 U' _+ Z& {) o: k; Ctail =8 //缓冲区尾指针字段偏移' S2 f4 n# B% ~ D
proc_list =12 //等待改缓冲区队列的进程字段偏移
3 G/ y0 ]- K `, t2 Lbuf =16 //缓冲区字段偏移
( ^& O' i0 P* @5 S) Q r8 S/*mode是键盘特殊的按下状态标志6 C7 I) V' E F8 t
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
# l' I1 k5 g* N' n" t0 F位7 caps键按下:
/ ?1 `8 p! P' E/ R: C位6 caps键的状态(应该与LEDs中的对应标志位一样):
7 F! s& ]# s0 X3 G# [) [7 s( q1 [! e位5 右alt键按下:; O* s, X. K4 n3 Z9 m( Y
位4 左alt键按下:
; O+ @ w5 f1 s3 b. L! ^位3 右ctrl键按下:
+ ~' c: b: S+ B6 _: e( R1 e9 e. q4 D位2 左ctrl键按下:, p3 R3 N- F, \5 @/ ^
位1 右shift键按下:
6 H' [9 |; S5 U' _( c$ T2 b3 ^+ r" M; q位0 左shift键按下。*/
1 M6 t* U2 [1 [, D; jmode: .byte 0 //caps,alt,ctrl and shift mode' b! q/ o5 I* B2 h+ w
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态 Y7 H/ h/ {0 ~
//位7-3 全0不用
6 ?) `3 @5 {6 l& v5 X, a//位2 caps-lock
( {- ^8 V; M3 }. E: v& E: {( n* {//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on)); \, \+ m7 v; w: i/ |
//位0 scroll-lock& k+ y8 L% N3 X' o. x7 H7 n
leds: .byte 2 //num-lock,caps,scroll-lock(num-lock on)
6 g/ u% `4 L& a- W//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
- ^0 @( o9 b) G+ z0 @5 j8 c//位1 =1 收到0xe0标志8 a6 P7 o, N6 K( ]0 G! d' e
//位0 =1 收到0xe1标志
$ O* v. }1 l- G8 n1 a2 u4 B, ke0: .byte 07 L3 I# t! N" G% c
/*( W) [4 }/ Y6 ^0 P- l
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符
; @ J1 t% t Q" c( K( u! s) n) t*/+ M) Y5 ?" A* E. p5 p
////键盘中断处理程序入口
/ S+ i5 H, y4 J0 }8 s# Q_keyboard_interrupt:+ Z, C3 B* ^+ J8 H" [
pushl %eax* d* Y' }, o6 U, J- d0 N
pushl %ebx+ q% u2 G, j0 N; e( s- Q9 s4 t- s
pushl %ecx
3 X. c" y6 Y/ V3 z pushl %edx' I, y3 Z, s [+ G5 a# z# G
pushl %ds6 z) K4 V2 o0 u1 T* r: B. K) m
pushl %es8 ~9 T, c, Y7 [1 x/ U+ t8 o! D
movl $0x10,%eax0 A: [: \* h$ R1 d
mov %ax,%ds. G8 ~5 g# T. B6 v" n. e
mov %ax,%al! Y7 Z3 {& K! @/ e& ~+ q
xorl %al,%al" q: j- e8 |# }; I2 U
inb $0x60,%al( w8 O/ n# `0 L" u
cmpb $0xe0,%al
' f3 g8 v. X& L/ Q' ~. r# e je set_e0
* ^* [! j6 p; y X5 m7 H cmpb $0xe1,%al
9 G% g) P# \( U: A je set_e1
1 J: y/ L' b& o; h% B* }- ^ call key_table(,%eax,4)
0 y$ X- A* B0 c* S* | movb $0,e0
# u: Y) ^/ N+ F) O ......(略)
4 s3 g5 ~6 r2 w6 U% l: c" f9 t! n, A( t: s& k" k
|
|