您的位置:首页 > 运维架构 > Linux

初解linux字符设备驱动的组成

2012-03-25 21:16 232 查看
怀着激动的心情,翻开买了N长时间的驱动参考书,现在终于有机会可以在实践任务运用它了。对于驱动这个玩意,还没接触之前,感觉是那么的神秘,但是,一旦接触后,由于N多原因,它还是那么神秘。所以,要逐步逐步的去征服它。不管别人怎么说难或者简单,它都在那里,只有你会或者不会。

下面就慢慢走近它吧,看看它到底是啥玩意。

首先由字符设备说起,它是驱动中稍微简单一点的,那现在就看看它的“五脏“是哪些吧。

//设备结构体
struct xxx_dev_t
{
struct cdev cdev;
...
} xxx_dev;
//设备驱动模块加载函数
static int _ _init xxx_init(void)
{ ...
cdev_init(&xxx_dev.cdev, &xxx_fops); //初始化 cdev
xxx_dev.cdev.owner = THIS_MODULE;
//获取字符设备号
if (xxx_major)
{
register_chrdev_region(xxx_dev_no, 1, DEV_NAME);
}
else
{
alloc_chrdev_region(&xxx_dev_no, 0, 1, DEV_NAME);
}
ret = cdev_add(&xxx_dev.cdev, xxx_dev_no, 1); //注册设备
...
}
/*设备驱动模块卸载函数*/
static void _ _exit xxx_exit(void)
{
unregister_chrdev_region(xxx_dev_no, 1); //释放占用的设备号
cdev_del(&xxx_dev.cdev); //注销设备
...
}

/* 读设备*/
ssize_t xxx_read(struct file *filp, char _ _user *buf, size_t count,loff_t*f_pos)
{
...
copy_to_user(buf, ..., ...);
...
}

/* 写设备*/
ssize_t xxx_write(struct file *filp, const char _ _user *buf, size_t count,loff_t *f_pos)
{
...
copy_from_user(..., buf, ...);
...
}

/* ioctl 函数  */
int xxx_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,nsigned long arg)
{
...
switch	(cmd)
{
case XXX_CMD1:
...
break;
case XXX_CMD2:
...
break;
default:
/* 不能支持的命令  */
return  - ENOTTY;
}
return 0;
}

字符设备驱动文件操作结构体模块:
struct file_operations xxx_fops =
{
.owner = THIS_MODULE, //这不是一个操作,它是一个指向拥有这个结构模块的指针
.read = xxx_read,
.write = xxx_write,
.ioctl = xxx_ioctl,
...
};

以上都是主要组成部分,具体可以参见《linux设备驱动开发详解》,那里有详细说明,这只是个简介,不过模块都是类似的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux struct cmd file user module