Как SD-карта монтируется на шину USB как устройство SCSI
У меня есть 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 я не могу.
У меня есть этот вопрос / путаница
- Ответственно ли пользовательское пространство, такое как udev, чтобы определить, присутствует ли устройство или нет? Я попытался поместить отпечатки во многие файлы ядра USB, и никто ничего не печатает. Однако в то же время я могу получать прерывания на сенсорном устройстве, которое использует ту же шину USB, но другой канал.
Я пытался получить распечатки в функциях usb в подсистемах drivers / usb, storage и scsi, но заметных отпечатков не было.
Я попытался включить распечатки debugfs, но я не получаю журнал даже тогда, и это - другая проблема, которую я не могу решить.
Основная проблема в том, что я не понимаю, как и кто инициирует это изменение удаления и вставки, это драйвер ядра низкого уровня, который ищет прерывание и инициирует весь процесс или udev, такой как / sbin / hotplug?
Моя версия ядра 4.9, и я использую build root для обычных случаев использования, а также Android O с тем же ядром. Такое же наблюдение я получаю.
0 ответов
На самом деле я работаю над устройством с тем же чипом и той же версией ядра. Это лучше подходит в качестве комментария к вашему исходному сообщению, однако у меня пока нет 50 баллов (я знаю модераторов).
У меня возникают проблемы: я могу обнаруживать добавление и удаление событий через udevadm monitor, когда SD не смонтирован. Когда SD установлен, я могу обнаруживать только события изменения. Я вижу основные / второстепенные числа 8,0 и 8,1. Добавление и удаление событий происходит с младшего номера 1 (только когда он отключен), а с второстепенным 0 я вижу только события изменения (всегда, без разницы, если установлен), и которые, похоже, происходят в режиме опроса (поведение "опроса" наблюдается только с второстепенным 0) (просто ухожу, смотрит. все еще смотрит на источник, чтобы убедиться, что он действительно опрашивает). Быстрая вставка и удаление при установке отправит только одно событие изменения.
Чтобы ответить на ваш вопрос "1": насколько я понимаю до сих пор, эти uevents отправляются из драйвера ядра, в частности, из среднего уровня scsi (drivers/scsi/scsi_lib.c). Я отследил это доvoid scsi_evt_thread(struct work_struct *work)
где он вызывает scsi_evt_emit() и в конечном итоге вызывает kobject_uevent_env(), который, насколько я понимаю, отвечает за распространение uevent в пользовательское пространство через сетевую ссылку.
Если вы все еще отлаживаете это, другая информация, которую я решил отметить, заключается в том, что scsi- это трехуровневая система. У вас есть самый верхний уровень, который для меня - это drivers/scsi/sd.c, средний уровень, который я вижу как drivers/scsi/scsi.c, и нижний уровень драйверов /usb/storage/usb.c (это основные файлы для каждого слоя, насколько я могу судить. Учусь по ходу дела).
Все еще пытаюсь выяснить, как конкретное событие устанавливается на конкретном устройстве scsi. Запускается ли сканирование шины прерыванием или существует поток, который просто непрерывно опрашивает изменения (tdb)?