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
.text
4 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 S
head =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 mode
2 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 Q
con_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 %ebx
2 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 %ds
2 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_e1
0 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