yinshenk 2019-05-31 10:58 采纳率: 0%
浏览 199

insmod: error inserting 'Relay.ko': -1 Device or resource busy

// Linux Device Driver program
// Relay.c

#include
#include
#include
#include
#include
#include
#include

#define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr))

#define RELAY_INPUT IMX_GPIO_NR(4, 7) // GPIO4_IO07/KEY_ROW0 pin(out1).
#define RELAY_OUTPUT IMX_GPIO_NR(4, 15) // GPIO4_IO15/KEY_ROW4 pin(out2).

#define COL_INTERRUPT_1 IMX_GPIO_NR(5, 1) // 地感线圈1
#define COL_INTERRUPT_2 IMX_GPIO_NR(5, 2) // 地感线圈2
#define COL_INTERRUPT_3 IMX_GPIO_NR(5, 3) // 地感线圈3
#define COL_INTERRUPT_4 IMX_GPIO_NR(5, 4) // 地感线圈4

#define SKELETON_MAJOR 231
#define SKELETON_NAME "Relay"
#define MYCNT 1

struct cdev Relay_cdev;
dev_t mydev;

DECLARE_WAIT_QUEUE_HEAD(skeleton_wait);

static irqreturn_t xyz_interrupt(int irq, void *dev)
{
printk("Interrupt ");
return IRQ_HANDLED;
}

// close function - called when the "file" /dev/skeleton is closed in userspace

static int Relay_release (struct inode *inode, struct file *file)
{
printk("Relay_releasen");
return 0;
}

// open function - called when the "file" /dev/skeleton is opened in userspace
static int Relay_open (struct inode *inode, struct file *file)
{
printk("Relay_open");
// we could do some checking on the flags supplied by "open"
// i.e. O_NONBLOCK
// -> set some flag to disable interruptible_sleep_on in skeleton_read
return 0;
}

// write function called when to /dev/skeleton is written
static ssize_t Relay_write (struct file *file, const char *buf, size_t count, loff_t *ppos)
{
int i;

if ( strcmp(buf, "0xff,0x01,0x01,0x01,0x03,0xee") == 0 )
{
    gpio_set_value(RELAY_INPUT, 1);   // 进停车场继电器拉高.
    for ( i = 0; i < 1000; i ++ );    // 延时40ms.
    gpio_set_value(RELAY_INPUT, 0);   // 进停车场继电器拉低.
} else if ( strcmp(buf, "0xff,0x02,0x01,0x01,0x04,0xee") == 0 )
{
    gpio_set_value(RELAY_OUTPUT, 1);  // 出停车场继电器拉高.
    for ( i = 0; i < 1000; i ++ );    // 延时40ms.
    gpio_set_value(RELAY_OUTPUT, 0);  // 出停车场继电器拉低.
} 

return 0;

}

// define which file operations are supported
struct file_operations Relay_fops = {
.owner = THIS_MODULE,
.llseek = NULL,
.read = NULL,
.write = Relay_write,
// .readdir = NULL,
.poll = NULL,
// .ioctl = NULL,
.mmap = NULL,
.open = Relay_open,
.flush = NULL,
.release = Relay_release,
.fsync = NULL,
.fasync = NULL,
.lock = NULL,
//.readv = NULL,
//.writev = NULL,
};

static int __init Relay_init_module (void)
{
// int i;
int irq_no;
int iRet;

int retval;


printk("initializing modulen\n");

gpio_direction_output(RELAY_INPUT, 1);  // 初始化进-输出状态.
gpio_direction_output(RELAY_OUTPUT, 1); // 出书画出-输出状态.

gpio_set_value(RELAY_INPUT, 0);  // 初始化进-继电器.
gpio_set_value(RELAY_OUTPUT,0);  // 初始化出-继电器.

irq_no = gpio_to_irq(COL_INTERRUPT_1);
//set_irq_type(irq_no, IRQF_TRIGGER_FALLING);
iRet = request_irq(irq_no, xyz_interrupt, IRQF_SHARED, "interrupt", NULL);
if (iRet != 0) {
    printk("request gpio failed \n");
    return -EBUSY;
}

// i = register_chrdev (SKELETON_MAJOR, SKELETON_NAME, &Relay_fops);
// if (i != 0) return - EIO;

 // 第1步:注册/分配主次设备号
 mydev = MKDEV(SKELETON_MAJOR, 0);
 retval = register_chrdev_region(mydev, MYCNT, SKELETON_NAME);//

// retval = alloc_chrdev_region(&mydev, 0, MYCNT, SKELETON_NAME);
if (retval) {
printk(KERN_ERR "Unable to register minors for %s\n", SKELETON_NAME);
return -EINVAL;
}
printk(KERN_INFO "register_chrdev_region success\n");

 // 第2步:注册字符设备驱动
 cdev_init(&Relay_cdev, &Relay_fops);

 Relay_cdev.owner = THIS_MODULE;
 Relay_cdev.ops = &Relay_fops;
 kobject_set_name(&Relay_cdev.kobj, "%s", SKELETON_NAME);

 retval = cdev_add(&Relay_cdev, mydev, MYCNT);
 if (retval) {
     printk(KERN_ERR "Unable to cdev_add\n");
     return -EINVAL;
 }
 printk(KERN_INFO "cdev_add success\n");



return 0;

}

static void __exit Relay_exit_module (void)
{
printk("cleaning up modulen");

// unregister_chrdev (SKELETON_MAJOR, SKELETON_NAME);

// 第一步真正注销字符设备驱动用cdev_del
cdev_del(&Relay_cdev);
// 第二步去注销申请的主次设备号
unregister_chrdev_region(mydev, MYCNT);

}

module_init(Relay_init_module);
module_exit(Relay_exit_module);
MODULE_AUTHOR("Shenzhen Bobuma Tetchology co.,Ltd");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Relay drive program");

#Makefile file
CROSS_COMPILE=arm-linux-
ARCH:=arm
CC:=arm-poky-linux-gnueabi-gcc
LD:=arm-poky-linux-gnueabi-ld

obj-m = Relay.o
module-objs = Relay.o

KDIR = /usr/local/linux-4.1.15
PWD = $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *~ *.symvers *.order

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 程序不包含适用于入口点的静态Main方法
    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记