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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?# s. L+ o0 m. m' _. B7 Y

" D& c3 S% |, t+ Z1 z- A#inlcude <linux/config.h>
/ j8 o. u1 n/ U( Z+ M) r, P/ }4 T.text' F" q' d" b) ?( T  R+ s
.globl _keyboard_interrupt6 B* K$ ^# F6 Z) F
9 V& ~9 X. Q, W) @( t
size =1024 //键盘缓冲区的长度
" Y$ n9 Z! d3 D& t- ]- m+ ihead =4                //缓冲区开头指针字段偏移。0 E; B. \. q: K( ~
tail =8                //缓冲区尾指针字段偏移8 g! _2 M3 ]' m- ^
proc_list =12 //等待改缓冲区队列的进程字段偏移
) q; b  e' K( E3 P. f5 Sbuf =16                //缓冲区字段偏移0 S7 v4 u( T8 q3 a: S1 J
/*mode是键盘特殊的按下状态标志+ i& p& E" z  r; I( j  `: ]
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
& t9 G7 K- V; O/ T# g位7 caps键按下:8 P8 m7 T9 l) a8 K
位6 caps键的状态(应该与LEDs中的对应标志位一样):
; m- X" @1 D: w) u位5 右alt键按下:4 [) S: [$ ?! U8 p
位4 左alt键按下:) ^9 X3 Z5 [' e5 o6 A% x2 O
位3 右ctrl键按下:
- a, d! Y# {9 {$ G6 c) O, L位2 左ctrl键按下:" A8 h& `) M. Z
位1 右shift键按下:! s( B5 g* s/ k/ S' G2 g: b
位0 左shift键按下。*/
# p2 o8 p; r) Omode:        .byte 0                //caps,alt,ctrl and shift mode* I. W- v' o# D. x. H: h
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态" C, K; o9 _- N+ c" F/ Z
//位7-3 全0不用
+ K9 d, g7 e* l//位2 caps-lock/ E, ]7 A/ D# T' U
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
4 Y  y! \+ f; B3 T3 w' b//位0 scroll-lock
7 }4 R$ z4 J5 L. ~1 ]" k9 uleds:                .byte 2                //num-lock,caps,scroll-lock(num-lock on); @- N# _0 W9 i/ a9 h, X  l$ M7 D. a
//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
; W% X5 o6 _) g# ]. r//位1 =1 收到0xe0标志
! G2 V9 K' X9 ^! t//位0 =1 收到0xe1标志
- S" I* v9 ?' m8 w  e6 O+ E4 F( Qe0:                .byte 0, }; s+ V' U: z, E6 b5 ]9 T
/*
; O, Z8 Q9 \+ K0 icon_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符! _: ]9 C) ]. V
*/
$ T. V% _4 ?: c' g, |: T2 U////键盘中断处理程序入口4 v  `. \! X0 u5 [, c0 u
_keyboard_interrupt:
, g/ y6 j: H# O! Y7 G6 u* Q2 w                                pushl %eax
) u. |2 D" `- c" F( d( j                                pushl %ebx; R. l& W# |' j
                                pushl %ecx
7 T! F. S, k9 K5 @4 I8 u                                pushl %edx
& ]. b+ L  C4 m) ^* l1 j4 |0 s                                pushl %ds
$ I: ^5 V. x" ?                                pushl %es
+ X% m0 ]2 V9 J$ z                                movl $0x10,%eax1 O% U' k/ c& b+ B* d* Z
                                mov %ax,%ds! P. w. k/ ^( u: z6 c
                                mov %ax,%al$ z; f  V5 v( e
                                xorl %al,%al
$ l% d, i6 E* u! J- d                                inb $0x60,%al% d; {1 M# L( |, a* ?! `* {+ ?% d9 O
                                cmpb $0xe0,%al, B9 e5 b% H+ U# g& `
                                je set_e0
) ?; t5 x% u* W2 ~# x% l                                cmpb $0xe1,%al3 _, {; F  C0 c" Y/ T/ U. \
                                je set_e1
- p; ?2 r! R. `1 |                                call key_table(,%eax,4)3 w/ g/ a# U9 _. s% H8 U. |. c( X
                                movb $0,e0
$ M" F% U2 }; N                                ......(略)
, [0 g' k2 `8 o- ~9 x4 a/ ~4 R  H5 W2 z% X3 x8 N* x3 W

该用户从未签到

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为入口函数的名字。
    , h4 ^2 S: c7 ~) f, P5 h.text  ( Q7 o7 o# H) g+ M: \" s
    .globl keyboard_interrupt
    1 t, @  g% l3 w; W  k
    0 u9 m5 ]6 U7 P+ U$ Q& c5 B; Umode:   .byte 0     /* caps, alt, ctrl and shift mode */  
    : A3 N; P- H' I3 K, C# Lleds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  
    / D. z; R" T- U, W2 ?: H6 Oe0: .byte 0  G8 O$ a0 b* A, O: T
    keyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  4 U" D! ?. o3 R; W. J  B% X: r
        pushl %eax  " n- \" {$ N5 B4 }

    6 O$ z) P, D+ k% W" N8 L" L, d7 H+ H- W
    最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。/ K  m7 N& `7 @* H
    希望可以帮助到你!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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