Partie WIFI de la carte M.2 combo Wifi+BT du NanoPi R5C non reconnue par debian trixie

Tags: #<Tag:0x00007fc9f1c628f8> #<Tag:0x00007fc9f1c62470> #<Tag:0x00007fc9f1c61c28>

Bonjour,

J’ai un soucis pour accéder à la carte Wifi du NanoPi R5C.
C’est une carte M.2 qui fait à la fois bluetooth via le port USB et WIFI via le port PCIe.
La partie bluetooth est bien reconnue par le noyau, mais pas la partie WIFI par le bus PCIe.

Voici ce que sort la sortie de la commande lspci :

root@nanopi:~# lspci
0000:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0001:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0001:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
0002:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0002:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

Alors qu’avec l’OS fourni par le constructeur (FriendlyElec), la commande lspci trouve bien la carte sur le bus 0000:01:00.0 :

root@FriendlyWrt:~# lspci
0000:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0000:01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8822CE 802.11ac PCIe Wireless Network Adapter
0001:10:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0001:11:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
0002:20:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0002:21:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
root@FriendlyWrt:~#
root@FriendlyWrt:~# lspci -k -s 0000:01:00.0
0000:01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8822CE 802.11ac PCIe Wireless Network Adapter
        Subsystem: AzureWave Device 3751
        Kernel driver in use: rtw_8822ce
        Kernel modules: rtw_8822ce
root@FriendlyWrt:~#

Je dispose bien des drivers pour la carte RealTek 8822ce fournis par le paquet firmware-realtek du dépôt non-free-firmware de debian trixie, mais j’ai beau charger le driver, la carte WIFI n’apparaît toujours pas dans la liste du matériel PCI :

root@nanopi:~# modprobe rtw88_8822ce
root@nanopi:~# modinfo rtw88_8822ce
filename:       /lib/modules/6.5.0-5-arm64/kernel/drivers/net/wireless/realtek/rtw88/rtw88_8822ce.ko
license:        Dual BSD/GPL
description:    Realtek 802.11ac wireless 8822ce driver
author:         Realtek Corporation
alias:          pci:v000010ECd0000C82Fsv*sd*bc*sc*i*
alias:          pci:v000010ECd0000C822sv*sd*bc*sc*i*
depends:        rtw88_pci,rtw88_8822c
intree:         Y
name:           rtw88_8822ce
vermagic:       6.5.0-5-arm64 SMP mod_unload modversions aarch64
sig_id:         PKCS#7
signer:         Debian Secure Boot CA
sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo:   sha256
signature:      81:5B:33:40:E2:15:F5:C8:60:E6:0D:4D:29:0D:D2:4F:15:50:F6:E9:
                BC:7E:6E:3D:7A:E6:25:C6:D5:D0:BD:B7:B7:70:79:0D:B0:34:C8:2D:
                C9:93:D9:33:2E:EE:07:B5:CA:09:B5:7A:05:21:51:07:FD:18:EE:21:
                91:CC:2C:D6:38:2F:4B:63:DE:55:4D:4A:5B:91:87:68:84:CB:2F:14:
                C5:D3:E0:C1:6D:FA:41:68:82:EC:6B:52:60:93:D2:97:27:C5:72:93:
                7D:D2:0B:75:B6:97:88:6C:8E:3F:0E:47:A9:AC:2C:97:95:99:76:08:
                8A:C9:84:24:06:3E:B7:03:5E:05:BB:01:A2:E4:6E:FC:0B:CE:1C:49:
                02:1B:7E:0A:D1:7F:10:7D:91:8A:9C:F7:92:CF:65:5B:75:F0:0E:23:
                E5:61:A8:06:F6:F3:CC:64:DC:CA:B6:28:9E:EF:16:DC:9C:A0:72:F1:
                9F:3B:D8:BC:A8:D1:18:3A:EA:25:CA:7D:8D:9F:17:63:00:86:EC:BA:
                2A:73:8F:A1:09:C5:0C:7B:83:46:92:63:CC:71:84:3D:E6:4D:A7:47:
                83:A9:45:D5:60:BB:0D:7F:9F:FA:A8:30:9B:DF:60:96:BB:42:AF:BE:
                04:34:A1:A2:D7:F0:D2:6A:D8:95:44:7A:EC:AB:85:86
root@nanopi:~#
root@nanopi:~# lsmod | grep -i rtw  
rtw88_8822ce           12288  0
rtw88_8822c           462848  1 rtw88_8822ce
rtw88_pci              24576  1 rtw88_8822ce
rtw88_core            155648  2 rtw88_pci,rtw88_8822c
mac80211              909312  2 rtw88_pci,rtw88_core
cfg80211              831488  2 rtw88_core,mac80211
root@nanopi:~#
root@nanopi:~# lspci
0000:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0001:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0001:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)
0002:00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3568 Remote Signal Processor (rev 01)
0002:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

Savez-vous comment faire pour que le système la reconnaisse et l’affiche dans la liste des matériels PCI ?

Il semblerait sur l’OS de FriendlyElec que ce soit le module dhd (Dongle Host Driver) qui active le wifi :

[   15.810774] procd: - init -
Please press Enter to activate this console.
[   15.905754] urngd: v1.0.2 started.
[   16.219604] kmodloader: loading kernel modules from /etc/modules.d/*
[   16.271889] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   16.277155] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[   16.280741] [dhd] STATIC-MSG) dhd_static_buf_init : 101.10.361.18 (wlan=r892223-20220519-1)
[   16.281143] [dhd] STATIC-MSG) dhd_init_wlan_mem : prealloc ok for index 0: 8131584(7941K)
[   16.325629] [dhd] _dhd_module_init: in Dongle Host Driver, version 101.10.361.20 (wlan=r892223-20220701-3)
[   16.325629] drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd compiled on Mar 14 2023 at 21:50:05
[   16.325629] 
[   16.325682] [dhd] ANDROID_VERSION = 12
[   16.325692] [dhd] ======== dhd_wlan_init_plat_data ========
[   16.325698] [WLAN_RFKILL]: rockchip_wifi_get_oob_irq: Enter
[   16.325704] [WLAN_RFKILL]: rockchip_wifi_get_oob_irq: rfkill-wlan driver has not Successful initialized
[   16.325710] dhd_wlan_init_gpio: unknown oob irqflags !
[   16.325716] [dhd] dhd_wlan_init_gpio: WL_HOST_WAKE=-1, oob_irq=-1, oob_irq_flags=0x0
[   16.325720] [dhd] dhd_wlan_init_gpio: WL_REG_ON=-1
[   16.325726] [dhd] dhd_wifi_platform_load: Enter
[   16.325847] [dhd] No Broadcom PCI device enumerated!
[   16.325889] [dhd] dhd_wifi_platform_load_pcie: pcie_register_driver failed
[   16.325897] [dhd] unregister wifi platform drivers
[   16.325903] [dhd] wifi_platform_bus_enumerate device present 0
[   16.325908] [dhd] ======== Card detection to remove PCIE card! ========
[   16.325913] [dhd] ======== dhd_wlan_deinit_plat_data ========
[   16.325919] [dhd] dhd_wlan_deinit_gpio: gpio_free(WL_HOST_WAKE 0)
[   16.325935] [dhd] _dhd_module_init: Failed to load the driver, try cnt 0
[   16.325962] [dhd] _dhd_module_init: Failed to load driver max retry reached**
[   16.325968] [dhd] _dhd_module_init: Exit err=-1
[   16.341944] Intel(R) Wireless WiFi driver for Linux
[...]
[   16.633610] rtw_8822ce 0000:01:00.0: enabling device (0000 -> 0003)
[   16.635243] rtw_8822ce 0000:01:00.0: WOW Firmware version 9.9.4, H2C version 15
[   16.636507] rtw_8822ce 0000:01:00.0: Firmware version 9.9.11, H2C version 15

D’après ces logs, il serait dans le répertoire drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd .

Mais impossible de le trouver dans les dépôts debian.
En plus, il semble s’agir d’un driver pour Android 12 !

D’après ce site : Reverse-engineering Broadcom wireless chipsets , il y aurait des drivers équivalent pour Linux :

On the driver side, we can split the set of bcm43xxx drivers in two categories; Open source and proprietary.

Open source:
- b43 (reversed from proprietary wl / old SoftMAC / Linux)
- brcmsmac (SoftMAC / Linux)
- brcmfmac (FullMAC / Linux)
- bcmdhd ( FullMAC / Android)

Proprietary:
- broadcom-sta aka ‹ wl › ( SoftMAC && FullMAC / Linux)

Mais impossible de mettre la main sur l’un de ces drivers…

Le plus étrange d’ailleurs, c’est que je ne pense pas qu’il y ait une quelconque puce Broadcom dans le NanoPi R5C. :thinking:

Je continue mes investigations…

D’après la sortie lspci de mon premier post, il semble que le système ne détecte absolument rien sur le bus 0000:01, même pas un périphérique inconnu. :unamused:

Du coup, j’ai cherché du côté de l’équivalent du BIOS pour les systèmes ARM, soit ici U-Boot et son Device Tree.

Dans les sources de l’U-Boot de FriendlyElec, on trouve un fichier rk3568-nanopi5-rev02.dts qui contient entre autre la rubrique suivante :

m2_wlan_radio: m2-wlan-radio {
	compatible = "rfkill-gpio";
	type = "wlan";
	shutdown-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
};

Or je n’ai rien trouvé d’équivalent dans le fichier DTB fourni par le noyau linux de Debian trixie :
/usr/lib/linux-image-6.5.0-5-arm64/rockchip/rk3568-nanopi-r5c.dtb

Pour info, pour convertir un fichier DTB en fichier DTS pour pouvoir le lire, il faut exécuter la commande suivante :

dtc -I dtb -O dts -o rk3568-nanopi-r5c.dts rk3568-nanopi-r5c.dtb

Le problème, c’est que je ne sais pas comment réintégrer les paramètres de la carte M2 dans le fichier DTS du noyau et recompiler correctement le fichier DTB correspondant. :grimacing:

Le mieux serait peut-être de récupérer le fichier DTB de la version FriendlyElec, mais je n’ai pas réussi à mettre la main dessus car il doit être caché dans les partitions non lisibles de l’image disque :

$ sudo parted -s rk3568-sd-friendlywrt-22.03-20230704.img print
Model:  (file)
Disk rk3568-sd-friendlywrt-22.03-20230704.img: 1000MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name      Flags
 1      8389kB  12,6MB  4194kB               uboot
 2      12,6MB  16,8MB  4194kB               misc
 3      16,8MB  21,0MB  4194kB               dtbo
 4      21,0MB  37,7MB  16,8MB               resource
 5      37,7MB  79,7MB  41,9MB               kernel
 6      79,7MB  113MB   33,6MB               boot
 7      113MB   147MB   33,6MB               recovery
 8      147MB   751MB   604MB   ext4         rootfs
 9      751MB   1000MB  249MB   ext4         userdata

Je n’ai pas réussi à extraire les partitions autres que ext4.

Bonjour,

Les histoires de Device Tree me semblent toujours autant être incompréhensibles, cependant :

$ parted -s rk3568-sd-friendlywrt-22.03-20230908.img unit s print
Model:  (file)
Disk .../rk3568-sd-friendlywrt-22.03-20230908.img: 1953124s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start     End       Size      File system  Name      Flags
 1      16384s    24575s    8192s                  uboot
 2      24576s    32767s    8192s                  misc
 3      32768s    40959s    8192s                  dtbo
[...]

$ 
$ dd if=rk3568-sd-friendlywrt-22.03-20230908.img bs=512 skip=16384 count=8192 of=uboot.extract
8192+0 records in
8192+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.0694905 s, 60.4 MB/s
$
$ binwalk uboot.extract

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Flattened device tree, size: 3072 bytes, version: 17
878200        0xD6678         CRC32 polynomial table, little endian
950712        0xE81B8         Android bootimg, kernel size: 1919249152 bytes, kernel addr: 0x5F6C656E, ramdisk size: 1919181921 bytes, ramdisk addr: 0x5700635F, product name: ""
[...]
4062720       0x3DFE00        Flattened device tree, size: 14321 bytes, version: 17

$ 
$ dd if=uboot.extract bs=1 skip=4062720 of=uboot.dtb
131584+0 records in
131584+0 records out
131584 bytes (132 kB, 128 KiB) copied, 0.320595 s, 410 kB/s
$ 
$ dtc -s -I dtb uboot.dtb -O dts -o uboot.dts
uboot.dts: Warning (spi_bus_bridge): /sfc@fe300000: node name for SPI buses should be 'spi'
uboot.dts: Warning (spi_bus_reg): Failed prerequisite 'spi_bus_bridge'
[...]


AnonymousCoward

1 J'aime

Merci beaucoup @AnonymousCoward ! :smiley:
Je ne connaissais pas du tout le programme binwalk. :ok_hand:
J’essayais désespérément de monter l’image (par exemple dtbo.extract ou boot.extract) avec la commande mount:confused:

Je vais regarder ça !

Bon, malheureusement, après analyse rapide du fichier uboot.extract, je n’ai rien trouvé qui ressemble de près ou de loin à ma carte M.2 ou à un module WIFI. :roll_eyes:

Il va falloir que je creuse un peu plus…

A propos des Device Tree, cette vidéo est super intéressante :

Bootlin - Device Tree 101 : https://www.youtube.com/live/a9CZ1Uk3OYQ


AnonymousCoward

1 J'aime

Merci @AnonymousCoward.
J’ai de quoi m’occuper… presque 2h de vidéo.
Je vais regarder ça tranquillement, mais la vidéo a en effet l’air très intéressante. :wink:

@AnonymousCoward , super vidéo ! :+1: :+1: :+1:
Merci beaucoup pour le partage.

J’ai creusé la piste du Device Tree, mais elle n’a pas abouti.

J’ai essayé le script d’installation : Stock Debian ARM64 Linux for the NanoPi R5C & R5S et avec quelques adaptations (qui vont être intégrées aux script initial), la partie WIFI de la carte M.2 combo Wifi+BT est enfin reconnue ! :smiley:

Les adaptations à faire sont ici : wlan0 not being recognized.

Manque de pôt, elles ne fonctionnent pas avec mon installation personnelle… :unamused:

Chez moi, le firmware n’est pas correctement chargé :

kernel: pcieport 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring
kernel: pci 0000:01:00.0: [10ec:c822] type 00 class 0x028000
kernel: pci 0000:01:00.0: reg 0x10: [io  0x1000-0x10ff]
kernel: pci 0000:01:00.0: reg 0x18: [mem 0xf4300000-0xf430ffff 64bit]
kernel: pci 0000:01:00.0: supports D1 D2
kernel: pci 0000:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold
kernel: pci_bus 0000:01: busn_res: [bus 01-ff] end is updated to 01
kernel: pcieport 0000:00:00.0: BAR 14: assigned [mem 0xf4300000-0xf43fffff]
kernel: pcieport 0000:00:00.0: BAR 13: assigned [io  0x1000-0x1fff]
kernel: pci 0000:01:00.0: BAR 2: assigned [mem 0xf4300000-0xf430ffff 64bit]
kernel: pci 0000:01:00.0: BAR 0: assigned [io  0x1000-0x10ff]
kernel: rtw_8822ce 0000:01:00.0: enabling device (0000 -> 0003)
kernel: rtw_8822ce 0000:01:00.0: firmware: direct-loading firmware rtw88/rtw8822c_wow_fw.bin
kernel: rtw_8822ce 0000:01:00.0: WOW Firmware version 9.9.4, H2C version 15
kernel: rtw_8822ce 0000:01:00.0: firmware: direct-loading firmware rtw88/rtw8822c_fw.bin
kernel: rtw_8822ce 0000:01:00.0: Firmware version 9.9.15, H2C version 15
kernel: rtw_8822ce 0000:01:00.0: error beacon valid
kernel: rtw_8822ce 0000:01:00.0: failed to download rsvd page
kernel: rtw_8822ce 0000:01:00.0: failed to download firmware
kernel: rtw_8822ce 0000:01:00.0: failed to setup chip efuse info
kernel: rtw_8822ce 0000:01:00.0: failed to setup chip information
kernel: rtw_8822ce: probe of 0000:01:00.0 failed with error -16

J’ai une erreur : « error beacon valid », mais impossible de trouver de l’information là dessus.

La suite se situe ici : Problème pour charger le firmware Realtek rtw88

Le problème venait de l’installation automatique par debootstrap du paquet isc-dhcp-client.

Supprimer ce paquet a corrigé le problème.