u-boot编译错误1:dtc: not found make

1.相关资料及开发环境

开发板:NanoPC-T3_plus

OS:Ubuntu20.04

参考资料:https://wiki.friendlyarm.com/wiki/index.php/NanoPC-T3_Plus/zh

2.编译U-Boot

     根据参考资料,用git克隆了U-Boot v2016.01源代码,切换到nanopi2-v2016.01分支。进入u-boot编译,过程如下:

#克隆u-boot仓库
git clone https://github.com/friendlyarm/u-boot.git 

#切换分支
cd u-boot git checkout nanopi2-v2016.01 

#编译配置
make s5p6818_nanopi3_defconfig

#用交叉编译器进行4线程编译
make -j4 CROSS_COMPILE=aarch64-linux-

3.编译错误

    在编译过程中产生如下如下错误:

/bin/sh: 1: dtc: not found
make[2]: *** [scripts/Makefile.lib:296: arch/arm/dts/s5p6818-drone.dtb] Error 127
make[1]: *** [dts/Makefile:36: arch-dtbs] Error 2
make: *** [Makefile:1249: dts] Error 2

4.错误原因

    uboot编译需要dtc相关命令的支持

    dtcdevice-tree-compiler的缩写,即设备树编译器,说明系统中没有安装这个编译器

5.解决方案

    安装设备树编译器即可

sudo apt-get install device-tree-compiler

6.编译结果

编译前:

fyywhy@CTO:/work/nanopc-t3-plus/u-boot$ ls
api     config.mk  drivers   include  Licenses     net      snapshot.commit
arch    configs    dts       Kbuild   MAINTAINERS  post     test
board   disk       examples  Kconfig  MAKEALL      README   tools
common  doc        fs        lib      Makefile     scripts

编译后:

fyywhy@CTO:/work/nanopc-t3-plus/u-boot$ ls
api        drivers            Kconfig      README           u-boot.cfg
arch       dts                lib          scripts          u-boot.lds
board      examples           Licenses     snapshot.commit  u-boot.map
common     fip-nonsecure.bin  MAINTAINERS  System.map       u-boot.srec
config.mk  fip-nonsecure.img  MAKEALL      test
configs    fs                 Makefile     tools
disk       include            net          u-boot
doc        Kbuild             post         u-boot.bin

编译成功,得到fip-nonsecure.img,可以通过fastboot、sd-fuse_s5p6818和eflasher ROM来更新板上的U-Boot v2016.01。

 

 

<think>好的,用户遇到了一个错误:“modprobe: FATAL: Module led not found in directory /lib/modules/4.19.190”。我需要先理解这个问题的背景和可能的原因。用户可能在尝试加载一个名为“led”的内核模块,但系统找不到该模块。 首先,我得考虑用户为什么会使用modprobe led。可能他们在尝试控制LED设备,比如在嵌入式系统或单板计算机(如树莓派)上。用户可能按照某个教程或文档操作,但模块不存在。这时候需要检查模块是否存在,或者是否有其他名称的模块。 接下来,我需要考虑可能的原因。首先,模块名称是否正确?比如,是否是leds某个子模块,比如led-class、led-trigger等。用户可能输入了错误的模块名。其次,内核配置是否支持该模块?如果内核编译时没有启用LED相关的驱动,模块自然不会存在。还有,用户的内核版本是4.19.190,可能该版本的内核中LED模块的命名方式不同,或者需要额外的配置。 然后,我应该建议用户检查/lib/modules/4.19.190目录下的模块。使用find命令或者modprobe的搜索功能来找相关模块。如果找不到,可能需要重新编译内核,启用LED支持,或者安装对应的内核头文件和模块。 另外,用户可能没有正确安装模块,或者内核模块未正确构建。在交叉编译环境中,可能存在路径问题,导致模块没有正确部署到目标设备的/lib/modules目录下。这时候需要检查编译配置和安装步骤是否正确。 可能用户还会混淆内核模块和设备树覆盖(如树莓派的dtoverlay),特别是如果他们在使用树莓派这样的设备,可能需要使用不同的方法来启用LED支持。例如,在config.txt中添加dtoverlay=...,而不是加载模块。 此外,用户可能尝试使用sysfs接口直接控制LED,而不需要加载额外的模块。比如通过/sys/class/leds路径,这需要内核配置了CONFIG_LEDS_CLASS,可能用户需要检查sysfs中的相关内容,而不是依赖模块。 最后,需要总结解决方案的步骤,包括检查模块名称、确认内核配置、重新编译安装模块,或者使用替代方法控制LED。同时,要考虑用户可能的知识水平,提供详细的命令示例,并解释每个步骤的意义,确保用户能够理解和跟随。</think>### 问题分析: 错误 `modprobe: FATAL: Module led not found` 表示系统在 `/lib/modules/4.19.190` 目录下找不到名为 `led` 的内核模块。可能原因包括: 1. 内核未编译 LED 相关驱动模块。 2. 模块名称不匹配(实际名称可能非 `led`)。 3. 内核模块未正确安装或路径错误--- ### 解决方法: #### 1. **确认模块名称** - LED 相关模块通常以 `leds_` 开头,例如: ```bash # 查找所有 LED 相关模块 find /lib/modules/$(uname -r) -name "leds_*.ko*" ``` - 常见模块名: - `leds-gpio`(通过 GPIO 控制 LED) - `leds-class`(通用 LED 接口) - `ledtrig-heartbeat`(LED 心跳触发模式) #### 2. **检查内核配置** - 确认内核编译时启用了 LED 支持: ```bash # 查看内核配置(需有 .config 文件) grep CONFIG_LEDS /lib/modules/$(uname -r)/build/.config ``` - 关键选项: ```ini CONFIG_LEDS_CLASS=y # 启用 LED 类支持 CONFIG_LEDS_GPIO=y # 启用 GPIO 控制的 LED CONFIG_LEDS_TRIGGERS=y # 启用 LED 触发模式(如闪烁) ``` #### 3. **加载正确的模块** - 尝试加载实际存在的模块(例如 `leds-gpio`): ```bash sudo modprobe leds-gpio ``` #### 4. **重新编译内核模块** - 若内核未包含 LED 驱动,需重新编译内核并启用相关选项: 1. 获取内核源码: ```bash sudo apt-get install linux-source-4.19.190 # 替换为实际版本 ``` 2. 配置内核: ```bash make menuconfig ``` - 启用选项: ```ini Device Drivers → LED Support → LED Class Support Device Drivers → LED Support → LED GPIO Support ``` 3. 编译并安装模块: ```bash make modules && sudo make modules_install ``` #### 5. **验证模块加载** - 查看已加载的 LED 相关模块: ```bash lsmod | grep led ``` - 检查 `/sys/class/leds` 目录(若存在,表示内核已支持 LED): ```bash ls /sys/class/leds ``` #### 6. **通过设备树(Device Tree)启用 LED** - 在嵌入式设备(如树莓派)中,LED 可能通过设备树配置: 1. 编辑设备树文件(如 `dts`),添加 LED 节点。 2. 编译并加载设备树: ```bash dtc -@ -I dts -O dtb -o led.dtbo led.dts sudo cp led.dtbo /boot/overlays/ ``` 3. 在 `/boot/config.txt` 中启用覆盖: ```ini dtoverlay=led ``` --- ### 扩展场景: - **手动控制 LED**(无需内核模块): ```bash # 通过 GPIO Sysfs 直接操作(例如 GPIO21) echo 21 | sudo tee /sys/class/gpio/export echo "out" | sudo tee /sys/class/gpio/gpio21/direction echo 1 | sudo tee /sys/class/gpio/gpio21/value # 点亮 LED ``` - **调试工具**: ```bash dmesg | grep led # 查看内核日志中 LED 相关的错误 modinfo leds-gpio # 查看模块信息 ``` --- ### 总结: 该错误的核心是内核未提供 `led` 模块,需通过以下步骤解决: 1. 确认正确的模块名称(如 `leds-gpio`)。 2. 检查内核配置并重新编译模块。 3. 嵌入式设备可能需要设备树配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值