LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 858|回复: 2

驱动程序的问题,大家帮忙,感谢ing

[复制链接]
发表于 2005-12-21 23:28:49 | 显示全部楼层 |阅读模式
从书上照搬的一个驱动程序,编译出现你多错误,请大家帮忙看看:程序在下面
In file included from /usr/include/linux/sched.h:14,
                 from demo_drv.c:5:
/usr/include/linux/timex.h:173: field `time' has incomplete type
In file included from /usr/include/linux/bitops.h:69,
                 from /usr/include/asm/system.h:7,
                 from /usr/include/linux/sched.h:16,
                 from demo_drv.c:5:
/usr/include/asm/bitops.h:327:2: warning: #warning This includefile is not available on all architectures.
/usr/include/asm/bitops.h:328:2: warning: #warning Using kernel headers in userspace: atomicity not guaranteed
In file included from /usr/include/linux/signal.h:4,
                 from /usr/include/linux/sched.h:25,
                 from demo_drv.c:5:
/usr/include/asm/signal.h:107: parse error before "sigset_t"
/usr/include/asm/signal.h:110: parse error before '}' token
In file included from /usr/include/linux/sched.h:81,
                 from demo_drv.c:5:
/usr/include/linux/timer.h:32: field `vec' has incomplete type
/usr/include/linux/timer.h:37: field `vec' has incomplete type
/usr/include/linux/timer.h:45: parse error before "spinlock_t"
/usr/include/linux/timer.h:53: parse error before '}' token
/usr/include/linux/timer.h:63: field `list' has incomplete type
/usr/include/linux/timer.h:67: parse error before "tvec_base_t"
/usr/include/linux/timer.h:101: parse error before "tvec_bases"
/usr/include/linux/timer.h: In function `init_timer':
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:105: dereferencing pointer to incomplete type
/usr/include/linux/timer.h:106: dereferencing pointer to incomplete type
/usr/include/linux/timer.h: In function `timer_pending':
/usr/include/linux/timer.h:121: dereferencing pointer to incomplete type
demo_drv.c: At top level:
demo_drv.c:12: warning: `struct file' declared inside parameter list
demo_drv.c:12: warning: its scope is only this definition or declaration, which is probably not what you want
demo_drv.c:12: warning: `struct inode' declared inside parameter list
demo_drv.c:13: warning: `struct file' declared inside parameter list
demo_drv.c:13: warning: `struct inode' declared inside parameter list
demo_drv.c:15: warning: `struct file' declared inside parameter list
demo_drv.c:15: warning: `struct inode' declared inside parameter list
不明白这么会有这么多错误!!
程序如下:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/sched.h>

#define DEMO_MAJOR 125
#define COMMAND1 1
#define COMMAND2 2

static int demo_init(void);
static int demo_open(struct inode *inode, struct file *file);
static int demo_close(struct inode *inode ,struct file *file);
//static ssize_t demo_read(struct file *file,char *buf ,size_t count,loff_t *offset);
static int demo_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
static void demo_cleanup(void);

int demo_param=9;
static int demo_initialized=0;
static volatile int demo_flag=0;
static struct file_operations demo_fops=
  {
#if LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0)
    owner:THIS_MODULE,
#endif
    llseek:NULL,
    read:NULL,
    write:NULL,
    ioctl:demo_ioctl,
    open:demo_opon,
    release:demo_close
  };

static int demo_init(void)
{
  int i;
  if(demo_initialized==1)
    return 0;
  i=register_chrdev(DEMO_MAJOR,"demo_drv",&demo_fops);
  if(i<0)
  {  printk(KERN_CRIT"DEMO:i=%d\n",i);
  return -EIO;
  }
  printf(KERN_CRIT"DEMO:demo_drv registerred sucessfully\n");
  return 0;
  

}

static int demo_open(static inode *inode,struct file *file)
{
  if(demo_flag==1) return -1;
  printk(KERN_CRIT"DEMO,demo opoen\n");
  MOD_INC_USE_COUNT;
  demo_flag=1;
  return 0;
  
}

static int demo_close(struct inode *inode,struct file *file)
{
  if(demo_flag==0)
    return 0;
  printk(KERN_CRIT"DEMO,demo close\n");
  MOD_DEC_USE_COUNT;
  demo_flag==0;
  return 0;
  
}

static int demo_ioctl(struct inode *inode ,struct file *file,unsigned int cmd,unsigned long arg)
{
  if(cmd==COMMAND1)
    { printk(KERN_INFO"DEMO,demo command 1\n");
    return 0;
   
    }

  if(cmd==COMMAND2)
    { printk(KERN_INFO"DEMO,demo command2 \n");
    return 0;
   
    }

printk(KERN_INFO"DEMO,demo set command wrong\n");
    return 0;
   
  

}


static void demo_cleanup(void)
{

  if(demo_initialized==1)
    {
      unregister_chrdev(DEMO_MAJOR,"demo_drv");
      demo_initialized=0;
       printk(KERN_INFO"DEMO,demo clean up\n");


    }
  return;
  
}

#ifdef MODULE
MODULE_AUTHOR("DAPART 981");
MODULE_DESCRIPTION("DEMO DRIVER");
MODULE_PARM(demo_param,"i");
MODULE_PARM_DESC(demo_param,"parameter sent to driver");
int init_module(void)
{return demo_init();

}
void cleanup_module(void)
{
  demo_cleanup();
  
}
#endif




刚开始学驱动,编译这么这么多错误啊~~~
下面是makefile文件

INCLUDE = /usr/linux/include
EXTRA_CFLAGS = -D_KERNEL_ -DMODULE -I $(INCLUDE) -O2 -Wall
all:demo.o test
demo.o:demo_drv.c
        gcc $(CFLAGS) &(EXTRA_CFLAGS) -c demo_drv.c -o demo.o
test:test.c
        gcc -g test.c -o test
clean:
        rm -rf demo.o
        rm -rf test
发表于 2005-12-23 17:59:26 | 显示全部楼层
Post by littlefrog_nuaa

INCLUDE = /usr/linux/include


这句有问题,这是c库的头文件目录,应该使用源代码的头文件目录,比如类似于/usr/src/linux/include

btw: 这个问题搜索一下论坛,肯定能搜到的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-25 10:23:00 | 显示全部楼层
非常感谢,我再试试:)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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