linux字符设备驱动步骤
2012-03-14 19:57
363 查看
linux 字符设备驱动步骤
1. 创建设备结构体:
Struct XXX_dev
{
Struct cdev cdev;
Unsigned value;
/* other values */
};
2. 编写设备初始化函数:
Int XXX_init(void);
a. 根据主设设备号创建设备:dev_t dev = MKDEV(XXX_major, 0);
b. 注册创建的设备:
手动注册result = register_chrdev_region(dev, 1, “DEVICE NAME”); or
自动注册result = alloc_chrdev_region(&dev, 0, 1, “DEVICE NAME”);
c. 为注册成功的设备分配内存:
XXX_devp = kmalloc(sizeof(struct XXX_dev), GFP_KERNEL);
d. 初始化注册成功的内存:
Memset(XXX_devp, 0, sizeof(struct XXX_dev));
设置设备的设备结构体:
XXX_setup_cdev(XXX_devp, 0);
i. 初始化设备结构体的操作函数:
Struct XXX_dev *dev = XXX_devp;
Cdev_init(&dev -> cdev, &XXX_fops);
Dev -> cdev.owner = “THIS_MODULE”;
Dev -> cdev.ops = &XXX_fops;
ii. 初始化后将设备结构体加入设备中
Cdev_add(&dev -> cdev, devno, 1);
设置设备操作函数结构体:
Struct file_operations XXX_fops =
{
.owner = THIS_MODULE,
.read = XXX_read, /* 函数指针*/
.write = XXX_write,
.ioctl = XXX_ioctl,
.open = XXX_open,
.release = XXX_release,
};
编写设备操作函数结构体中的函数:
int XXX_open[/b](struct inode *inode, struct file *filp);
int XXX_release[/b](struct inode *inode, struct file *filp);
ssize_t XXX_read[/b](struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
ssize_t XXX_write[/b](struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);
int XXX_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
3. 编写设备注销函数:
XXX_cleanup();
a. 删除设备结构体:
Cdev_del(&XXX_devp -> cdev);
b. 释放设备内存:
Kfree(XXX_devp);
c. 注销设备
Unregister_chrdev_region(MKDEV(XXX_major, 0), 1);
4. 设备模块与系统接口函数:
Module_init(XXX_init);
Module_exit(XXX_cleanup);
1. 创建设备结构体:
Struct XXX_dev
{
Struct cdev cdev;
Unsigned value;
/* other values */
};
2. 编写设备初始化函数:
Int XXX_init(void);
a. 根据主设设备号创建设备:dev_t dev = MKDEV(XXX_major, 0);
b. 注册创建的设备:
手动注册result = register_chrdev_region(dev, 1, “DEVICE NAME”); or
自动注册result = alloc_chrdev_region(&dev, 0, 1, “DEVICE NAME”);
c. 为注册成功的设备分配内存:
XXX_devp = kmalloc(sizeof(struct XXX_dev), GFP_KERNEL);
d. 初始化注册成功的内存:
Memset(XXX_devp, 0, sizeof(struct XXX_dev));
设置设备的设备结构体:
XXX_setup_cdev(XXX_devp, 0);
i. 初始化设备结构体的操作函数:
Struct XXX_dev *dev = XXX_devp;
Cdev_init(&dev -> cdev, &XXX_fops);
Dev -> cdev.owner = “THIS_MODULE”;
Dev -> cdev.ops = &XXX_fops;
ii. 初始化后将设备结构体加入设备中
Cdev_add(&dev -> cdev, devno, 1);
设置设备操作函数结构体:
Struct file_operations XXX_fops =
{
.owner = THIS_MODULE,
.read = XXX_read, /* 函数指针*/
.write = XXX_write,
.ioctl = XXX_ioctl,
.open = XXX_open,
.release = XXX_release,
};
编写设备操作函数结构体中的函数:
int XXX_open[/b](struct inode *inode, struct file *filp);
int XXX_release[/b](struct inode *inode, struct file *filp);
ssize_t XXX_read[/b](struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
ssize_t XXX_write[/b](struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);
int XXX_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
3. 编写设备注销函数:
XXX_cleanup();
a. 删除设备结构体:
Cdev_del(&XXX_devp -> cdev);
b. 释放设备内存:
Kfree(XXX_devp);
c. 注销设备
Unregister_chrdev_region(MKDEV(XXX_major, 0), 1);
4. 设备模块与系统接口函数:
Module_init(XXX_init);
Module_exit(XXX_cleanup);
相关文章推荐
- Linux实现字符设备驱动的基础步骤
- Linux实现字符设备驱动的基础步骤
- linux驱动开发之字符设备驱动编程步骤简述
- 利用linux 内核所提供的input子系统编写字符设备驱动的步骤
- 深入理解Linux字符设备驱动
- Linux高级字符设备驱动 poll方法(select多路监控原理与实现)
- 深入浅出:Linux设备驱动之字符设备驱动
- linux字符设备驱动
- Linux字符设备驱动入门(一)
- linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用
- Linux字符设备驱动的register_chrdev()与unregister_chrdev()
- Linux字符设备驱动入门(二)——加入ioctl功能
- ceph存储 字符设备驱动示例x86Linux平台
- Linux字符设备驱动——初体验
- linux字符设备驱动的 ioctl 幻数
- Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志
- Linux驱动学习4(字符设备驱动初步学习)
- Linux设备驱动第六篇:高级字符驱动操作之iotcl
- Linux字符设备驱动框架
- linux驱动开发--字符设备:内核等待队列