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