一、问题现象:
在insmod时调用的init函数代码执行过程中出现oops,导致rmmod卸载失败,此时不得不重启目标板?
二、下面是《精通linux设备驱动程序开发》中模拟鼠标的输入设备驱动的内核模块vms.c代码:
#include
#include
#include
#include
#include
#include
static struct platform_device *vms_dev;
static struct input_dev *vms_input_dev;
static ssize_t write_vms(struct device *dev, struct device_attribute *attr, const char *buffer, size_t count)
{
int x, y;
sscanf(buffer, "%d%d", &x, &y);
printk("(x,y)=(%d,%d)\n", x, y);
input_report_rel(vms_input_dev, REL_X, x);
input_report_rel(vms_input_dev, REL_Y, y);
input_sync(vms_input_dev);
return count;
}
DEVICE_ATTR(coordinates, 0644, NULL, write_vms);
static struct attribute *vms_attrs[] = {
&dev_attr_coordinates.attr,
NULL
};
static struct attribute_group vms_attr_group = {
.attrs = vms_attrs,
};
static int __init vms_init(void)
{
int err;
printk("vms_init===========\n");
vms_dev = platform_device_register_simple("vms", -1, NULL, 0);
if (IS_ERR(vms_dev)) {
printk("############################platform_device_register_simple failed\n");
return PTR_ERR(vms_dev);
}
printk("vms_dev = 0x%x\n", vms_dev);
err = sysfs_create_group(&vms_dev->dev.kobj, &vms_attr_group);
if (err) {
printk("=============================