1.设备相关
device_destroy-清楚设备
#include <linux/device.h>
void device_destroy(struct class *dev, dev_t devt);
例:device_destroy(class_mpu6050, mpu6050_devno);
函数device_destroy()用于从linux内核系统设备驱动程序模型中移除一个设备,并删除/sys/devices/virtual目录下对应的设备目录及/dev/目录下对应的设备文件
device_create()—在class下添加kobject对象
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
class:新构建的class
parent:新kobject对象的上一层节点,一般为NULL
dev_t:属性文件记录该设备号
drvdata:私有数据,一般为NULL
fmt:变参参数,一般用来设置kobject对象的名字
class_destroy-清除类
例:class_destroy(class_mpu6050);
cdev_del-清除设备号
void cdev_del(struct cdev *p)
{
cdev_unmap(p->dev, p->count);
kobject_put(&p->kobj);
}
例:
static struct cdev mpu6050_chr_dev;
cdev_del(&mpu6050_chr_dev);
unregister_chrdev_region-取消注册字符设备
void unregister_chrdev_region(dev_t from, unsigned count)
{
dev_t to = from + count;
dev_t n, next;
for (n = from; n < to; n = next) {
next = MKDEV(MAJOR(n)+1, 0);
if (next > to)
next = to;
kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
}
}
例:
static dev_t mpu6050_devno; //定义字符设备的设备号
unregister_chrdev_region(mpu6050_devno, DEV_CNT);
spi_unregister_master-注销一个spi_controller
void spi_unregister_master(struct spi_master *master)
总体流程
device_destroy(class_button, button_devno); //清除设备
class_destroy(class_button); //清除类
cdev_del(&button_chr_dev); //清除设备号
unregister_chrdev_region(button_devno, DEV_CNT); //取消注册字符设备
2.驱动注销
i2c_del_driver
i2c_del_driver(&mpu6050_driver);
3.释放中断
unsigned button_GPIO_number = 0; //保存button使用的GPIO引脚编号
u32 interrupt_number = 0; // button 引脚中断编号
struct device *device_button; // 保存创建的设备
/*释放申请的引脚,和中断*/
gpio_free(button_GPIO_number);
free_irq(interrupt_number, device_button);
4.释放子系统相关
struct input_dev *button_input_dev = NULL; //定义按键对应的输入子系统结构体
input_unregister_device(button_input_dev);
input_free_device(button_input_dev);