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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?  x7 x; q0 G; G7 Y2 n! J1 m
# @" G( Z1 }) _# d( @' e1 Q
#inlcude <linux/config.h>6 e' h$ S! d; A7 n" B1 Q
.text
6 r4 J* G6 Q; m5 t% C2 Z0 z: J.globl _keyboard_interrupt+ r, e3 m9 i: Q* |

& B; C9 g" k. `size =1024 //键盘缓冲区的长度
, ]: D) H$ f2 w, ?$ K) Dhead =4                //缓冲区开头指针字段偏移。% m0 G$ u0 o1 b; G6 R# b7 G6 I- B
tail =8                //缓冲区尾指针字段偏移
6 `; H0 Y; T1 a9 d$ V; X; wproc_list =12 //等待改缓冲区队列的进程字段偏移$ {/ T6 e' J" O( E* B3 n" i5 K# w
buf =16                //缓冲区字段偏移
  H4 x0 V& [* X, }1 q1 j" L! }3 ~/*mode是键盘特殊的按下状态标志
; q; u+ l/ A0 c/ _, j* @表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。1 c4 g+ @; {5 ]) M6 J
位7 caps键按下:
5 D$ w3 D( \) D* t  ?5 H位6 caps键的状态(应该与LEDs中的对应标志位一样):
# z8 ]. F3 s9 l% X* e位5 右alt键按下:
2 Z2 B  w8 W1 Y2 o; v- L位4 左alt键按下:: D" Q% ]; {* E  C1 K. E
位3 右ctrl键按下:
, o2 ~$ i6 ^- {位2 左ctrl键按下:
% z% N* D- n% I5 H0 b) x位1 右shift键按下:
1 I1 K( u- R; `( w$ I! K% P位0 左shift键按下。*/+ U+ k4 J0 b- I! S7 C% n4 B6 R% k
mode:        .byte 0                //caps,alt,ctrl and shift mode
3 V+ U: @$ t  \8 E8 a8 s6 l$ P//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态$ F/ }/ l. I' R5 o3 t: V$ m
//位7-3 全0不用
+ c# C7 ~( v" z6 o1 V//位2 caps-lock6 _1 F8 u" Y* J$ I9 w
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
7 f: s7 q  l, |0 ^3 i9 s9 \0 J//位0 scroll-lock8 v' Y/ y5 [1 o6 f) A- t+ [
leds:                .byte 2                //num-lock,caps,scroll-lock(num-lock on)
. u) ^7 y, _- B0 _2 ~. _4 I& L7 k$ A//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
; d" a+ A3 T$ [/ C//位1 =1 收到0xe0标志" ?$ @- _3 r/ }. d, P9 E3 U% `5 @
//位0 =1 收到0xe1标志
6 E  |" R/ ^( te0:                .byte 0, _* v9 F% D7 E( c0 c
/*( V2 v) ]+ L. b* r% D/ i
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符
) \' J8 i8 B4 U6 y*/
; l0 Q7 J/ k8 _7 ]! }9 ~, O////键盘中断处理程序入口
! G; }  i8 y0 |0 ]_keyboard_interrupt:, N3 ]* m8 c7 O+ k% ]
                                pushl %eax
7 s7 z2 [, d# e) K* v3 S                                pushl %ebx% G- O) j! y/ g, s! |8 V# E% \* s( H
                                pushl %ecx
, V) L2 n$ Q; \, D) I. g                                pushl %edx
- u/ N; q- o" k* ]0 }$ @                                pushl %ds8 j+ c$ p6 I% t
                                pushl %es" b7 R: t1 I% ^( m' g3 z5 Q
                                movl $0x10,%eax
# R& ]' q) v$ j7 v1 Y  V) C                                mov %ax,%ds8 X9 H( |' d" n, d
                                mov %ax,%al/ X2 a: m$ f7 o6 t; l8 s7 s0 O
                                xorl %al,%al
) b1 E' m) w/ t8 q( C9 n7 H9 `; }                                inb $0x60,%al
4 U9 l! V4 C( f- b. g  K+ U- x                                cmpb $0xe0,%al+ ]( z1 d0 Z6 \
                                je set_e0' J" p4 M( B" t& `# P
                                cmpb $0xe1,%al
/ l7 K  o' H  o. U                                je set_e1; T8 Q) ~3 J, T0 x$ Y5 Y
                                call key_table(,%eax,4)
; O6 x/ O  G: M! d2 S                                movb $0,e06 Z* F* W0 ?( ~, c/ L
                                ......(略)
( C3 f# S( ]/ Q# C* ?. w5 h
  U  K. K+ Z# {

该用户从未签到

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; h0 t$ E4 Z1 f
    .text  6 P. r. m. A% R9 N% y
    .globl keyboard_interrupt
    % b5 p4 @7 \' Y  s" U. N7 b3 L7 ^8 A0 T5 g0 s. X. [5 Y
    mode:   .byte 0     /* caps, alt, ctrl and shift mode */  
    6 E! F; ~5 A1 U6 p) ]4 E+ Hleds:   .byte 2     /* num-lock, caps, scroll-lock mode (nom-lock on) */  
    6 r- |, [" S! r4 ]+ Ie0: .byte 0- g/ H/ i! y; i  t
    keyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/  
    ' j* ?, w! C0 m, Z8 f) E8 o    pushl %eax  
    ( `9 X# I, d  S- O+ m# D
    & f' o! Y$ T% q7 _7 Y# D. z7 i( w/ ?- c9 P1 F$ u: i6 r
    最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。
    : H* _% u  s8 V3 C" c2 }3 A希望可以帮助到你!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-23 13:54 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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