找回密码
 注册
关于网站域名变更的通知
查看: 672|回复: 3
打印 上一主题 下一主题

linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌...

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-8 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?
0 ^  l9 f" Q9 |  n( ?4 K( i+ F5 Q0 X" z: _- b
#inlcude <linux/config.h>
+ d: A: ?( F. {.text5 R. b/ o1 N2 P+ H9 a6 S
.globl _keyboard_interrupt. T, A+ e$ n2 M/ t5 c  S
% C7 \" ^) r* v( {/ T
size =1024 //键盘缓冲区的长度( p; Y, c  q$ h0 A- U; H
head =4                //缓冲区开头指针字段偏移。
9 f2 n6 T% a  H! Y2 @( E9 e) stail =8                //缓冲区尾指针字段偏移
' J7 v$ k% G  aproc_list =12 //等待改缓冲区队列的进程字段偏移
2 m' n8 Z8 Y7 g9 t; J7 G" Fbuf =16                //缓冲区字段偏移
# I7 i: f3 g( q" M; a4 w/*mode是键盘特殊的按下状态标志  a+ ^$ A% D) y" J$ V2 B; v# X
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
7 e" E6 J1 O# |+ v  d3 [- A2 N位7 caps键按下:
( w- x2 z+ Q, n1 Y位6 caps键的状态(应该与LEDs中的对应标志位一样):
: E% {6 T! t5 w# X# q( F位5 右alt键按下:
6 k; Z" U9 K" ]+ W/ `  _! F位4 左alt键按下:$ N# N2 Z& }8 ~8 K! n
位3 右ctrl键按下:1 \; ?- r$ T+ O$ s, G& L/ {. _
位2 左ctrl键按下:
5 H0 s4 w- N8 _- R) \5 q: ]位1 右shift键按下:
* b. X& y6 s8 D/ Q) F) C位0 左shift键按下。*/
$ r1 n/ T6 A$ g0 Pmode:        .byte 0                //caps,alt,ctrl and shift mode
( c9 p! i% L0 k6 P: {//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态
: S' b+ L, h  ~//位7-3 全0不用' P2 m6 O) u6 g7 \& A3 O
//位2 caps-lock
6 F% E' G% |8 K9 f//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
) R: T! ]5 l# S) @' ?3 \//位0 scroll-lock2 [, A) L4 A- Z
leds:                .byte 2                //num-lock,caps,scroll-lock(num-lock on)# g6 w$ [, V5 d+ [
//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
# y7 ?& f8 ?8 Y/ N//位1 =1 收到0xe0标志6 Y9 c, a! K6 w# q# y! |
//位0 =1 收到0xe1标志% g5 K, C4 ?9 k8 |7 S
e0:                .byte 0
& d& W+ U9 B/ S/*& b8 \# G/ o0 P+ A! \
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符7 s$ m' ?3 X1 z
*/2 U7 A& G) E4 X2 B
////键盘中断处理程序入口2 H3 v% Y3 ^3 I2 U* d3 Y( I3 @
_keyboard_interrupt:
7 _3 Y' S5 w* _                                pushl %eax; D2 }8 z+ D" K- D
                                pushl %ebx9 q4 ~& [  U7 V9 E8 m8 Z0 z
                                pushl %ecx0 x! k$ o0 M7 o. H& q
                                pushl %edx
9 f# J9 T+ x: z, d                                pushl %ds4 T- `5 q2 N3 C& c: w# A- ~
                                pushl %es5 m% z. [7 q  k9 w; g6 H
                                movl $0x10,%eax% Q& q: B' ]- {1 @
                                mov %ax,%ds
8 E2 e0 F+ m1 @% r; I                                mov %ax,%al: a6 G8 k8 g9 U- i7 P4 C
                                xorl %al,%al
3 F- t4 n$ F: S                                inb $0x60,%al
. R! Z+ N+ `' M' k4 J) d                                cmpb $0xe0,%al, I; N" X& o- w, b& r
                                je set_e0. p. c4 s' c- ?
                                cmpb $0xe1,%al
5 ?2 g$ P4 k8 v9 G; k" p/ r% b                                je set_e1' i' K. J' h6 S- C; T
                                call key_table(,%eax,4)" a- d( r( I+ Y1 B3 v6 ]" e
                                movb $0,e0
" l* B/ p/ ]1 _* D                                ......(略)* R( Y  [' X1 w. ^- ~) W3 \

% U5 R1 S" w" h0 M! q: x6 C& b' Z- x/ M

该用户从未签到

2#
发表于 2021-6-8 15:47 | 只看该作者
程序看不懂哦
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-6-8 15:48 | 只看该作者
    这一看就是C啊

    该用户从未签到

    4#
    发表于 2021-6-8 15:51 | 只看该作者
    首先,你的这个文件名应该是linux/kernel/keyboard.S ,从.S就可以说明,它不是C语言文件 ,而应该是汇编语言,至于是什么语法,这个要看具体的CPU芯片,虽然汇编语言有许多相似的地方,但具体的芯片或公司有略微的差别,故不能简单地说是Intel x86汇编语法。另外,后缀为大S,引入c++预编译,使得汇编程序可以用预处理命令。其次 ,文件的最开始处的.text说明下面的程序或定义的变量,是可执行代码,即申明代码段(另外,一般还有.data,表示已初始化的数据段,.bss表示未初始化的数据段)。而.global指定了入口函数,其中keyboard_interrupt为入口函数的名字。
    3 ^% [* Q) @3 S/ s4 f.text  
    7 ], }  H* N8 E1 c# x3 G4 F4 R.globl keyboard_interrupt9 B) F$ v8 `3 n5 }7 U

    ; X# l1 h3 G5 I$ @mode:   .byte 0     /* caps, alt, ctrl and shift mode */  
    2 h; p* ?* X) Fleds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  * o  R$ J+ ?" ?# G
    e0: .byte 0  U# s9 Z4 U) m' v
    keyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  6 O3 A5 R- J/ o5 d
        pushl %eax  ( Z1 U, v3 ~8 F2 o# [. ]" Q

    " m& @6 c% [4 [
    0 w- [+ F' l+ R2 `4 y0 ^最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。
    5 B! a/ E/ l) C1 @: \# o希望可以帮助到你!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 08:21 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表