我在一个字符设备写了一些方法,read,write等,我在用户层使用这些系统调用的时候怎么用到我这个字符设备驱动所定义的??

汗晕倒 2010-11-10 05:24:36
RT
是否要包含驱动的头文件什么的?还是通过什么来达到这样的效果。
...全文
173 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
李万鹏 2010-11-17
  • 打赏
  • 举报
回复
向5楼学习了~
freefei 2010-11-11
  • 打赏
  • 举报
回复
makenod
李迟 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shisi 的回复:]
悲剧,我用lsmod命令可以看到我驱动模块,但是在/dev下面没有~
[/Quote]
按6楼的,手动创建。

to yel617:
学习一下你的例子,提高水平。
yel617 2010-11-11
  • 打赏
  • 举报
回复
/dev下设备节点
要手动建立,也可以用这个自动建立
apple_class=class_create(THIS_MODULE,"apple");
device_create(apple_class,NULL,apple_dev,NULL,"apple");
yel617 2010-11-11
  • 打赏
  • 举报
回复
给你个例子看下吧 以前学的时候写的
驱动:
#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/cdev.h>
#include <linux/kobject.h>

#include <linux/fs.h>
#include <linux/device.h>
#include <mach/io.h>
#include <mach/gpio.h>
#include <mach/board.h>
#include <mach/gpmc.h>
#include <mach/mux.h>
#include <asm/uaccess.h>

MODULE_LICENSE("Dual BSD/GPL");
struct cdev apple_cdev;
unsigned int apple_dev;
static char *data;
//static struct class *apple_class;

static ssize_t apple_read(struct file *file,char *buf,size_t count,loff_t *f_pos);
static ssize_t apple_write(struct file *file,const char *buffer,size_t count,loff_t *f_pos);

static int apple_open(struct inode *inode,struct file *file);
static int apple_release(struct inode *inode,struct file *file);

static int apple_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);

static struct file_operations apple_fops={
.owner = THIS_MODULE,
.open = apple_open,
.release = apple_release,
.read = apple_read,
.write = apple_write,
.ioctl = apple_ioctl,
};

static ssize_t apple_read(struct file *file,char *buf,size_t count,loff_t *f_pos)
{
int len;
if(count<0)
{
return -EINVAL;
}
len=strlen(data);
if(len<count) count=len;
copy_to_user(buf,data,count+1);
printk("read buf=%s\n",buf);
printk("read data=%s\n",data);
return count;
}

static ssize_t apple_write(struct file *file,const char *buffer,size_t count,loff_t *pos)
{
if(count<0) return -EINVAL;
kfree(data);
data=(char *)kmalloc(sizeof(char)*(count+1),GFP_KERNEL);
if(!data) return -ENOMEM;
copy_from_user(data,buffer,count+1);
printk("write buffer=%s\n",buffer);
printk("write data=%s\n",data);
return count;
}

static int apple_open(struct inode *inode,struct file *file)
{
printk("This is open(skull)\n");
return 0;
}

static int apple_release(struct inode *inode,struct file *file)
{
printk("This is released\n");
return 0;
}

static int apple_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case 1: printk("There is 1 apple.\n"); break;
case 2: printk("There is 2 apples\n"); break;
case 3: printk("There is 3 apples\n"); break;
}

}

static int __init apple_init(void)
{
int ret;
cdev_init(&apple_cdev,&apple_fops);
apple_cdev.owner = THIS_MODULE;
ret = alloc_chrdev_region(&apple_dev,0,1,"apple");
if(ret < 0)
{
printk("apple register failure!\n");
return -22;
}
ret = cdev_add(&apple_cdev,apple_dev,1);
if(ret < 0)
{
printk("apple_cdev register failure!\n");
return -22;
}
//apple_class=class_create(THIS_MODULE,"apple");
//device_create(apple_class,NULL,apple_dev,NULL,"apple");
return 0;
}

static void __exit apple_exit(void)
{
unregister_chrdev_region(apple_dev,1);
cdev_del(&apple_cdev);
//device_destroy(apple_class,apple_dev);
//class_destroy(apple_class);
}

module_init(apple_init);
module_exit(apple_exit);

应用:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv)
{
int fd,num;
char label[10];
fd = open("/dev/apple",O_RDWR);
if(fd != -1)
{
printf("Please enter the label attached to the Apple\n");
scanf("%s",&label);
write(fd,&label,10*sizeof(char));
read(fd,&label,10*sizeof(char));
printf("Please enter the number of apples\n");
scanf("%d",&num);
ioctl(fd,num);
close(fd);
}
else
{
printf("Device open failure\n");
}
}

cheng_fengming 2010-11-11
  • 打赏
  • 举报
回复
学习一下,呵呵
汗晕倒 2010-11-10
  • 打赏
  • 举报
回复
悲剧,我用lsmod命令可以看到我驱动模块,但是在/dev下面没有~
gohome520 2010-11-10
  • 打赏
  • 举报
回复
系统调用劫持?
ma100 2010-11-10
  • 打赏
  • 举报
回复
你的驱动会在/dev/生成一个文件,
使用时首先 int fd = open ( "/dev/xxx", xxx );
然后就可以用fd操作read, write等了, 就好象c语言的fopen

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧