Buildroot for RK3399/zh

1 Buildroot简介

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,由Makefile脚本和Kconfig配置文件构成,旨在简化系统制作步骤,可实现一站式生成可烧写的系统固件,最终的固件包含boot-loader、kernel和rootfs,以及rootfs中的各种库和应用程序 (例如qt, gstreamer, busybox等)。

由 FriendlyELEC 提供的 Buildroot 项目是基于Rockchip原厂的 linux-sdk 制作, 项目使用 git 管理,与原厂的linux sdk更新保持同步; 

2 下载体验版固件

访问此处的下载地址下载:

Image Files
rk3399-sd-buildroot-linux-4.4-arm64-YYYYMMDD.img.zip 从SD卡启动的固件
rk3399-eflasher-buildroot-YYYYMMDD.img.zip 用于烧写到eMMC运行

解压后用 dd 或者 win32image 烧写到 SD 卡。

3 帐户与密码

用户名: root
密码: rockchip
 

4 获取项目源代码

4.1 安装 repo 工具

首先需要安装 repo 工具:

git clone https://github.com/friendlyarm/repo
cp repo/repo /usr/bin/

4.2 下载项目源代码

有以下两种途径获取项目源代码,中国大陆用户建议使用方法1的途径下载:

4.2.1 方法一:使用网盘里的repo压缩包

网盘下载地址: 

<think>我们有一个驱动模块的Makefile,需要修改以支持交叉编译。用户已经提供了Makefile的内容,并且从引用中我们可以看到交叉编译的关键是设置ARCH、CROSS_COMPILE和KSRC(内核源码路径)。 用户提到遇到了CROSS_COMPILE路径错误的问题,因此我们需要确保CROSS_COMPILE变量设置正确。 根据用户提供的Makefile,我们看到其中已经设置了一些变量: ``` SUBARCH := $(shell uname -m | sed -e "s/i.86/i386/; s/ppc.*/powerpc/; s/armv.l/arm/; s/aarch64/arm64/; s/loong.*64/loongarch/;") ARCH = arm64 CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-gcc KSRC = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/kernel ``` 这里,CROSS_COMPILE被设置成了一个具体的gcc编译器的完整路径,但是通常CROSS_COMPILE应该是一个工具链的前缀,而不是完整的路径。例如,交叉编译工具链的前缀可能是`aarch64-linux-gnu-`,然后编译器就是`aarch64-linux-gnu-gcc`,链接器是`aarch64-linux-gnu-ld`等。 在Makefile中,我们通常这样设置: ``` CROSS_COMPILE = /path/to/toolchain/bin/aarch64-linux-gnu- ``` 注意末尾的连字符(-),这样在编译时,编译器就会是`$(CROSS_COMPILE)gcc`,链接器是`$(CROSS_COMPILE)ld`。 但是,在用户提供的Makefile中,CROSS_COMPILE被设置成了gcc的完整路径,这会导致在构建内核模块时,调用编译器时出现错误,因为内核的Makefile会使用`$(CROSS_COMPILE)gcc`,这样就会变成: ``` /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-gccgcc ``` 这显然是错误的。 因此,我们需要修改CROSS_COMPILE的值为工具链的路径加上前缀,并且确保以连字符结尾。 另外,ARCH变量已经设置为arm64,这是正确的。 但是,我们注意到在Makefile中,有这样一个条件判断: ``` ifeq ($(shell test $(CONFIG_RTW_ANDROID) -gt 0; echo $$?), 0) EXTRA_CFLAGS += -DCONFIG_RTW_ANDROID=$(CONFIG_RTW_ANDROID) endif ``` 以及后面的一些条件设置,这些可能不需要修改。 修改建议: 1. 将CROSS_COMPILE修改为工具链的目录加上前缀,并且以连字符结尾。例如: ``` CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- ``` 2. 确保在调用make时,使用`-C $(KSRC)`指定内核源码路径,并且通过`M=$(PWD)`指定模块源码路径。 3. 另外,在Makefile中,我们看到有`CC := $(CROSS_COMPILE)gcc`这样的定义吗?实际上,在内核的Makefile中,它会使用`$(CROSS_COMPILE)gcc`,所以我们只需要设置CROSS_COMPILE为前缀即可。 4. 注意,在用户提供的Makefile中,已经设置了KSRC,这个路径应该是正确的。 5. 在Makefile的后面,编译模块的部分如下: ``` modules: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules ``` 这里,我们传递了ARCH和CROSS_COMPILE给内核的Makefile,同时指定了内核源码目录和模块目录。 但是,由于我们修改了CROSS_COMPILE的值为前缀,那么在内核的Makefile中,就会正确使用`$(CROSS_COMPILE)gcc`。 因此,具体修改如下: 在Makefile中找到: ``` CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-gcc ``` 修改为: ``` CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- ``` 注意:末尾加上一个连字符,并且去掉最后的`gcc`,因为在内核构建时,会自动添加`gcc`等工具名。 这样修改后,应该可以解决CROSS_COMPILE路径错误的问题。 另外,我们还需要确保内核源码路径(KSRC)是正确的,并且该内核已经为arm64架构配置并编译过,这样在构建模块时才能使用正确的头文件和配置。 最后,由于用户是在x86主机上编译arm64的模块,所以必须使用交叉编译工具链和对应的内核源码。 总结修改步骤: 1. 修改CROSS_COMPILE变量,确保它是一个以连字符结尾的工具链前缀(包含完整路径)。 2. 检查KSRC变量,确保它指向目标平台(arm64)的内核源码目录,并且该内核已经编译过(至少配置过,生成了必要的头文件和符号链接)。 3. 运行`make clean`,然后运行`make`进行交叉编译。 注意:如果工具链的路径中包含空格或其他特殊字符,需要适当处理,但这里路径没有空格。 如果用户希望更灵活地设置这些变量,也可以考虑通过命令行参数传递,例如: ``` make ARCH=arm64 CROSS_COMPILE=/path/to/toolchain/bin/aarch64-buildroot-linux-gnu- KSRC=/path/to/kernel ``` 这样就不需要修改Makefile。但是,根据用户提供的Makefile,这些变量已经在Makefile中设置,所以修改Makefile即可。 另外,在Makefile中,我们看到有: ``` export TopDIR ?= $(shell pwd) ``` 以及一些条件判断,这些不需要修改。 最后,编译命令是执行`make`,它会调用`modules`目标,然后调用内核的构建系统。 如果用户仍然遇到问题,可能是工具链的路径设置错误,或者工具链没有执行权限,或者内核源码路径不正确,需要进一步检查。 根据引用[4]中的示例,交叉编译命令是: ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all -j32 ``` 这和我们修改后的Makefile中传递的参数是一致的。 因此,修改后的Makefile中相关部分应该是: ``` ARCH = arm64 CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- KSRC = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/kernel ``` 然后,在终端中进入驱动源码目录,直接运行`make`即可。 注意:如果用户的环境变量中已经设置了ARCH和CROSS_COMPILE,那么Makefile中的设置可能会被覆盖。如果用户希望优先使用Makefile中的设置,可以确保在命令行中不传递这些变量,或者使用`?=`赋值(例如`ARCH ?= arm64`),这样如果环境变量已经设置,则使用环境变量,否则使用该值。但是,在用户提供的Makefile中,使用的是`=`,所以会覆盖环境变量。根据用户需求,如果希望灵活,可以改为`?=`。 但是,在用户提供的Makefile中,我们看到: ``` ARCH = arm64 CROSS_COMPILE = ...(原值) ``` 所以是直接赋值,会覆盖环境变量。如果用户需要临时改变架构,可以在命令行传递,例如: ``` make ARCH=arm ``` 但通常我们不需要,因为目标平台是固定的。 所以,我们只需要修改CROSS_COMPILE的赋值即可。 修改后的Makefile片段(仅修改CROSS_COMPILE): ``` ARCH = arm64 CROSS_COMPILE = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- KSRC = /home/topeet/Desktop/rk3399_linux_sdk_v2.0/kernel ``` 这样,交叉编译应该可以正常进行。</think>### 修改驱动Makefile支持交叉编译的完整方案 针对您提供的驱动Makefile,以下是完整的交叉编译修改方案,重点解决`CROSS_COMPILE`路径错误问题: #### 1. 修复交叉编译工具链路径问题 在Makefile开头添加以下配置(替换原有设置): ```makefile # ===== 交叉编译核心配置 ===== ARCH ?= arm64 CROSS_COMPILE ?= /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- KSRC ?= /home/topeet/Desktop/rk3399_linux_sdk_v2.0/kernel # ========================== ``` 关键修改说明: 1. **使用`?=`替代`=`**:允许通过命令行覆盖配置 ```makefile CROSS_COMPILE ?= ... # 而非 CROSS_COMPILE = ... ``` 2. **确保路径以连字符结尾**: ```makefile # 正确:路径以'-'结尾 CROSS_COMPILE ?= .../aarch64-buildroot-linux-gnu- # 错误:路径以gcc结尾(会导致编译失败) # CROSS_COMPILE ?= .../aarch64-buildroot-linux-gnu-gcc ``` 3. **添加架构检测保护**: ```makefile # 在ifeq之前添加架构检查 ifneq ($(ARCH),arm64) $(error 错误:当前架构[$(ARCH)]与目标设备[arm64]不匹配) endif ``` #### 2. 优化编译参数配置 在`EXTRA_CFLAGS`区域添加ARM64专用参数: ```makefile # 在原有EXTRA_CFLAGS下方添加 EXTRA_CFLAGS += -march=armv8-a+crc+simd # ARMv8特性支持 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN # 小端模式 EXTRA_CFLAGS += -fno-pic # 禁止位置无关代码 ``` #### 3. 修正内核模块构建规则 修改`modules`目标为: ```makefile modules: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules $(CROSS_COMPILE)strip --strip-debug $(MODULE_NAME).ko # 精简调试符号 ``` #### 4. 添加路径验证(可选但推荐) 在Makefile开头添加路径存在性检查: ```makefile # 工具链路径检查 ifeq ("$(wildcard $(CROSS_COMPILE)gcc)","") $(error 交叉编译器路径错误: $(CROSS_COMPILE)gcc 不存在) endif # 内核源码检查 ifeq ("$(wildcard $(KSRC)/Makefile)","") $(error 内核源码路径错误: $(KSRC) 不包含内核Makefile) endif ``` ### 完整修改后的Makefile结构 ```makefile # ===== 交叉编译核心配置 ===== ARCH ?= arm64 CROSS_COMPILE ?= /home/topeet/Desktop/rk3399_linux_sdk_v2.0/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu- KSRC ?= /home/topeet/Desktop/rk3399_linux_sdk_v2.0/kernel # 路径验证 ifeq ("$(wildcard $(CROSS_COMPILE)gcc)","") $(error 交叉编译器路径错误: $(CROSS_COMPILE)gcc 不存在) endif ifeq ("$(wildcard $(KSRC)/Makefile)","") $(error 内核源码路径错误: $(KSRC) 不包含内核Makefile) endif # ========================== # 原有配置保留(EXTRA_CFLAGS等) EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) EXTRA_CFLAGS += -O1 ... # 添加ARM64专用参数 EXTRA_CFLAGS += -march=armv8-a+crc+simd EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -fno-pic # 后续原有配置保持不变... ... # 修改后的modules目标 modules: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules $(CROSS_COMPILE)strip --strip-debug $(MODULE_NAME).ko ``` ### 编译验证命令 ```bash # 清理构建 make clean # 显式指定参数(测试覆盖性) make ARCH=arm64 \ CROSS_COMPILE=/home/topeet/.../aarch64-buildroot-linux-gnu- \ KSRC=/home/topeet/.../kernel # 检查生成模块 file 8852au.ko # 应显示: ELF 64-bit LSB relocatable, ARM aarch64 ``` > **常见问题解决**: > 1. **路径错误**:使用`readlink -f`验证路径是否存在 > ```bash > readlink -f /home/topeet/.../aarch64-buildroot-linux-gnu-gcc > ``` > 2. **权限问题**:添加执行权限 > ```bash > chmod +x $(CROSS_COMPILE)* > ``` > 3. **版本不匹配**:在内核目录执行`make scripts`准备构建环境
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值