QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1058|回复: 4

建立一个字符设备的问题

[复制链接]
发表于 2003-12-2 14:07:21 | 显示全部楼层 |阅读模式
我看lkm后,我就按照上面提供的代码写了一个关于建立字符设备的驱动但是老是编译不了,请教高手解答

本帖子中包含更多资源

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

×
发表于 2003-12-2 15:25:25 | 显示全部楼层
建议你好好看看源代码中的..char/nvram.c,看完之后你就知道你错在那儿了!!!!
回复

使用道具 举报

 楼主| 发表于 2003-12-2 17:06:48 | 显示全部楼层
详细路径
回复

使用道具 举报

发表于 2003-12-3 09:21:59 | 显示全部楼层
在linux系统中,位于/usr/src/linux/drivers/char/nvram.c处;
在单独的linux源码中,位于linux-2.*\drivers\char中。
回复

使用道具 举报

发表于 2003-12-6 17:32:26 | 显示全部楼层

我从一个小日本网站下的可用例子


我从一个小日本网站下的例子,在RH9下可用(I tried it), u tyr it

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include &lt;stdio.h&gt;
#define CASE1 1
#define CASE2 2

main() {
  int fd, len, wlen;
  char string[132];
  int data, rdata;

  strcpy(string, "that is a pen pen.");
  fd = open("/dev/drv1", O_RDWR);
  if( fd == -1) {
    printf("open error...\n");
    exit(0);
  }
  wlen = strlen(string);
  len = write(fd, string, wlen);
  if( len == -1 ) {
    printf("write error...\n");
    exit(1);
  }
  len = read(fd, string, 132);
  if( len == -1 ) {
    printf("read error...\n");
    exit(1);
  }
  printf ("\ndata read is %s\n", string);
  data = 0x55555555;
  ioctl(fd, CASE1, &amp;data);

  ioctl(fd, CASE2, &amp;rdata);

  if(rdata != data)
    printf("Operation of ioctl was wrong...\n");
  printf("written data is %x and read data is %x\n", data, rdata);

  close(fd);
}


//gcc -c -O2 -D__KERNEL__ -DMODULE -Wall -I/usr/src/linux-2.4/include -DMODVERSIONS -include /usr/src/linux-2.4/include/linux/modversions.h drv1.c
/*# insmod skeleton.o
# mknod -m 666 /dev/skeleton c 32 0
# exit
*/


#include &lt;linux/errno.h&gt;
#include &lt;linux/fs.h&gt;
#include &lt;linux/module.h&gt;
#include &lt;linux/mm.h&gt;
#include &lt;asm/uaccess.h&gt;
MODULE_LICENSE("GPL");
#define CASE1 1
#define CASE2 2

static unsigned int counter = 0;
static char string [132];
static int data;

static int skeleton_open (struct inode *inode, struct file *file)
{
  MOD_INC_USE_COUNT;
  return 0;
}
  
static int skeleton_release (struct inode *inode, struct file *file)
{
  MOD_DEC_USE_COUNT;
  return 0;
}
  

static ssize_t skeleton_read (struct file *file, char *buf, size_t count, loff_t *ppos)
{
  int len, err;
  
  printk("&lt;5&gt;skeleton_read called\n");

  if( counter &lt;= 0 )
    return 0;

  err = copy_to_user(buf,string,counter);
  if (err != 0)
    return -EFAULT;

  len  = counter;
  counter = 0;

  return len;
}

static ssize_t skeleton_write (struct file *file, const char *buf, size_t count, loff_t *ppos)
{
  int err;

  printk("&lt;5&gt;skeleton_write called\n");

  err = copy_from_user(string,buf,count);
  if (err != 0)
    return -EFAULT;

  counter += count;

  return count;
}

static int skeleton_ioctl(struct inode *inode, struct file *file,
                    unsigned int cmd, unsigned long arg)
{
  int retval = 0;

  switch ( cmd ) {
        case CASE1:/* for writing data to arg */
               if (copy_from_user(&amp;data, (int *) arg,
                                        sizeof(int)))
                      return -EFAULT;
                break;
        case CASE2:/* for reading data from arg */
               if (copy_to_user((int *) arg, &amp;data,
                                        sizeof(int)))
                      return -EFAULT;
                break;
        default:
                retval = -EINVAL;
   }
   return retval;
}

static struct file_operations skeleton_fops =
{
#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(2,3,0)
  NULL,                                /* skeleton_llseek */
  skeleton_read,                /* skeleton_read */
  skeleton_write,                /* skeleton_write */
  NULL,                                /* skeleton_readdir */
  NULL,                                /* skeleton_poll */
  skeleton_ioctl,                /* skeleton_ioctl */
  NULL,                                /* skeleton_mmap */
  skeleton_open,                /* skeleton_open */
  NULL,                                /* skeleton_flush */
  skeleton_release,                /* skeleton_release */
  NULL,                                /* skeleton_fsync */
  NULL,                                /* skeleton_fasync */
  NULL,                                /* skeleton_check_media_change */
  NULL,                                /* skeleton_revalidate */
  NULL                                /* skeleton_lock */
#else /* for LINUX_VERSION_CODE 2.4.0 and later */
  THIS_MODULE,                        /* struct module *owner;*/
  NULL,                                /* skeleton_llseek */
  skeleton_read,                /* skeleton_read */
  skeleton_write,                /* skeleton_write */
  NULL,                                /* skeleton_readdir */
  NULL,                                /* skeleton_poll */
  skeleton_ioctl,                /* skeleton_ioctl */
  NULL,                                /* skeleton_mmap */
  skeleton_open,                /* skeleton_open */
  NULL,                                /* skeleton_flush */
  skeleton_release,                /* skeleton_release */
  NULL,                                /* skeleton_fsync */
  NULL,                                /* skeleton_fasync */
  NULL,                                /* skeleton_lock */
  NULL,                                /* skeleton_readv */
  NULL                                /* skeleton_writev */
#endif
};

int init_module (void)
{
  int i;
  
  i = register_chrdev (32, "skeleton", &amp; skeleton_fops);
  if (i != 0) return - EIO;

  return 0;
}

void cleanup_module (void)
{
  unregister_chrdev (32, "skeleton");
}
[/code]
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-16 09:46 , Processed in 0.065508 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

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