我有一个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中,我不能。
我有这个问题/困惑
我尝试在驱动程序/ usb,存储和scsi子系统的usb函数中获取打印,但是没有可观察到的打印。
我尝试启用debugfs打印,但是即使那样我也没有日志,这是我无法解决的另一个问题。
主要问题是我不知道如何以及由谁来启动这种删除和插入的更改,这是一个低级内核驱动程序,它寻找中断并启动整个事件或 udev ,例如 / sbin / hotplug ?
我的内核版本是4.9,我在正常用例中使用构建根目录,在同一内核中也使用androidO。我得到的观察也一样。
答案 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)的线程?