⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u132-hcd.c

📁 host usb 主设备程序 支持sd卡 mouse keyboard 的最单单的驱动程序 gcc编译
💻 C
📖 第 1 页 / 共 5 页
字号:
                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);                return;        } else if (endp->dequeueing) {                endp->dequeueing = 0;                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed urb="                        "%p status=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);                return;        } else if (urb->status == -EINPROGRESS) {                struct u132_ring *ring = endp->ring;                u8 *u = urb->transfer_buffer + urb->actual_length;                u8 *b = buf;                int L = len;                while (L-- > 0) {                        *u++ = *b++;                }                urb->actual_length += len;                if ((condition_code == TD_CC_NOERROR) &&                        (urb->transfer_buffer_length > urb->actual_length)) {                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        if (urb->actual_length > 0) {                                int retval;                                up(&u132->scheduler_lock);                                retval = edset_single(u132, ring, endp, urb,                                        address, endp->toggle_bits,                                        u132_hcd_interrupt_recv);                                if (retval == 0) {                                } else                                        u132_hcd_giveback_urb(u132, endp, urb,                                                retval);                        } else {                                ring->in_use = 0;                                endp->active = 0;                                endp->jiffies = jiffies +                                        msecs_to_jiffies(urb->interval);                                u132_ring_cancel_work(u132, ring);                                u132_ring_queue_work(u132, ring, 0);                                up(&u132->scheduler_lock);                                u132_endp_put_kref(u132, endp);                        }                        return;                } else if ((condition_code == TD_DATAUNDERRUN) &&                        ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb, 0);                        return;                } else {                        if (condition_code == TD_CC_NOERROR) {                                endp->toggle_bits = toggle_bits;                                usb_settoggle(udev->usb_device, endp->usb_endp,                                        0, 1 & toggle_bits);                        } else if (condition_code == TD_CC_STALL) {                                endp->toggle_bits = 0x2;                                usb_settoggle(udev->usb_device, endp->usb_endp,                                        0, 0);                        } else {                                endp->toggle_bits = 0x2;                                usb_settoggle(udev->usb_device, endp->usb_endp,                                        0, 0);                                dev_err(&u132->platform_dev->dev, "urb=%p givin"                                        "g back INTERRUPT %s\n", urb,                                        cc_to_text[condition_code]);                        }                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb,                                cc_to_error[condition_code]);                        return;                }        } else {                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"                        "s=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, urb->status);                return;        }}static void u132_hcd_bulk_output_sent(void *data, struct urb *urb, u8 *buf,        int len, int toggle_bits, int error_count, int condition_code,        int repeat_number, int halted, int skipped, int actual, int non_null){        struct u132_endp *endp = data;        struct u132 *u132 = endp->u132;        u8 address = u132->addr[endp->usb_addr].address;        down(&u132->scheduler_lock);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                up(&u132->scheduler_lock);                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);                return;        } else if (endp->dequeueing) {                endp->dequeueing = 0;                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed urb="                        "%p status=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);                return;        } else if (urb->status == -EINPROGRESS) {                struct u132_ring *ring = endp->ring;                urb->actual_length += len;                endp->toggle_bits = toggle_bits;                if (urb->transfer_buffer_length > urb->actual_length) {                        int retval;                        up(&u132->scheduler_lock);                        retval = edset_output(u132, ring, endp, urb, address,                                endp->toggle_bits, u132_hcd_bulk_output_sent);                        if (retval == 0) {                        } else                                u132_hcd_giveback_urb(u132, endp, urb, retval);                        return;                } else {                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb, 0);                        return;                }        } else {                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"                        "s=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, urb->status);                return;        }}static void u132_hcd_bulk_input_recv(void *data, struct urb *urb, u8 *buf,        int len, int toggle_bits, int error_count, int condition_code,        int repeat_number, int halted, int skipped, int actual, int non_null){        struct u132_endp *endp = data;        struct u132 *u132 = endp->u132;        u8 address = u132->addr[endp->usb_addr].address;        struct u132_udev *udev = &u132->udev[address];        down(&u132->scheduler_lock);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                up(&u132->scheduler_lock);                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);                return;        } else if (endp->dequeueing) {                endp->dequeueing = 0;                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed urb="                        "%p status=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);                return;        } else if (urb->status == -EINPROGRESS) {                struct u132_ring *ring = endp->ring;                u8 *u = urb->transfer_buffer + urb->actual_length;                u8 *b = buf;                int L = len;                while (L-- > 0) {                        *u++ = *b++;                }                urb->actual_length += len;                if ((condition_code == TD_CC_NOERROR) &&                        (urb->transfer_buffer_length > urb->actual_length)) {                        int retval;                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        up(&u132->scheduler_lock);                        retval = usb_ftdi_elan_edset_input(u132->platform_dev,                                ring->number, endp, urb, address,                                endp->usb_endp, endp->toggle_bits,                                u132_hcd_bulk_input_recv);                        if (retval == 0) {                        } else                                u132_hcd_giveback_urb(u132, endp, urb, retval);                        return;                } else if (condition_code == TD_CC_NOERROR) {                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb,                                cc_to_error[condition_code]);                        return;                } else if ((condition_code == TD_DATAUNDERRUN) &&                        ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb, 0);                        return;                } else if (condition_code == TD_DATAUNDERRUN) {                        endp->toggle_bits = toggle_bits;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,                                1 & toggle_bits);                        dev_warn(&u132->platform_dev->dev, "urb=%p(SHORT NOT OK"                                ") giving back BULK IN %s\n", urb,                                cc_to_text[condition_code]);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb, 0);                        return;                } else if (condition_code == TD_CC_STALL) {                        endp->toggle_bits = 0x2;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb,                                cc_to_error[condition_code]);                        return;                } else {                        endp->toggle_bits = 0x2;                        usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);                        dev_err(&u132->platform_dev->dev, "urb=%p giving back B"                                "ULK IN code=%d %s\n", urb, condition_code,                                cc_to_text[condition_code]);                        up(&u132->scheduler_lock);                        u132_hcd_giveback_urb(u132, endp, urb,                                cc_to_error[condition_code]);                        return;                }        } else {                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"                        "s=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, urb->status);                return;        }}static void u132_hcd_configure_empty_sent(void *data, struct urb *urb, u8 *buf,        int len, int toggle_bits, int error_count, int condition_code,        int repeat_number, int halted, int skipped, int actual, int non_null){        struct u132_endp *endp = data;        struct u132 *u132 = endp->u132;        down(&u132->scheduler_lock);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                up(&u132->scheduler_lock);                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);                return;        } else if (endp->dequeueing) {                endp->dequeueing = 0;                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed urb="                        "%p status=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);                return;        } else if (urb->status == -EINPROGRESS) {                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, 0);                return;        } else {                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"                        "s=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, urb->status);                return;        }}static void u132_hcd_configure_input_recv(void *data, struct urb *urb, u8 *buf,        int len, int toggle_bits, int error_count, int condition_code,        int repeat_number, int halted, int skipped, int actual, int non_null){        struct u132_endp *endp = data;        struct u132 *u132 = endp->u132;        u8 address = u132->addr[endp->usb_addr].address;        down(&u132->scheduler_lock);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                up(&u132->scheduler_lock);                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);                return;        } else if (endp->dequeueing) {                endp->dequeueing = 0;                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed urb="                        "%p status=%d\n", urb, urb->status);                up(&u132->scheduler_lock);                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);                return;        } else if (urb->status == -EINPROGRESS) {                struct u132_ring *ring = endp->ring;                u8 *u = urb->transfer_buffer;                u8 *b = buf;                int L = len;                while (L-- > 0) {                        *u++ = *b++;                }                urb->actual_length = len;                if ((condition_code == TD_CC_NOERROR) || ((condition_code ==                        TD_DATAUNDERRUN) && ((urb->transfer_flags &                        URB_SHORT_NOT_OK) == 0))) {                        int retval;                        up(&u132->scheduler_lock);                        retval = usb_ftdi_elan_edset_empty(u132->platform_dev,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -