0

我有一个 sd 卡,它连接在基于 im6qp 处理器的板上的微芯片 usb224x 控制器上。

SD 信号将转换为 USB dp 和 dm 信号。现在有两个用例,

用例1:上电前已插入SD卡,

sd 0:0:0:0: [sda] 249737216 512-byte logical blocks: (128 GB/119 GiB)

sd 0:0:0:0: [sda] Write Protect is off

sd 0:0:0:0: [sda] No Caching mode page found

sd 0:0:0:0: [sda] Assuming drive cache: write through

sda: sda1

sd 0:0:0:0: [sda] Attached SCSI removable disk

现在,如果我移除 SD 卡,我不会得到任何内核打印表明该卡已被移除。

usecase2:在运行内核时插入 SD 卡。没有打印表明 SD 卡被检测为 sda。

在案例 1 中,我可以安装此 SD 卡并访问其内容。在案例 2 中,我不能。

我有这个问题/困惑

  1. udev 等用户空间是否负责判断设备是否存在?我尝试将打印件放入许多 USB 核心文件中,但没有打印任何内容。但是,与此同时,我可以在使用相同 USB 总线但使用另一个通道的触摸设备上获得中断。

我尝试在驱动程序/usb、存储和 scsi 子系统中的 USB 函数中获取打印,但没有出现可观察到的打印。

我尝试启用 debugfs 打印,但即使那时我也没有收到任何日志,这是另一个我无法解决的问题。

主要问题是我不知道如何以及谁启动了这种删除和插入的更改,它是寻找中断并启动整个事情的低级内核驱动程序还是/sbin/hotplug之类的udev

我的内核版本是 4.9,我正在为普通用例使用构建根,以及具有相同内核的 android O。我得到同样的观察。

4

1 回答 1

0

我实际上正在使用具有相同芯片和相同内核版本的设备。这将更适合作为对您原始帖子的评论,但是我还没有 50 分(我知道版主)。

我遇到的问题:当未安装 sd 时,我可以通过 udevadm 监视器检测添加和删除 uevents。安装 sd 后,我只能检测到更改事件。我看到的主要/次要数字是 8,0 和 8,1。添加和删​​除 uevents 来自次要编号 1(仅在未安装时),而次要 0 我只看到更改事件(始终,如果已安装,则没有区别)并且似乎是轮询方式(“轮询”行为仅在次要 0 中看到)(只是看起来。仍在查看源以确认它实际上是轮询)。安装时快速插入和移除只会发送一个更改 uevent。

要回答您的问题“1”:据我所知,这些 uevent 是从内核驱动程序发送的,特别是从 scsi 中间层(drivers/scsi/scsi_lib.c)发送的。我已经追踪到void scsi_evt_thread(struct work_struct *work)它调用 scsi_evt_emit() 并最终调用 kobject_uevent_env() 的位置,据我了解,它负责通过 netlink 将 uevent 发射到用户空间。

如果你还在调试这个,我想我在这里注意到的其他信息是 scsi 是一个三层系统。你有最顶层,对我来说是驱动程序/scsi/sd.c,中间层我认为是驱动程序/scsi/scsi.c,底层是驱动程序/usb/storage/usb.c(这些是据我所知,每一层的主要文件。边学习边学习)。

仍在寻找如何在特定的 scsi 设备上设置特定事件。是由中断触发总线扫描还是有一个线程不断轮询更改(tdb)?

于 2019-06-06T19:31:36.737 回答