gpt4 book ai didi

linux-kernel - 当我尝试写入设备时,为什么我的内核模块会抛出 "broken pipe"错误?

转载 作者:行者123 更新时间:2023-12-04 05:10:48 24 4
gpt4 key购买 nike

我目前正在用 C 编写一个 Linux 内核模块。该模块为 USB 灯提供了一个非常基本的驱动程序(该设备由三个彩色 LED 组成)。我已经设法让驱动程序毫无问题地加载和卸载,并且还创建了设备( /dev/wn0/dev/wn1 等)。但是,在尝试写入设备时,我不断收到错误消息:

$ echo "1" >/dev/wn0
bash: echo: write error: Broken pipe

该模块的完整代码是 here .然而,有趣的部分是 wn_set_color()功能:
/* Create the data buffer to be sent to the device. */
u8 buf[8] = {
red, green, blue, 0, 0, 0, 0x1F, 0x05
};

/* Send the data to the device. */
return usb_control_msg(udev,
usb_sndctrlpipe(udev, 0),
0, 0, 0, 0,
buf, 8, 0);

出于某种原因,它返回 -32而不是将数据发送到设备。

我对 Linux 内核编程完全陌生,所以我可能会做一些愚蠢的事情。如果您能对此有所了解,将不胜感激。

编辑:这是一些进一步的信息:
  • lsusb -v输出为 here
  • bDescriptorType usb_endpoint_descriptor 的成员类包含设备公开的单个端点的“5”(bEndpointAddress129 - 或 0x81 十六进制)
  • here是发送到设备
  • 的控制 URB 之一的屏幕截图

    最佳答案

    usb_control_msg()最终调用 usb_submit_urb() . Documentation/usb/error-codes.txt文件描述了这个函数可以返回的错误:

    -EPIPE          The pipe type specified in the URB doesn't match the
    endpoint's actual type.

    如果 usb_submit_urb()成功了,然后 usb_control_msg()返回 urb->status值(value)。此列表在 EPIPE 下:
    -EPIPE (**)             Endpoint stalled.  For non-control endpoints,
    reset this status with usb_clear_halt().

    (**) This is also one of several codes that different kinds of host
    controller use to indicate a transfer has failed because of device
    disconnect. In the interval before the hub driver starts disconnect
    processing, devices may receive such fault reports for every request.

    您是否检查过内核日志中的任何消息?

    关于linux-kernel - 当我尝试写入设备时,为什么我的内核模块会抛出 "broken pipe"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14312988/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com