EDA365电子论坛网

标题: linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌... [打印本页]

作者: beachsun    时间: 2021-6-8 13:56
标题: linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌...
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?
* K8 t% u, r, ]* s- R2 s: Z; x
) ^% r/ n8 `# f2 Y7 A3 v: ^( N#inlcude <linux/config.h>
: b: s5 R2 [9 ~" F.text4 w* H3 ~9 g. r  K0 ?* X- ]& A
.globl _keyboard_interrupt" j4 P" y6 |3 B7 J
& P5 s# ?* b# C- x% ]! t. h: g
size =1024 //键盘缓冲区的长度
8 j& J3 v4 f" `* z6 Shead =4                //缓冲区开头指针字段偏移。, A' G% c  X$ k5 N/ i  L5 [
tail =8                //缓冲区尾指针字段偏移  E8 F* w; l8 h+ V- o
proc_list =12 //等待改缓冲区队列的进程字段偏移* J' x: L" G7 F* w2 T. g* \
buf =16                //缓冲区字段偏移: p) \3 G$ A7 p' G, t" ?
/*mode是键盘特殊的按下状态标志+ i6 ^) q, c7 Y
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。0 D( X6 W8 m, S4 B7 h. A
位7 caps键按下:' v1 [  {) i/ V$ @3 K
位6 caps键的状态(应该与LEDs中的对应标志位一样):
% h% K1 \& m" E/ D" R& o位5 右alt键按下:
8 G( X/ k8 k% C  }2 I) p& T位4 左alt键按下:
+ S* ~, O) ^& |$ s) a位3 右ctrl键按下:8 n9 c* F3 \0 z/ P7 Q) o7 D! _. ]
位2 左ctrl键按下:
* M5 j5 X# p7 S8 g位1 右shift键按下:" Q9 Z% D* m; U2 b
位0 左shift键按下。*/) K& f$ ?$ J8 S
mode:        .byte 0                //caps,alt,ctrl and shift mode2 U3 [3 A+ k  Z2 D. ~* q
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态2 i  `# w1 o! w4 M
//位7-3 全0不用1 X" l2 S  N' M$ b& i
//位2 caps-lock, W6 U( [! @$ `, R% P$ `2 g
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
$ m1 f  c5 p( H, j//位0 scroll-lock% Y" X8 ^: c8 O3 w7 Q5 S1 O1 Q
leds:                .byte 2                //num-lock,caps,scroll-lock(num-lock on)
' }/ H, f  w- e( u5 I//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
8 e7 X9 `" T. p: b. @//位1 =1 收到0xe0标志9 J7 X* m8 B2 u$ i( w- ^% t' I
//位0 =1 收到0xe1标志1 X# T) l1 Q# k/ `
e0:                .byte 0
: _' x% V. o4 ~/ V( @% P5 t4 k/*
! D) J3 B- U5 J& ^1 d9 Qcon_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符  U% m0 `8 ?3 H; N" }, u! m
*/
7 j; |+ m: a: r' z5 x////键盘中断处理程序入口# L  e& i' m1 l: v
_keyboard_interrupt:
- s9 y& b' ^0 o* \                                pushl %eax
, f% ^  A( Y) Z3 S                                pushl %ebx2 s+ h! e" |( P. d9 O5 @
                                pushl %ecx" U; V" R2 d6 n/ p  A
                                pushl %edx
5 J! T3 W! ]0 K; [6 r( d( s# n5 c% v                                pushl %ds2 m2 Q- I: g. F1 c/ g% {. D: u
                                pushl %es- w2 F8 R* x; ~7 b6 J" Q: o
                                movl $0x10,%eax* x: q* h$ a- `% R+ y
                                mov %ax,%ds
- S$ u) l" q7 ^' T' U* ~                                mov %ax,%al% B+ l: O4 @) q# p
                                xorl %al,%al
* k+ j3 v* M7 v5 A% p0 }                                inb $0x60,%al  Z& I1 g* N: K( ~
                                cmpb $0xe0,%al
  f% w7 W* m! ^% ~( e2 I                                je set_e0
" ^+ \: w) ?; o1 J$ w' r( Z/ j- f                                cmpb $0xe1,%al
* D% `- ]& S" I: d$ f5 U  W( d' X                                je set_e10 N( V. p4 o& w* Z3 e: J
                                call key_table(,%eax,4)
# H! Q; L* i/ u                                movb $0,e0
' P6 h1 _, e4 `' }1 ]                                ......(略)7 w) j1 K( A% e9 {, ?
2 D/ {2 r( y! |, l% V

作者: regngfpcb    时间: 2021-6-8 15:47
程序看不懂哦
作者: yin123    时间: 2021-6-8 15:48
这一看就是C啊
作者: uperrua    时间: 2021-6-8 15:51
首先,你的这个文件名应该是linux/kernel/keyboard.S ,从.S就可以说明,它不是C语言文件 ,而应该是汇编语言,至于是什么语法,这个要看具体的CPU芯片,虽然汇编语言有许多相似的地方,但具体的芯片或公司有略微的差别,故不能简单地说是Intel x86汇编语法。另外,后缀为大S,引入c++预编译,使得汇编程序可以用预处理命令。其次 ,文件的最开始处的.text说明下面的程序或定义的变量,是可执行代码,即申明代码段(另外,一般还有.data,表示已初始化的数据段,.bss表示未初始化的数据段)。而.global指定了入口函数,其中keyboard_interrupt为入口函数的名字。9 L9 y* E7 \( i, h1 l4 H7 x! X2 c
.text    y9 \+ w* [1 i' V- V: I0 h1 d
.globl keyboard_interrupt
4 ]! ~8 G& w: L5 z- B* R& `) O5 T& v6 ~8 S7 x1 U/ B8 h
mode:   .byte 0     /* caps, alt, ctrl and shift mode */  & C+ N3 F6 H' e# K# G' K; w
leds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  
- w: u# C4 x1 `9 h% _e0: .byte 0+ w6 c4 B7 y1 S& O! _  [# l
keyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  
! H) G/ g7 ~6 [( Y    pushl %eax  - @# O" P; S; A% j( [

: I+ s7 Y" v: }( x2 ?8 ]
! I0 M6 s5 u$ ~  U9 m- r" W9 m最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。; [5 A! `8 [0 l9 e' j2 M
希望可以帮助到你!




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2