当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请教,网上下的2410的键盘驱动程序代码编译不了
帖子发表于 : 2008-03-24 16:25 

注册: 2008-03-24 16:16
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
我从网上下了一个2410的键盘驱动程序代码,但是编译时提示找不到
#include <linux/config.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>
等头文件。后来我在/usr/src/linux-headers-2.6.22-14-generic/include/linux/里面找到了,但是发现里面的文件又包含其他文件,又说找不到。如:/usr/src/linux-headers-2.6.22-14-generic/include/linux/module.h:9:78: 错误: /usr/src/linux-headers-2.6.22-14-generic/include/linux/spinlock.h:No such file or directory


有哪一位高人指点一下,万分感谢。或者给另外一个键盘驱动程序代码给我都可以。
源代码如下:

#include <linux/config.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>



#include <linux/miscdevice.h>

#include <linux/sched.h>

#include <linux/delay.h>

#include <linux/poll.h>

#include <linux/spinlock.h>

#include <linux/irq.h>

#include <linux/delay.h>



#include <asm/hardware.h>



#define DEVICE_NAME "buttons"

#define BUTTON_MAJOR 232



static struct key_info {

int irq_no;

unsigned int gpio_port;

int key_no;

} key_info_tab[4] = {

{ IRQ_EINT1, GPIO_F1, 1 },

{ IRQ_EINT2, GPIO_F2, 2 },

{ IRQ_EINT3, GPIO_F3, 3 },

{ IRQ_EINT7, GPIO_F7, 4 },

};



static int ready = 0;

static int key_value = 0;



static DECLARE_WAIT_QUEUE_HEAD(buttons_wait);



static void buttons_irq(int irq, void *dev_id, struct pt_regs *reg)

{

struct key_info *k;

int i;

int found = 0;

int up;

int flags;

for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {

k = key_info_tab + i;

if (k->irq_no == irq) {

found = 1;

break;

}

}

if (!found) {

printk("bad irq %d in button\n", irq);

return;

}



save_flags(flags);

cli();

set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN);

up = read_gpio_bit(k->gpio_port);

set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);

restore_flags(flags);

if (up) {

key_value = k->key_no + 0x80;

} else {

key_value = k->key_no;

}

ready = 1;

wake_up_interruptible(&buttons_wait);

}



static int request_irqs(void)

{

struct key_info *k;

int i;

for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {

k = key_info_tab + i;

set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);

if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME, &buttons_irq)) {

return -1;

}



}

return 0;

}



static void free_irqs(void)

{

struct key_info *k;

int i;

for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {

k = key_info_tab + i;

free_irq(k->irq_no, buttons_irq);

}

}



static int matrix4_buttons_read(struct file * file, char * buffer, size_t count, loff_t *ppos)

{

static int key;

int flags;

int repeat;

if (!ready)

return -EAGAIN;

if (count != sizeof key_value)

return -EINVAL;

save_flags(flags);

if (key != key_value) {

key = key_value;

repeat = 0;

} else {

repeat = 1;

}

restore_flags(flags);



if (repeat) {

return -EAGAIN;

}



copy_to_user(buffer, &key, sizeof key);

ready = 0;

return sizeof key_value;

}



static unsigned int matrix4_buttons_select(

struct file *file,

struct poll_table_struct *wait)

{

if (ready)

return 1;

poll_wait(file, &buttons_wait, wait);

return 0;

}





static int matrix4_buttons_ioctl(struct inode *inode, struct file *file,

unsigned int cmd, unsigned long arg)

{

switch(cmd) {

default:

return -EINVAL;

}

}

static struct file_operations matrix4_buttons_fops = {

owner: THIS_MODULE,

ioctl: matrix4_buttons_ioctl,

poll: matrix4_buttons_select,

read: matrix4_buttons_read,

};



static devfs_handle_t devfs_handle;

static int __init matrix4_buttons_init(void)

{

int ret;



ready = 0;

ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &matrix4_buttons_fops);

if (ret < 0) {

printk(DEVICE_NAME " can't register major number\n");

return ret;

}



ret = request_irqs();

if (ret) {

unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);

printk(DEVICE_NAME " can't request irqs\n");

return ret;

}

devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,

BUTTON_MAJOR, 0, S_IFCHR │ S_IRUSR │ S_IWUSR, &matrix4_buttons_fops, NULL);



return 0;

}



static void __exit matrix4_buttons_exit(void)

{

devfs_unregister(devfs_handle);

free_irqs();

unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);

}



module_init(matrix4_buttons_init);

module_exit(matrix4_buttons_exit);

MODULE_LICENSE("GPL");


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译