当前位置: 技术问答>linux和unix
linux下4*4键盘驱动的编写???
来源: 互联网 发布时间:2016-06-01
本文导语: 我想写一个4*4的键盘驱动,有以下几点困难: (1)按键按下产生中断,中断的处理过程如何? (2)驱动要实现申请中断,中断在内核的处理,我想问一下内核中的中断会涉及到寄存器的配置吗?无操作系统下的中...
我想写一个4*4的键盘驱动,有以下几点困难:
(1)按键按下产生中断,中断的处理过程如何?
(2)驱动要实现申请中断,中断在内核的处理,我想问一下内核中的中断会涉及到寄存器的配置吗?无操作系统下的中断要寄存器配置,有操作系统需要吗?需要的话在什么地方实现?
(3)按键的键值我想通过串口显示在PC上,在驱动中需要如何实现?
(4)从按下按键,到用户在PC上看到键值,整个过程调用到得函数有哪些(通过中断实现),内核中需要做哪些处理?
小弟是初学者,问题可能有点表述不是很清楚,还望见谅!!!!只希望能提供点思路,提示之类!
(1)按键按下产生中断,中断的处理过程如何?
(2)驱动要实现申请中断,中断在内核的处理,我想问一下内核中的中断会涉及到寄存器的配置吗?无操作系统下的中断要寄存器配置,有操作系统需要吗?需要的话在什么地方实现?
(3)按键的键值我想通过串口显示在PC上,在驱动中需要如何实现?
(4)从按下按键,到用户在PC上看到键值,整个过程调用到得函数有哪些(通过中断实现),内核中需要做哪些处理?
小弟是初学者,问题可能有点表述不是很清楚,还望见谅!!!!只希望能提供点思路,提示之类!
|
(1)按键按下产生中断,中断的处理过程如何?
中断的处理过程问为硬件部分和软件部分:
硬件:就是每个架构都会有个中断控制器,可以是成为芯片的一部分也可以像x86放外面,没有研究过,只要知道电路的一个
上升或者下降沿中断控制器表示产生一个中断信号
软件:这个硬件中断信号就在寄存器的一位发生变化,而linux系统是由中断总线子系统控制的
使用:linux子系统都会给整体个架构分配一系列中断号,我们只知道你的中断号调用API函数,填充你驱动的中断函数就可以了
(2)驱动要实现申请中断,中断在内核的处理,我想问一下内核中的中断会涉及到寄存器的配置吗?无操作系统下的中断要寄存器配置,有操作系统需要吗?需要的话在什么地方实现?
内核的中断需要配置寄存器,这些工作基本由中断子系统完成,一般只给你留中断号,启动和屏蔽中断的接口了,当然你有兴趣
可以研究下中断子系统,具体跟架构的datasheet有详细介绍的,一般你选择了cpu架构了,那么中断配置也给你配置好了,中断
是跟cpu关联很大的
(3)按键的键值我想通过串口显示在PC上,在驱动中需要如何实现?
如果你调用楼上说的"标准input设备"键盘接口,只要实现input接口,驱动不要做其它的实现了,
可以直接用shell命令showkey,也可以学习该命令的源码
(4)从按下按键,到用户在PC上看到键值,整个过程调用到得函数有哪些(通过中断实现),内核中需要做哪些处理?
一般是直接调用input接口,比较方便,网上有input输入子系统标准接口,你做的就是在中断收到值传给input接口就可以了
中断的处理过程问为硬件部分和软件部分:
硬件:就是每个架构都会有个中断控制器,可以是成为芯片的一部分也可以像x86放外面,没有研究过,只要知道电路的一个
上升或者下降沿中断控制器表示产生一个中断信号
软件:这个硬件中断信号就在寄存器的一位发生变化,而linux系统是由中断总线子系统控制的
使用:linux子系统都会给整体个架构分配一系列中断号,我们只知道你的中断号调用API函数,填充你驱动的中断函数就可以了
(2)驱动要实现申请中断,中断在内核的处理,我想问一下内核中的中断会涉及到寄存器的配置吗?无操作系统下的中断要寄存器配置,有操作系统需要吗?需要的话在什么地方实现?
内核的中断需要配置寄存器,这些工作基本由中断子系统完成,一般只给你留中断号,启动和屏蔽中断的接口了,当然你有兴趣
可以研究下中断子系统,具体跟架构的datasheet有详细介绍的,一般你选择了cpu架构了,那么中断配置也给你配置好了,中断
是跟cpu关联很大的
(3)按键的键值我想通过串口显示在PC上,在驱动中需要如何实现?
如果你调用楼上说的"标准input设备"键盘接口,只要实现input接口,驱动不要做其它的实现了,
可以直接用shell命令showkey,也可以学习该命令的源码
(4)从按下按键,到用户在PC上看到键值,整个过程调用到得函数有哪些(通过中断实现),内核中需要做哪些处理?
一般是直接调用input接口,比较方便,网上有input输入子系统标准接口,你做的就是在中断收到值传给input接口就可以了
|
标准input设备和普通字符设备在实现上略有区别,不过你的问题没有具体涉及。以上各问题的基本答复如下:
1> 调用request_irq()安装中断,在module_xx_init()或open()方法中都可以
2> 一般不需要,Linux的底层已经做好了中断路由配置,你只需要关心中断处理方法即可(它有别于中断处理例程)
3> 普通字符设备:open()->read(),然后打印
标准输入设备scanf(),然后打印
4> 这个和你的程序实现逻辑有关,麻烦大大地,不方便细说
1> 调用request_irq()安装中断,在module_xx_init()或open()方法中都可以
2> 一般不需要,Linux的底层已经做好了中断路由配置,你只需要关心中断处理方法即可(它有别于中断处理例程)
3> 普通字符设备:open()->read(),然后打印
标准输入设备scanf(),然后打印
4> 这个和你的程序实现逻辑有关,麻烦大大地,不方便细说
|
static irqreturn_t button_interrupt(int irq, void *dummy)
{
input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1);
input_sync(button_dev);
return IRQ_HANDLED;
}
static int __init button_init(void)
{
int error;
if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) {
printk(KERN_ERR "button.c: Can't allocate irq %dn", button_irq);
return -EBUSY;
}
button_dev = input_allocate_device();
if (!button_dev) {
printk(KERN_ERR "button.c: Not enough memoryn");
error = -ENOMEM;
goto err_free_irq;
}
button_dev->evbit[0] = BIT_MASK(EV_KEY);
button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
error = input_register_device(button_dev);
if (error) {
printk(KERN_ERR "button.c: Failed to register devicen");
goto err_free_dev;
}
return 0;
err_free_dev:
input_free_device(button_dev);
err_free_irq:
free_irq(BUTTON_IRQ, button_interrupt);
return error;
}
如上所述,你注册到哪个中断,当中断发生时操作系统自动会调用你注册的函数...
|
基本上就是楼上各位说的那些,如果更详细的可以参见《linux驱动程序设计》和 keyboard.c 源码...