SD卡如何通过USB总线作为SCSI设备安装

时间:2019-02-22 11:52:36

标签: linux-kernel kernel usb usb-mass-storage

我有一个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卡,我将看不到任何表明该卡已卸下的内核打印内容。

用例2::正在运行的内核中已插入SD卡。 没有打印出来表明SD卡被检测为sda。

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

我有这个问题/困惑

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

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

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

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

我的内核版本是4.9,我在正常用例中使用构建根目录,在同一内核中也使用androidO。我得到的观察也一样。

1 个答案:

答案 0 :(得分:0)

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

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

要回答您的问题“ 1”: 根据到目前为止的了解,这些事件是从内核驱动程序发送的,特别是从scsi中间层(drivers / scsi / scsi_lib.c)发送的。我已经跟踪到void scsi_evt_thread(struct work_struct *work),在其中它调用scsi_evt_emit()并最终调用kobject_uevent_env(),据我所知,该对象负责通过网络链接将uevent扩展到用户空间。

如果您仍在调试它,我想在这里注意到的其他信息是scsi是三层系统。您对我来说最顶层是driver / scsi / sd.c,中间层是我看到的driver / scsi / scsi.c,而最底层是driver / usb / storage / usb.c(这些是从我所知道的内容中了解每一层的主要文件。

仍然希望弄清楚如何在特定的scsi设备上设置特定的事件。总线的扫描是由中断触发的,还是有一个仅连续轮询更改(tdb)的线程?