This shows you the differences between two versions of the page.
ass:labs-2025:03:tasks:02 [2025/08/06 11:56] florin.stancu created |
ass:labs-2025:03:tasks:02 [2025/08/06 18:03] (current) radu.mantu |
||
---|---|---|---|
Line 1: | Line 1: | ||
==== 02. Enabling networking on iMX93 ==== | ==== 02. Enabling networking on iMX93 ==== | ||
- | Notice that the FRDM-iMX93 has two Ethernet ports. | + | Notice that the FRDM-iMX93 has two Ethernet ports. But if you boot your previous Buildroot distro and try to see the available network: ''ip link show'', notice that they are missing. Instead, you'll only have the loopback interface ''lo''. |
- | But if you boot your previous Buildroot distro and try to see the available network: ''ip link show'', notice that they are missing. | ||
- | TODO | + | In this task, you will have to debug the problem and try to fix it or at least find a workaround that lets you use your network interface. |
+ | Here are a few suggestions to get you started: | ||
+ | * Investigate your kernel's Device Tree Blob (dtb) and search for the ''ethernet'' node | ||
+ | * You can use the Device Tree Compiler tool **dtc** to convert between dtb and dts formats | ||
+ | * **dtc** is compiled automatically with Linux and can be found at ''linux/scripts/dtc/dtc'' | ||
+ | * Alternatively, it is packaged as ''dtc'' on Arch or ''device-tree-compiler'' on Ubuntu | ||
+ | * Use **dmesg** to view the kernel's boot log and search for any relevant messages | ||
+ | * ''grep -rn'' parts of any interesting message in the kernel's source to determine the context | ||
+ | * If you've compiled the kernel already, you can run ''./scripts/clang-tools/gen_compile_commands.py'' and it will generate a **compile_commands.json** file. This file can be used by your language server to allow you to *go to definition* or highlight code sections included in ''#ifdef''s. | ||
+ | * Try to identify the driver responsible for our network controller | ||
+ | * Remember that on ARM, drivers are matched to devices based on their ''compatible'' string from the DTB | ||
+ | * The driver must also have at least one of these strings written in its source files. | ||
+ | |||
+ | Once you are done, enable the **iperf3**, **iproute2** and **ethtool** network packages in Buildroot and build them. The compilation should not take more than 1-2 minutes. Re-generate ''linux.itb'' and copy it to the board's eMMC. | ||
+ | |||
+ | Connect to a colleague's board with an Ethernet cable. \\ | ||
+ | Use the ''ip'' command to **add** a static IP to your network interface (''man ip-address''). \\ | ||
+ | Then, use the ''iperf3'' tool to test the throughput and compare it to what **ethtool** advertises. \\ | ||
+ | Why is it not a full 1Gbps? | ||
+ | |||
+ | <spoiler Hint #1> | ||
+ | This line from **dmesg** tells us why the Network Interface Controller (NIC) remains unavailable. | ||
+ | |||
+ | <code> | ||
+ | [ 12.004678] platform 42890000.ethernet: deferred probe pending: platform: wait for supplier /soc@0/efuse@47510000/mac-address@4ec | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | <spoiler Hint #2> | ||
+ | The driver can be found at ''linux/drivers/net/ethernet/freescale/fec_main.c''. \\ | ||
+ | There, the ''fec_get_mac()'' function will tell you how the driver gets the NIC's MAC address. \\ | ||
+ | Try to provide it via another means, other than through the eFuse protected by the EdgeLink Enclave (that doesn't work). | ||
+ | </spoiler> | ||
+ | |||
+ | <spoiler Hint #3> | ||
+ | In ''linux/net/ethernet/eth.c'' look at the comments of the ''fwnode_get_mac_address()'' function. \\ | ||
+ | This will give you some alternatives for the ''nvmem-cells'' and ''nvmem-cell-names'' properties that block the driver initialization. \\ | ||
+ | Try spoofing the MAC address of [[https://gist.github.com/aallan/b4bb86db86079509e6159810ae9bd3e4|some vendor]]. | ||
+ | </spoiler> |