kernel之最简单字符设备驱动模板
kernel之字符设备驱动模块
一个最简单的字符驱动模板:
/* 设备结构体 */
struct xxx_dev_t {
struct cdev cdev;
...
} xxx_dev;
/* 读设备 */
static ssize_t xxx_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
...
copy_to_user(buf, ..., ...); /* 拷贝数据到用户空间 */
...
}
/* 写设备 */
static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
...
copy_from_user(..., buf, ...); /* 从用户空间拷贝数据到内核空间 */
...
}
/* 文件操作集 */
static const struct file_operations xxx_fops = {
.owner = THIS_MODULE,
.read = xxx_read,
.write = xxx_write,
/* 还有很多接口 */
...
};
/* 模块加载函数 */
static int __init xxx_init(void)
{
cdev_init(&xxx_dev.cdev, &xxx_fops); /* 初始化cdev */
xxx_dev.cdev.owner = THIS_MODULE;
alloc_chrdev_region(...); /* 动态分配字符设备号 */
cdev_add(...); /* 注册设备 */
...
}
/* 模块卸载函数 */
static void __exit xxx_exit(void)
{
unregister_chrdev_region(...); /* 释放设备号 */
cdev_del(&xxx_dev.cdev); /* 注销设备 */
...
}
module_init(xxx_init);
module_exit(xxx_exit);
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DD'Notes!
评论