RK3568 学习笔记 : 解决 linux_sdk 编译 python 版本报错问题

前言

python 版本选择

  • 由于 ubuntu 20.04 安装了两个 python 版本: python 2.7 与 python 3.8,默认执行 python,执行的是 python2.7,由于 【正点原子】 提供的 rk3568 的 Linux SDK 解压完,是个 .repo 文件夹,需要使用 repo 命令把源码文件提取出来,此时发现 .repo/repo/repo sync -l -j10 报错了,提示 python 的错误,此时 把 python 默认改为 python 3.8,正常工作

  • 参考 ubuntu 20.04 自由切换 python 的版本

  • 但是编译时,又遇到了几个小错误,比如 ./kernel/script

drivers/gpu/drm/bridge/synopsys/dw-hdmi-hdcp.o: In function `hdcp_load_keys_cb': /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-hdcp.c:281: undefined reference to `rk_vendor_read' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-hdcp.c:281:(.text+0x2b8): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `rk_vendor_read' drivers/mfd/rk630-i2c.o: In function `rk630_i2c_probe': /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/mfd/rk630-i2c.c:66: undefined reference to `rk630_efuse_regmap_config' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/mfd/rk630-i2c.c:66:(.text+0x180): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against undefined symbol `rk630_efuse_regmap_config' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/mfd/rk630-i2c.c:66: undefined reference to `rk630_efuse_regmap_config' drivers/input/sensors/sensor-dev.o: In function `sensor_calibration_data_read': /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/input/sensors/sensor-dev.c:81: undefined reference to `rk_vendor_read' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/input/sensors/sensor-dev.c:81:(.text+0x265c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `rk_vendor_read' drivers/input/sensors/sensor-dev.o: In function `sensor_calibration_data_write': /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/input/sensors/sensor-dev.c:66: undefined reference to `rk_vendor_write' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/input/sensors/sensor-dev.c:66:(.text+0x3154): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `rk_vendor_write' drivers/media/i2c/rk628_csi.o: In function `hdcp_load_keys_cb': /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/media/i2c/rk628_csi.c:606: undefined reference to `rk_vendor_read' /home/alientek/linux/tool/rk3568_linux_sdk/kernel/drivers/media/i2c/rk628_csi.c:606:(.text+0x1b74): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `rk_vendor_read' make: *** [Makefile:1174: vmlinux] Error 1
最新发布
06-17
<think>我们正在解决RK3568LinuxSDK内核编译时出现的未定义引用错误:`rk_vendor_read`和`rk630_efuse_regmap_config`。根据引用[1],我们注意到在编译内核时使用的是`./build.sh`脚本,该脚本会基于`RK_KERNEL_DEFCONFIG`生成`.config`文件。因此,我们需要检查内核配置中是否启用了相关选项。引用[2]和引用[3]提到了`vendor_storage`相关的操作,这提示我们这两个符号可能与VendorStorage功能相关。步骤:1.确认内核配置中是否启用了`CONFIG_ROCKCHIP_VENDOR_STORAGE`和`CONFIG_ROCKCHIP_EFUSE`(或类似)的配置选项。因为`rk_vendor_read`是VendorStorage模块的函数,而`rk630_efuse_regmap_config`可能与efuse(熔丝)相关。2.检查驱动代码是否被正确编译。这两个符号可能位于某个驱动文件中,如果该驱动没有被编译进内核,就会导致未定义引用。3.根据引用[1],修改配置的正确方法是修改`RK_KERNEL_DEFCONFIG`文件(即defconfig文件),而不是直接修改.config。具体操作:-找到内核的defconfig文件(通常位于`arch/arm64/configs/`或类似路径,具体取决于平台),例如`rockchip_linux_defconfig`。-在该defconfig文件中,确保有以下配置:```CONFIG_ROCKCHIP_VENDOR_STORAGE=yCONFIG_ROCKCHIP_EFUSE=y#或者类似的efuse配置,具体名称可能略有不同```如果找不到确切的配置名,可以尝试在defconfig文件中搜索`VENDOR`和`EFUSE`关键字。4.如果defconfig中已经启用了这些选项,那么可能是驱动代码本身的问题,比如函数名变更或代码缺失。需要检查内核源码中是否包含这些符号的定义。5.另外,引用[3]中提到了VendorStorage的应用文档(《RKVendorStorageApplicationNote》),我们可以参考该文档确认正确的配置和使用方法。如果上述配置已经存在,但问题仍然存在,则可能是代码版本问题。可能需要更新SDK或检查补丁。针对`rk630_efuse_regmap_config`,它可能是RK630芯片的efuse驱动的一部分。RK3568通常不会使用RK630,所以这个符号可能是误引入的。需要检查为什么需要这个符号,以及是否真的需要编译RK630的驱动。可能的原因:-在设备树中启用了RK630的相关节点,导致内核配置需要该驱动。-有某个驱动依赖了RK630的efuse驱动,但实际上不应该依赖。解决方案:-检查设备树中是否包含RK630的节点,如果有,并且不需要,则删除。-在defconfig中,确保没有启用RK630的驱动(例如`CONFIG_MFD_RK630`等),避免编译它。如果确实需要RK630驱动,那么需要确保该驱动被正确编译。可以查看驱动代码(如`drivers/mfd/rk630-core.c`)中是否有`rk630_efuse_regmap_config`的定义。总结步骤:1.检查并修改defconfig,确保启用VendorStorage和正确的efuse驱动(针对RK3568的efuse,而不是RK630)。2.检查设备树,移除不必要的RK630节点(如果有)。3.重新编译内核。如果问题仍然存在,需要检查驱动代码的版本和补丁。根据引用[3],我们还可以参考《Rockchip_Developer_FAQ_Storage_CN.pdf》和《Rockchip_Application_Notes_Storage_CN.pdf》来获取更多帮助。注意:在修改defconfig后,需要重新运行`./build.sh`(或相应的编译命令)来重新生成.config并编译内核。如果以上方法不能解决,可能需要查看具体的错误发生的位置(哪个驱动或模块引用了这些符号),然后进一步分析。</think>### 解决RK3568内核编译中未定义符号错误 根据您的编译错误信息和Rockchip SDK文档,以下是系统性的解决方案: --- ### **1. 检查内核配置选项** 这两个符号与Rockchip的Vendor Storage和EFUSE驱动相关: ```bash # 检查defconfig配置 grep -E "VENDOR_STORAGE|EFUSE" arch/arm64/configs/rockchip_linux_defconfig # 确保存在以下配置项: CONFIG_ROCKCHIP_VENDOR_STORAGE=y CONFIG_ROCKCHIP_EFUSE=y # 或类似EFUSE配置 ``` 若缺失,需在`rockchip_linux_defconfig`中添加(**引用[1]**中提到的关键配置)。 --- ### **2. 验证驱动源码编译** 符号定义位于以下驱动文件中: - **`rk_vendor_read`**:`drivers/soc/rockchip/rockchip-vendor-storage.c` - **`rk630_efuse_regmap_config`**:`drivers/mfd/rk630-core.c` 检查Makefile确保驱动被编译: ```makefile # 检查 drivers/soc/rockchip/Makefile obj-$(CONFIG_ROCKCHIP_VENDOR_STORAGE) += rockchip-vendor-storage.o # 检查 drivers/mfd/Makefile obj-$(CONFIG_MFD_RK630) += rk630-core.o ``` --- ### **3. 排查依赖关系** - **设备树配置**:确认设备树中启用了Vendor Storage: ```dts &vendor_storage { status = "okay"; }; ``` - **符号导出检查**:在驱动源码中确认符号已导出: ```c // rockchip-vendor-storage.c EXPORT_SYMBOL(rk_vendor_read); // 必须有此声明 ``` --- ### **4. 编译流程修正** 根据**引用[1]**建议: 1. 使用SDK提供的编译脚本: ```bash ./build.sh # 确保脚本正确加载配置 ``` 2. 清理后完整编译: ```bash make clean make rockchip_linux_defconfig make -j$(nproc) ``` --- ### **5. 排查SDK版本兼容性** - 检查《Rockchip_Developer_FAQ_Storage_CN.pdf》(**引用[3]**)确认: - SDK版本是否匹配硬件(RK3568) - 是否有已知的符号变更(如函数名更新) - 若问题仍存在,尝试更新SDK或应用补丁 --- ### **根本原因总结** | 错误符号 | 所属模块 | 解决方案 | |---------|----------|----------| | `rk_vendor_read` | Vendor Storage驱动 | 启用`CONFIG_ROCKCHIP_VENDOR_STORAGE` | | `rk630_efuse_regmap_config` | RK630 EFUSE驱动 | 检查`CONFIG_MFD_RK630`配置 | > **提示**:RK3568通常**无需RK630驱动**,若设备树中误启用RK630节点,需将其`status`设为`disabled`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsz_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值