瑞芯微Rockchip开发者社区
登录
直播中
张宇
7年用户
1618经验值
私信
关注
[问答]
基于NanoPC-T4制作的Linux板级驱动全过程是怎样去完成的
开启该帖子的消息推送
RK3399
Linux
驱动
基于NanoPC-T4制作的Linux板级驱动全过程是怎样去完成的?
回帖
(1)
何微微
2022-3-7 10:18:51
本文档基于友善NanoPC-T4制作,主要是为了记录做Linux板级驱动全过程,以备忘。
创建soc目录
1、在drivers/soc建立自己的板目录,在这里我创建venkeeboard
cd drivers/soc
mkdir venkeeboard
2、在drivers/soc/venkeeboard目录建立自己的一个Kconfig文件
cd venkeeboard
vi Kconfig
内容如下
#
# Machine drivers
#
if ARCH_ROCKCHIP
config MACH_VENKEEBOARD # 这个在编译dts时用到
bool "Venkee board Machine"
default y
endif
3、复制原厂的board.c文件到drivers/soc/venkeeboard目录
cp ../friendlyelec/board.c .
vi board.c
修改代码片段
static const struct of_device_id board_sys_of_match[] = {
{ .compatible = "venkee,board" }, // 设置自己的compatible,跟一会修改的dts的compatible保持一致
{}
};
MODULE_DEVICE_TABLE(of, board_sys_of_match);
static struct platform_driver board_sys_driver = {
.probe = board_sys_probe,
.driver = {
.name = "venkee-board",
.of_match_table = board_sys_of_match,
},
};
static int __init board_sys_init(void)
{
return platform_driver_register(&board_sys_driver);
}
device_initcall(board_sys_init);
4、复制原厂的Makefile文件到drivers/soc/venkeeboard目录
cp ../friendlyelec/Makefile .
vi Makefile
内容修改为
obj-$(CONFIG_MACH_VENKEEBOARD) += board.o
5、修改drivers/soc目录下的Kconfig
cd ..
vi Kconfig
增加内容
source "drivers/soc/venkeeboard/Kconfig" # 使用自己建立的Kconfig
6、修改drivers/soc目录下的Makefile
vi Makefile
增加内容
obj-$(CONFIG_MACH_VENKEEBOARD) += venkeeboard/
创建dts文件
1、进入arch/arm64/boot/dts/rockchip目录,执行复制操作
cd ../../arch/arm64/boot/dts/rockchip/
cp rk3399-nanopi4-cifisp.dtsi rk3399-venkee-cifisp.dtsi
cp rk3399-nanopi4-common.dtsi rk3399-venkee-common.dtsi
cp rk3399-nanopi4-rev00.dts rk3399-venkee-rev00.dts
2、修改rk3399-venkee-common.dtsi文件
vi rk3399-venkee-common.dtsi
原来的内容:
#define NANOPI4_RK_CIF_ISP10
#include "rk3399-nanopi4-cifisp.dtsi"
/ {
model = "FriendlyElec boards based on Rockchip RK3399";
compatible = "friendlyelec,nanopi4",
"rockchip,rk3399";
......
mach: board {
compatible = "friendlyelec,board";
machine = "NANOPI4";
hwrev = <255>;
model = "NanoPi 4 Series";
};
......
};
修改后的内容:
#define VENKEE_RK_CIF_ISP10
#include "rk3399-venkee-cifisp.dtsi"
/ {
model = "Venkee pads based on Rockchip RK3399"; // model需要在rev00具体dts重新定义
compatible = "venkee,pads",
"rockchip,rk3399"; // compatible需要在rev00具体dts重新定义
......
mach: board {
compatible = "venkee,pad"; // 这个需要跟board.c文件里面的compatible保持一致
machine = "Pad Machine"; // machine需要在rev00具体dts重新定义
hwrev = <255>; // hwrev需要在rev00具体dts重新定义
model = "Pad Model"; // model需要在rev00具体dts重新定义
};
......
};
3、修改rk3399-venkee-cifisp.dtsi文件
原来的内容:
#if defined(NANOPI4_RK_CIF_ISP10)
修改后的内容
#if defined(VENKEE_RK_CIF_ISP10)
4、修改rk3399-venkee-rev00.dtsi文件
原来的内容
#include "rk3399-nanopi4-common.dtsi"
/ {
model = "FriendlyElec NanoPC-T4";
compatible = "friendlyelec,nanopc-t4", "rockchip,rk3399";
};
&mach {
hwrev = <0>;
model = "NanoPC-T4";
};
修改后的内容
#include "rk3399-venkee-common.dtsi"
/ {
model = "Venkee Pad1S"; // 重新定义model
compatible = "venkee,pad1s", "rockchip,rk3399"; // 重新定义compatible
};
&mach {
hwrev = <0>; // 重新定义hwrev
machine = "Pad1S"; // 重新定义machine
model = "Pad 1 Series"; // 重新定义model
};
5、修改Makefile
vi Makefile
原来的内容
ifeq ($(CONFIG_MACH_NANOPI4),y)
dtb-$(CONFIG_ARCH_ROCKCHIP) +=
rk3399-nanopi4-rev00.dtb
rk3399-nanopi4-rev01.dtb
rk3399-nanopi4-rev04.dtb
rk3399-nanopi4-rev06.dtb
else
......
endif
always := $(dtb-y)
subdir-y := $(dts-dirs)
clean-files := *.dtb
修改后的内容
ifeq ($(CONFIG_MACH_VENKEEBOARD),y) // 这里使用了Kconfig配置的变量
dtb-$(CONFIG_ARCH_ROCKCHIP) +=
rk3399-venkee-rev00.dtb
else
......
endif
always := $(dtb-y)
subdir-y := $(dts-dirs)
clean-files := *.dtb
创建构建配置
1、进入arch/arm64/configs目录
cd ../../../configs/
2、复制nanopi4_linux_defconfig文件为venkee_linux_defconfig
cp nanopi4_linux_defconfig venkee_linux_defconfig
3、修改顶层架构Makefile
cd ../
vi Makefile
增加生成image的目标(参照nanopi4)
ifeq ($(CONFIG_MACH_VENKEEBOARD),y)
DTBS := rockchip/rk3399-venkee-rev*.dtb
PHONY += venkee-images venkee-bootimg
venkee-images: dtbs kernel.img rklogo
$(Q)scripts/resource_tool --dtbname $(objtree)/arch/arm64/boot/dts/$(DTBS) $(LOGO) $(LOGO_KERNEL)
@echo ' Image: resource.img (with $(DTBS) $(LOGO) $(LOGO_KERNEL)) is ready'
venkee-bootimg: venkee-images
$(Q) if [ -x $(srctree)/scripts/mkbootimg ]; then
$(srctree)/scripts/mkbootimg
--kernel $(objtree)/arch/arm64/boot/Image
--second resource.img
-o boot.img &&
echo ' Image: boot.img (with Image resource.img) is ready';
$(srctree)/scripts/mkbootimg
--kernel $(objtree)/arch/arm64/boot/Image.lz4
--second resource.img
-o zboot.img &&
echo ' Image: zboot.img (with Image.lz4 resource.img) is ready';
fi
endif
构建
1、进入源代码顶层目录并生成构建文件
cd ../../
make ARCH=arm64 venkee_linux_defconfig
2、执行构建
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j6 venkee-bootimg
3、生成相应的image如图
修改u-boot环境变量硬编码
FriendlyElec做u-boot的时候,把dtb名称硬编码到了环境变量,如果不修改会导致启动不了,或者需要手动修改环境变量才能启动
1、进入uboot-rockchip/board/rockchip/rk33xx,修改rk33xx.c
原来的代码
static void set_dtb_name(void)
{
char info[64] = {0, };
snprintf(info, ARRAY_SIZE(info),
"rk3399-nanopi4-rev%02x.dtb", get_board_rev());
setenv("dtb_name", info);
}
修改后的代码
static void set_dtb_name(void)
{
char info[64] = {0, };
snprintf(info, ARRAY_SIZE(info),
"rk3399-venkee-rev%02x.dtb", get_board_rev());
setenv("dtb_name", info);
}
本文档基于友善NanoPC-T4制作,主要是为了记录做Linux板级驱动全过程,以备忘。
创建soc目录
1、在drivers/soc建立自己的板目录,在这里我创建venkeeboard
cd drivers/soc
mkdir venkeeboard
2、在drivers/soc/venkeeboard目录建立自己的一个Kconfig文件
cd venkeeboard
vi Kconfig
内容如下
#
# Machine drivers
#
if ARCH_ROCKCHIP
config MACH_VENKEEBOARD # 这个在编译dts时用到
bool "Venkee board Machine"
default y
endif
3、复制原厂的board.c文件到drivers/soc/venkeeboard目录
cp ../friendlyelec/board.c .
vi board.c
修改代码片段
static const struct of_device_id board_sys_of_match[] = {
{ .compatible = "venkee,board" }, // 设置自己的compatible,跟一会修改的dts的compatible保持一致
{}
};
MODULE_DEVICE_TABLE(of, board_sys_of_match);
static struct platform_driver board_sys_driver = {
.probe = board_sys_probe,
.driver = {
.name = "venkee-board",
.of_match_table = board_sys_of_match,
},
};
static int __init board_sys_init(void)
{
return platform_driver_register(&board_sys_driver);
}
device_initcall(board_sys_init);
4、复制原厂的Makefile文件到drivers/soc/venkeeboard目录
cp ../friendlyelec/Makefile .
vi Makefile
内容修改为
obj-$(CONFIG_MACH_VENKEEBOARD) += board.o
5、修改drivers/soc目录下的Kconfig
cd ..
vi Kconfig
增加内容
source "drivers/soc/venkeeboard/Kconfig" # 使用自己建立的Kconfig
6、修改drivers/soc目录下的Makefile
vi Makefile
增加内容
obj-$(CONFIG_MACH_VENKEEBOARD) += venkeeboard/
创建dts文件
1、进入arch/arm64/boot/dts/rockchip目录,执行复制操作
cd ../../arch/arm64/boot/dts/rockchip/
cp rk3399-nanopi4-cifisp.dtsi rk3399-venkee-cifisp.dtsi
cp rk3399-nanopi4-common.dtsi rk3399-venkee-common.dtsi
cp rk3399-nanopi4-rev00.dts rk3399-venkee-rev00.dts
2、修改rk3399-venkee-common.dtsi文件
vi rk3399-venkee-common.dtsi
原来的内容:
#define NANOPI4_RK_CIF_ISP10
#include "rk3399-nanopi4-cifisp.dtsi"
/ {
model = "FriendlyElec boards based on Rockchip RK3399";
compatible = "friendlyelec,nanopi4",
"rockchip,rk3399";
......
mach: board {
compatible = "friendlyelec,board";
machine = "NANOPI4";
hwrev = <255>;
model = "NanoPi 4 Series";
};
......
};
修改后的内容:
#define VENKEE_RK_CIF_ISP10
#include "rk3399-venkee-cifisp.dtsi"
/ {
model = "Venkee pads based on Rockchip RK3399"; // model需要在rev00具体dts重新定义
compatible = "venkee,pads",
"rockchip,rk3399"; // compatible需要在rev00具体dts重新定义
......
mach: board {
compatible = "venkee,pad"; // 这个需要跟board.c文件里面的compatible保持一致
machine = "Pad Machine"; // machine需要在rev00具体dts重新定义
hwrev = <255>; // hwrev需要在rev00具体dts重新定义
model = "Pad Model"; // model需要在rev00具体dts重新定义
};
......
};
3、修改rk3399-venkee-cifisp.dtsi文件
原来的内容:
#if defined(NANOPI4_RK_CIF_ISP10)
修改后的内容
#if defined(VENKEE_RK_CIF_ISP10)
4、修改rk3399-venkee-rev00.dtsi文件
原来的内容
#include "rk3399-nanopi4-common.dtsi"
/ {
model = "FriendlyElec NanoPC-T4";
compatible = "friendlyelec,nanopc-t4", "rockchip,rk3399";
};
&mach {
hwrev = <0>;
model = "NanoPC-T4";
};
修改后的内容
#include "rk3399-venkee-common.dtsi"
/ {
model = "Venkee Pad1S"; // 重新定义model
compatible = "venkee,pad1s", "rockchip,rk3399"; // 重新定义compatible
};
&mach {
hwrev = <0>; // 重新定义hwrev
machine = "Pad1S"; // 重新定义machine
model = "Pad 1 Series"; // 重新定义model
};
5、修改Makefile
vi Makefile
原来的内容
ifeq ($(CONFIG_MACH_NANOPI4),y)
dtb-$(CONFIG_ARCH_ROCKCHIP) +=
rk3399-nanopi4-rev00.dtb
rk3399-nanopi4-rev01.dtb
rk3399-nanopi4-rev04.dtb
rk3399-nanopi4-rev06.dtb
else
......
endif
always := $(dtb-y)
subdir-y := $(dts-dirs)
clean-files := *.dtb
修改后的内容
ifeq ($(CONFIG_MACH_VENKEEBOARD),y) // 这里使用了Kconfig配置的变量
dtb-$(CONFIG_ARCH_ROCKCHIP) +=
rk3399-venkee-rev00.dtb
else
......
endif
always := $(dtb-y)
subdir-y := $(dts-dirs)
clean-files := *.dtb
创建构建配置
1、进入arch/arm64/configs目录
cd ../../../configs/
2、复制nanopi4_linux_defconfig文件为venkee_linux_defconfig
cp nanopi4_linux_defconfig venkee_linux_defconfig
3、修改顶层架构Makefile
cd ../
vi Makefile
增加生成image的目标(参照nanopi4)
ifeq ($(CONFIG_MACH_VENKEEBOARD),y)
DTBS := rockchip/rk3399-venkee-rev*.dtb
PHONY += venkee-images venkee-bootimg
venkee-images: dtbs kernel.img rklogo
$(Q)scripts/resource_tool --dtbname $(objtree)/arch/arm64/boot/dts/$(DTBS) $(LOGO) $(LOGO_KERNEL)
@echo ' Image: resource.img (with $(DTBS) $(LOGO) $(LOGO_KERNEL)) is ready'
venkee-bootimg: venkee-images
$(Q) if [ -x $(srctree)/scripts/mkbootimg ]; then
$(srctree)/scripts/mkbootimg
--kernel $(objtree)/arch/arm64/boot/Image
--second resource.img
-o boot.img &&
echo ' Image: boot.img (with Image resource.img) is ready';
$(srctree)/scripts/mkbootimg
--kernel $(objtree)/arch/arm64/boot/Image.lz4
--second resource.img
-o zboot.img &&
echo ' Image: zboot.img (with Image.lz4 resource.img) is ready';
fi
endif
构建
1、进入源代码顶层目录并生成构建文件
cd ../../
make ARCH=arm64 venkee_linux_defconfig
2、执行构建
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j6 venkee-bootimg
3、生成相应的image如图
修改u-boot环境变量硬编码
FriendlyElec做u-boot的时候,把dtb名称硬编码到了环境变量,如果不修改会导致启动不了,或者需要手动修改环境变量才能启动
1、进入uboot-rockchip/board/rockchip/rk33xx,修改rk33xx.c
原来的代码
static void set_dtb_name(void)
{
char info[64] = {0, };
snprintf(info, ARRAY_SIZE(info),
"rk3399-nanopi4-rev%02x.dtb", get_board_rev());
setenv("dtb_name", info);
}
修改后的代码
static void set_dtb_name(void)
{
char info[64] = {0, };
snprintf(info, ARRAY_SIZE(info),
"rk3399-venkee-rev%02x.dtb", get_board_rev());
setenv("dtb_name", info);
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
RK3399
Linux
驱动
有什么方法可以
去
控制
NanoPC-T4
开发
板
上的LED灯呢
2022-03-09
1718
NanoPC-T4
开发
板
具备哪些性能呢
2021-12-27
981
有人分享
制作
蓝牙耳机的
全过程
吗?
2014-06-02
5639
中夏s66e组装
全过程
2016-05-12
9792
NanoPC-T4
单板的设备树里Soc基础设施有哪些
2022-03-04
1433
FireFly RK3399开发
板
与
NanoPC
T4
开发
板
有何不同呢
2022-03-08
2087
怎样
去
制作
基于无刷四轴飞控
板
和MOS
驱动
电路的空心杯小四轴
2021-10-09
2859
如何烧录SOM-RK3399/
NanoPC
T4
?
2022-03-07
755
在fs4412开发
板
上
怎样
去
安装
驱动
程序
2021-08-03
984
使用vscode操作esp32s2,设置target失败是什么问题?
2023-02-17
137
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分