Linux设备驱动程序打开错误

时间:2014-04-03 12:37:50

标签: linux linux-kernel linux-device-driver

我是Linux新手。 我制作了一个USB骨架驱动程序和一个打开和关闭骨架的应用程序。 但它会导致错误无法打开设备。

有人能告诉我可能发生这种情况的原因吗? 这个简单的驱动程序需要附带usb端口的任何设备吗?

这是我的应用程序

int main()

    /* no memory-swapping for this programm */
    ret = mlockall(MCL_CURRENT | MCL_FUTURE);
    if (ret) {
        perror("ERROR : mlockall has failled");
        exit(1);
    }

    /*
     * Turn the NRTcurrent task into a RT-task.
     * */

    ret = rt_task_shadow(&rt_task_desc, NULL, 1, 0);
    if (ret)
    {
        fprintf(stderr, "ERROR : rt_task_shadow: %s\n",
            strerror(-ret));
        exit(1);
    }

    /* open the device */
    device = rt_dev_open(DEVICE_NAME, 0);
    if (device < 0) {
        printf("ERROR : can't open device %s (%s)\n",
               DEVICE_NAME, strerror(-device));
        exit(1);
    }

    /*
     * If an argument was given on the command line, write it to the device,
     * otherwise, read from the device.
     */

    /* close the device */
    ret = rt_dev_close(device);
    if (ret < 0) {
        printf("ERROR : can't close device %s (%s)\n",
               DEVICE_NAME, strerror(-ret));
        exit(1);
    }

    return 0;
 }

这是我的驱动程序打开功能

static int skel_open(struct inode *inode, struct file *file)
 {
    struct usb_skel *dev;
    struct usb_interface *interface;
    int subminor;
    int retval = 0;

    subminor = iminor(inode);

    interface = usb_find_interface(&skel_driver, subminor);
    if (!interface) {
        pr_err("%s - error, can't find device for minor %d\n",
            __func__, subminor);
        retval = -ENODEV;
        goto exit;
    }

    dev = usb_get_intfdata(interface);
    if (!dev) {
        retval = -ENODEV;
        goto exit;
    }

    /* increment our usage count for the device */
    kref_get(&dev->kref);

    /* lock the device to allow correctly handling errors
     * in resumption */
    mutex_lock(&dev->io_mutex);

    retval = usb_autopm_get_interface(interface);
    if (retval)
        goto out_err;

    /* save our object in the file's private structure */
    file->private_data = dev;
    mutex_unlock(&dev->io_mutex);

        exit:
    return retval;
 }

0 个答案:

没有答案