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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?
# H; ~4 j/ I. m* V9 t4 F& u0 ]7 n- _9 G. j
#inlcude <linux/config.h>; J4 I* o. V' i0 Z2 P* g! L
.text
5 k4 q& W2 f8 J1 L9 e* n5 l- c.globl _keyboard_interrupt
+ E3 x- j9 N# L/ \. X1 y2 b! g+ z, D, Z  m
size =1024 //键盘缓冲区的长度
, W( ~9 W" X+ U$ u& a, [' u% c, Whead =4                //缓冲区开头指针字段偏移。9 W8 A/ a: L4 o" W  Z1 [
tail =8                //缓冲区尾指针字段偏移
0 X4 B) o  t6 a- \$ e% L* ~proc_list =12 //等待改缓冲区队列的进程字段偏移% F8 I- j* J' I- A1 z1 l
buf =16                //缓冲区字段偏移6 s7 T1 B* u7 F9 u0 }, |
/*mode是键盘特殊的按下状态标志
+ D& B. f6 K  b5 p' T5 \9 u) U表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。0 V0 v6 Z/ r7 z6 v
位7 caps键按下:
- I  l- j7 o8 l) S  e6 E位6 caps键的状态(应该与LEDs中的对应标志位一样):2 m5 ~8 q; B7 i5 @3 k
位5 右alt键按下:1 L2 B2 {5 @3 |6 ]0 Y
位4 左alt键按下:3 X: Q$ y1 @8 J# d" v
位3 右ctrl键按下:/ u9 X3 Z( d) @7 A5 \. t: x
位2 左ctrl键按下:
* k3 S  g1 H& O* {0 f% \1 Q位1 右shift键按下:, P8 V+ M+ K# j; Z; }9 b
位0 左shift键按下。*/
* G7 ?1 N/ O- ?: A- K- w9 @$ Xmode:        .byte 0                //caps,alt,ctrl and shift mode% P5 m* @( o( S" I, s
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态6 h7 V8 x) j5 Y  J
//位7-3 全0不用; K  c/ q5 W% A# ?6 c) s
//位2 caps-lock
) {8 a$ o9 {. ?8 B4 c//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
4 y+ @( i6 K5 i7 k/ K0 z8 y5 k//位0 scroll-lock1 N; g* M3 H: @/ V$ _3 s
leds:                .byte 2                //num-lock,caps,scroll-lock(num-lock on)
% x" b* D  z! L  I//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码1 ~* o7 Y- p+ l
//位1 =1 收到0xe0标志* ^/ Y1 l% R% e3 {8 O4 O" ?
//位0 =1 收到0xe1标志
& I  T% ?* y1 ~/ Z% W) ie0:                .byte 0
0 K* c8 H7 @3 p5 X+ G/ h/*
8 g7 U( t0 |0 t% h7 \3 @con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符% c/ B8 N% v. K" [' O6 ^( Q
*/
% S$ Z) X( a  s9 a5 \2 n+ @2 G////键盘中断处理程序入口5 Z8 B$ u8 D* F" l7 r2 t
_keyboard_interrupt:
* U* V4 ^- d! F" d5 c                                pushl %eax  E% y' Z$ W' ?# s: c$ [
                                pushl %ebx# E9 N2 n! ^' C
                                pushl %ecx  B* o; d5 @& {" g4 c
                                pushl %edx
4 \. @% o3 ~( n3 |" n% B& T                                pushl %ds' `7 W& h+ @0 U! |' K
                                pushl %es! u- S% P8 y! D/ L  G4 e3 V5 ?% a4 l
                                movl $0x10,%eax' s0 _# ~; D5 k+ r
                                mov %ax,%ds
( _  }$ B1 q3 }  j% Z  x                                mov %ax,%al! o0 e8 z0 J; E3 t' w' r$ c6 c
                                xorl %al,%al2 x; O; u$ O( M. h5 |/ R7 N2 c
                                inb $0x60,%al# ~4 R4 j* ]5 G- U% E$ ~) }
                                cmpb $0xe0,%al
" {6 d2 N3 `9 E: U( G                                je set_e08 G6 y  n* c  g3 c# c$ d5 r, N
                                cmpb $0xe1,%al/ \7 U' v3 z: ~' i; `6 L1 w6 `
                                je set_e11 |& P/ ^. r5 I3 D/ s
                                call key_table(,%eax,4)& p3 `$ R/ J. i2 i& L# X0 E
                                movb $0,e0+ ~) L% Z0 \# c/ b' ?" b& Z* [
                                ......(略)
) `. ~8 g; b! B5 S4 V. G; ~% d8 |$ b/ T; Q0 G) J  w# x. Y) ^  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为入口函数的名字。/ C  E) I; w/ g, m
    .text  8 ?8 y1 p4 P$ x: `
    .globl keyboard_interrupt
    * T0 Z7 d: \, v5 a# w" o) K) H: \# W( {# t; [9 x& R
    mode:   .byte 0     /* caps, alt, ctrl and shift mode */  
    1 f4 O2 p" \3 C0 \) V5 Tleds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  
    % v/ i" C) @" k, C& ]e0: .byte 0
    $ }1 l* z  Y8 r- w& g+ n9 q( akeyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  
    - T0 A1 a4 n8 }    pushl %eax  8 H: M8 v8 f! I# j+ h' C' M

    . s$ C" k7 x* }7 T' i  j4 Z0 w0 g! W1 l8 @& x
    最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。+ ]& o/ G  A8 q) ]/ E
    希望可以帮助到你!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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