当我尝试写入设备时,为什么我的内核模块会抛出“损坏的管道”错误?

2024-01-12

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

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

该模块的完整代码是here https://github.com/nathan-osman/Webmail-Notifier-Linux-Driver/blob/master/webmail_notifier.c。然而,有趣的部分是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 内核编程完全陌生,所以我可能会做一些愚蠢的事情。如果您能对此有所了解,我们将不胜感激。


Edit:以下是一些进一步的信息:

  • lsusb -v输出是here https://github.com/nathan-osman/Webmail-Notifier-Linux-Driver/blob/7c6d510af86b85a2fbc73dc095e1d2fad03e30d2/lsusb.txt

  • the bDescriptorType的成员usb_endpoint_descriptor类包含“5”表示设备公开的单个端点(bEndpointAddress is 129 - or 0x81 in hex)

  • here https://i.stack.imgur.com/KbyZd.png是发送到设备的控制 URB 之一的屏幕截图


usb_control_msg()最终调用到usb_submit_urb(). The 文档/usb/error-codes.txt http://lxr.linux.no/#linux+v3.6/Documentation/usb/error-codes.txt文件描述了该函数可能返回的错误:

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

If usb_submit_urb()成功了,那么usb_control_msg()返回一个urb->status价值。这列在下面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.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我尝试写入设备时,为什么我的内核模块会抛出“损坏的管道”错误? 的相关文章

  • 内核虚拟地址转换

    考虑到 Linux 和 32 位 x86 架构 可访问的 4GB 地址空间的比例为 3 1 用户空间分配0 3 Gb 而3 4 Gb 分配给内核 大于 3Gb 且位于内核地址空间的虚拟地址如何转换为物理地址 页表会出现吗 梅尔 戈尔曼的书中
  • Linux用户空间线程、内核线程、轻量级进程

    我对所有这些实体以及它们在 Linux 中如何互连感到有点困惑 Unix 内部原理 一书指出lightweight process LWP 是内核支持的用户线程 并且该内核看不到进程内的线程 对于 Linux 来说仍然如此吗 据我了解 用户
  • 在 Linux (libusb-1.0) 上访问 USB 设备?

    我正在编写一个小程序 使用 Linux 上的 libusb 1 0 与特定 USB HID 产品 由供应商和产品 ID 标识 进行通信 现在 我必须以 root 身份运行该程序 因为 libusb 需要对 USB 设备节点的写访问权限 有没
  • Linux 内核:为什么调用 kstrtol 会崩溃?

    我正在学习内核编程 并且对 kstrtol 进行了简单的调用 我用它来将字符串转换为数字 然而 每次我编译这个模块并使用 insmod 将其放入内核时 我都会收到 BUG 无法处理 f862b026 处的内核分页请求 然后是寄存器和堆栈转储
  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • 如何将 Android USB 连接模式更改为仅充电? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 时间:2019-03-17 标签:c#usbdecision

    我们当前的应用程序中有几个进程 一个进程处理 USB 加载程序的检测和删除 处理检测和删除的代码如下 protected override void WndProc ref Message m switch m Msg case Win32
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • 获取已连接 USB 设备的端口名称

    当USB设备连接到计算机时 如何使用C 代码获取它所连接的端口名称 我找到了很多方法来查找 USB 何时连接 断开 驱动器号 路径 设备 ID 等 但没有找到任何明确的示例来说明如何知道它连接到哪个端口 我看到了一种可能的解释 但这涉及很多
  • 尝试映射大页面 (1GB) 时 mmap 失败

    我做了什么 使用 root 启用大页 我的系统支持 1MB 大页 echo 20 gt proc sys vm nr hugepages 将大页文件系统挂载到 mnt hugepages mount t hugetlbfs nodev mn
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http

随机推荐