Как SD-карта монтируется на шину USB как устройство SCSI - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть SD-карта, которая подключена к микросхеме контроллера usb224x на плате на базе процессора im6qp.

Сигналы 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 в подсистемах drivers / usb, storage и scsi, но не наблюдалось никаких распечаток.

Я попытался включить распечатки debugfs, но я не получаю даже журналтогда и это еще одна проблема, которую я не могу решить.

Основная проблема - я не понимаю, как и кто инициирует это изменение удаления и вставки, является ли это драйвер ядра низкого уровня, который ищет прерывание иинициировать все это или udev , например / sbin / hotplug ?

Моя версия ядра 4.9, и я использую build root для обычных случаев использования, а также Android O с тем же ядром.Такое же наблюдение я получаю.

1 Ответ

0 голосов
/ 06 июня 2019

Я на самом деле работаю на устройстве с тем же чипом и той же версией ядра.Это было бы лучше подойти в качестве комментария к вашему исходному сообщению, однако у меня пока нет 50 баллов (я знаю модераторов).

Проблемы, которые у меня возникают: я могу обнаружить добавление и удаление событий с помощью монитора udevadm, когда sd не смонтирован.Когда sd монтируется, я могу только обнаружить события изменения.Основные / второстепенные цифры, которые я вижу, составляют 8,0 и 8,1.Добавлять и удалять события приходят из второстепенного числа 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 в пространство пользователя через netlink.

Если вы все еще отлаживаете это,Другая информация, которую я решил отметить, заключается в том, что scsi является трехслойной системой.У вас есть самый верхний слой, который для меня - drivers / scsi / sd.c, средний слой, который я вижу как drivers / scsi / scsi.c, и нижний уровень драйверов / usb / storage / usb.c (этоосновные файлы для каждого слоя из того, что я могу сказать. Учиться, как я иду).

Все еще пытаемся выяснить, как определенное событие устанавливается на конкретном устройстве scsi.Сканирование шины вызвано прерыванием или есть поток, который просто непрерывно запрашивает изменения (tdb)?

...