目录
- 1 编译环境及源码版本
- 2 移植Linux 5.15.71遇到问题
- 2.1 imx-sdma 20ec000.dma-controller: Direct firmware load for imx/sdma/sdma-imx6q.bin failed with error -2
- 2.2 cfg80211: failed to load regulatory.db
1 编译环境及源码版本
1. uboot-alientek-v2022.04
2. linux-alientek-5.15.71.tar
3. buildroot-2024.02.4
4. Ubuntu-18.04.6
2 移植Linux 5.15.71遇到问题
2.1 imx-sdma 20ec000.dma-controller: Direct firmware load for imx/sdma/sdma-imx6q.bin failed with error -2
系统启动完成后,出现如上错误,如下图所示:
百度下出现上述错误信息原因如下:
Linux-4.9.88 目录下有目录 firmware,是用来存放不开源的固件的;对与 5.x 的内核,将这个目录去除了,因此对于Linux 5.15.71版本的源码需要手动增加此目录,sdma-imx6q.bin 是 NXP官方的 sdma 固件,没有开源。
1. 在Linux 5.15.71源码文件中搜索imx-sdma 20ec000,在mx6ul.dtsi 文件中找到如下代码下图所示:
- 在Linux源码目录下新建 firmware/imx/sdma 目录,如下图所示:
3. 下载sdma-imx6q.bin文件,打开Kernel.org git repositories网站,点击plain下载sdma-imx6q.bin文件,如下图所示:
3. 将下载好的sdma-imx6q.bin文件拷贝到firmware/imx/sdma目录下,如图所示:
4. 修改Linux配置文件(imx_alientek_emmc_defconfig),增加以下两条语句,如下图所示:
CONFIG_EXTRA_FIRMWARE_DIR="firmware"
CONFIG_EXTRA_FIRMWARE="imx/sdma/sdma-imx6q.bin"
5. 对修改的Linux源码重新编译,编译过程如下图所示:
6. 将编译好的Linux镜像文件(zImage)和设备树文件(imx6ull-alientek-emmc.dtb)下载到ALIENTEK开发板,启动完成后如下图所示:
由上图可知, ”imx-sdma 20ec000.dma-controller: Direct firmware load for imx/sdma/sdma-imx6q.bin failed with error -2“ 错误已经解决,但是又出现了 ”cfg80211: failed to load regulatory.db“ 错误。
2.2 cfg80211: failed to load regulatory.db
这个错误信息表明Linux内核的cfg80211配置组件在尝试加载规范数据库regulatory.db时失败了。cfg80211是无线电规范配置的核心部分,regulatory.db文件包含了各种国家和地区的无线电规范规定。这个问题通常发生在加载内核模块时,比如在启动过程中或者通过modprobe
命令手动加载cfg80211模块时。
可能的原因包括:
-
regulatory.db文件缺失或损坏。
-
文件系统权限问题,导致内核无法读取该文件。
-
内核配置问题,可能是内核编译时未包含相应的配置。
解决方法:
-
确认文件存在:检查
/lib/firmware/
目录下是否有regulatory.db文件。 -
文件权限:确保内核有足够的权限去读取regulatory.db文件。
-
重新编译内核:如果是内核配置问题,可能需要重新编译内核,确保包含了无线电规范的支持。
-
手动加载文件:尝试手动加载regulatory.db文件,可以使用
modprobe
命令。 -
更新固件:有时候固件更新能解决这类兼容性问题。
通过检查Linux 5.15.71内核源码,发现/lib目录下并没有firmware目录,解决办法是手动创建/lib/firmware/目录并从https://mirrors.edge.kernel.org/网站下载最新的包,解压后将文件 regulatory.db 和 regulatory.db.p7s 复制到新建的/lib/firmware中,如下图所示:
修改Linux内核配置文件imx_alientek_emmc_defconfig中CONFIG_CFG80211=y 修改为 CONFIG_CFG80211=m,即将内核加载 regulatory database 更改为模块加载 regulatory database ,修改内容如下图所示:
重新编译Linux内核源码,将编译好的Linux镜像文件下载到ALIENTEK-ALPHA开发板,重启后如下图所示:
由上图可知, “cfg80211: failed to load regulatory.db“ 错误已经解决。