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 им