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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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 n3 R7 n  i9 D& b4 Z6 @& J
    .text  / \. w' l! N3 B, x/ D/ o
    .globl keyboard_interrupt
    % Z9 t9 ~0 ]1 L: k; I% h
    8 e' j0 v& _6 B2 M7 Kmode:   .byte 0     /* caps, alt, ctrl and shift mode */  $ m8 M" [) B8 o  X( Z
    leds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  ; J! f, [; S7 y4 c0 b
    e0: .byte 0
    & P; ^( M5 `; m; `2 T7 B( s! pkeyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  
    $ P/ ]+ ?# }5 D5 k. G; g1 Q( D    pushl %eax  
    ' k$ y1 K0 S7 A: @$ z7 v
      H7 x% c% O8 Q4 Q0 n6 b
    . Z! w  q; E# I# i1 Q最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。# ?1 i4 \, Y& S- j* `
    希望可以帮助到你!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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