WiFi
В: Как подключить WiFi-модуль на чипе RTL8821CS к SoM через интерфейс SDMMC2?
О: RTL8821CS использует SDIO. На RK3568 контроллер SDMMC2 может использоваться для SDIO-устройств; системную загрузку RK3568 через SDMMC2 не поддерживает.
Минимально в узле &sdmmc2 должны быть настроены:
bus-width = <4>для четырёхбитной SDIO-шины;non-removable, поскольку WiFi-модуль распаян на плате и не имеет механического card-detect;корректная pinctrl-группа SDMMC2;
питание самого модуля через
vmmc-supply, если оно управляется регулятором;питание/уровень сигнальных линий через
vqmmc-supply, если VCCIO управляется регулятором;status = "okay".
Для SDIO обычно также используется cap-sdio-irq, если контроллер и схема используют штатное SDIO interrupt signalling.
Свойства no-sd и no-mmc не переводят контроллер в отдельный «режим SDIO». Они только запрещают MMC core выполнять инициализацию SD-карт и eMMC/MMC на этом хосте. Для распаянного SDIO WiFi их можно использовать, чтобы ограничить поиск устройства только SDIO.
Пример:
&sdmmc2 { bus-width = <4>; non-removable; no-sd; no-mmc; cap-sdio-irq; keep-power-in-suspend; pinctrl-names = "default"; pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>; /* * Имена регуляторов приведены как пример. * Они должны соответствовать схеме конкретной платы. */ vmmc-supply = <&wifi_vcc>; vqmmc-supply = <&wifi_vccio>; status = "okay"; };
Если включение RTL8821CS выполняется отдельным сигналом WL_REG_ON/WIFI_EN, последовательность питания следует описать через соответствующий regulator или mmc-pwrseq, в зависимости от схемы платы.
Дочерний узел:
wifi@1 { reg = <1>; };
не требуется для обнаружения RTL8821CS драйвером rtw88: устройство определяется по SDIO Vendor ID / Device ID. Такой дочерний узел имеет смысл только тогда, когда для конкретного устройства необходимо описать дополнительные свойства, например отдельную линию HOST_WAKE.
Отдельный HOST_WAKE GPIO нельзя путать со штатным SDIO interrupt. Драйвер rtw88 принимает рабочие прерывания устройства через механизм SDIO IRQ. Если на модуле дополнительно выведен HOST_WAKE, его назначение и описание в DTS должны соответствовать схеме платы и поддержке используемого ядра.
В: Драйвер rtw88_8821cs загружается, интерфейс появляется, но CLK и CMD линии SDMMC2 молчат после загрузки ОС (сигнал есть только в barebox).
О: Нет. Если SDIO-устройство уже определилось и появился сетевой интерфейс, отсутствие постоянных импульсов на CLK и CMD в состоянии простоя не является признаком неисправности.
MMC/SDIO host может останавливать тактирование между транзакциями. Поэтому SDIO CLK следует контролировать во время реального обращения к устройству, например при поднятии интерфейса или сканировании сетей:
ip link set wlan0 up iw dev wlan0 scan
Для диагностики сначала следует проверить, что SDIO-функция действительно перечислена ядром:
dmesg | grep -Ei 'mmc|sdio|rtw88|8821' ls /sys/bus/sdio/devices/ ip link
Если SDIO-устройство вообще не появляется, проверяются:
питание RTL8821CS;
сигнал аппаратного enable/reset, если он предусмотрен схемой;
соответствие напряжения VCCIO уровню SDIO-модуля;
pinctrl для
CLK,CMD,D0...D3;bus-width;non-removable;mmc-pwrseq, если модулю требуется отдельная последовательность включения;наличие pull-up на линиях, для которых это требуется SD/SDIO-интерфейсом;
сообщения MMC core в
dmesg.
Для RK3568 стандартные pinctrl-группы SDMMC2 уже задают pull-up для CMD/DAT. Внешние подтяжки должны определяться схемотехникой и требованиями конкретного WiFi-модуля, а не добавляться только потому, что на осциллографе отсутствует активность в состоянии idle.
Наличие в исходниках файла rtw8821cs.c также не означает, что драйвер включён в конкретную конфигурацию ядра. Проверить конфигурацию можно так:
zcat /proc/config.gz | grep RTW88
либо в каталоге сборки:
grep RTW88 .config
Для RTL8821CS должен быть включён CONFIG_RTW88_8821CS; необходимые RTW88/SDIO-зависимости выбираются Kconfig.
В: Ошибка при загрузке драйвера: Direct firmware load for rtw88/rtw8821c_fw.bin failed with error -2.
О: Драйвер не нашёл файл firmware:
rtw88/rtw8821c_fw.bin
Код -2 соответствует ENOENT — файл отсутствует по пути, в котором Linux firmware loader ищет прошивки.
Проверить наличие файла можно так:
ls -l /lib/firmware/rtw88/rtw8821c_fw.bin ls -l /usr/lib/firmware/rtw88/rtw8821c_fw.bin
Конкретный способ установки зависит от дистрибутива:
в Debian файл входит в пакет
firmware-realtek;в Buildroot необходимо включить соответствующий firmware из
linux-firmwareлибо добавить файл в rootfs другим штатным способом.
После добавления firmware необходимо перезагрузить модуль драйвера или систему.
В драйвере rtw88 для RTL8821C им