创龙瑞芯微RK3568交叉编译(c和驱动module)

2023-10-18 19:04

本文主要是介绍创龙瑞芯微RK3568交叉编译(c和驱动module),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

    由于项目需要,接触多个公司的RK3568,正点原子的,创龙的,迅为的。最后选择了创龙的。做了一段时间,发现给的教程和其他参考资料很少。所以必须一点一点得自己试验。以后的文章页会一点一点的写。希望给需要的小伙伴带个路。

资料中

    大部分功能在用户资料里面有,小伙伴一步步可以跟着做,仅仅说一般工程需要的。

    (1)灯

    灯的底层配置已经在设备树中配好了,直接echo就行!

    注:开发板的灯在边边上。开始的时候怎么点都不亮,最后才发现灯在边边上,半天没找到。

    (2)GPIO

    开发板没有直接引出GPIO,引出的都复用其他功能了,这个有点没办法。

    注:在class的gpio里面直接export就行,用到了就会busy,用不到就能export。

    (3)串口

    串口都搞成485和232了,没有TTL电平的。

    注:485口是有+和-的,利用485转232或者TTL的时候别接错了。

    (4)can

    直接根据资料中就可以发送。

    注:地址最大只能FFF,多了就没办法了。

测试

    (1)编译.c文件gcc

aarch64-buildroot-linux-gnu-gcc

    搜寻里面的gcc,有很多个,但是需要用的是这个,后面加上自己的文件名就行。为了方便,直接给个例程:

aarch64-buildroot-linux-gnu-gcc hello.c -o hello

    前面hello.c是自己的c文件,注意名字必须全对。虽然编译的是c文件,但是文件名后面最好有后缀。后面的hello是自己输出的名字,这个就随便了。

    注:c文件里面头自己添加了线程,交叉编译的时候并不用添加-lthread这个指令。

    下面给出具体具体函数:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "fcntl.h"
#include <string.h>
#include <net/if.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>#include "sys/ioctl.h"int count = 0;
void *thread_fun(void *arg) 
{while(1){printf("led_running\n");count++;if(count == 1){system("echo 1 > /sys/class/leds/user-led0/brightness");system("echo 0 > /sys/class/leds/user-led1/brightness");}if(count == 2){system("echo 0 > /sys/class/leds/user-led0/brightness");system("echo 1 > /sys/class/leds/user-led1/brightness");}if(count == 2)count = 0;sleep(1);}
}int main() 
{pthread_t tid;if (pthread_create(&tid, NULL, thread_fun, (void *)(&tid)) != 0) {perror("pthread_led_create error");exit(1);}else{printf("led thread open correct\n");}pthread_join(tid,NULL);
}

    这个就是点灯函数,由于gpio没有办法引出来,所以只能用系统函数凑合。如果是真正的gpio,还需要在开始的时候export,这个是没办法的。

    (2)编译驱动ko文件

    网上查询了好多,结果都不能用,都没办法编译出ko文件,不是这错就是那错。最后才给弄出来。

    先来主函数myhello.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>static int __init hello_init(void)
{printk(KERN_INFO  "%s : enter\n", __func__);return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "%s : enter\n", __func__);
}module_init(hello_init);
module_exit(hello_exit);MODULE_AUTHOR("wang");
MODULE_DESCRIPTION("hello");
MODULE_LICENSE("GPL");

    这个是最简单的驱动函数,网上的教程很多,这个就不多说了。

    下面是make文件

    注:记住名字一定得是Makefile,其他的不行;

    注:里面的一定要自己敲,分清楚Tab和空格,切记。要不编译不过去。具体可以看看makefile怎么编写的,有现成的也不能直接用,复制过去的格式已经变了。

MVTOOL_PREFIX = /home/wang/RK3568/rk356x_linux_release_v1.3.1_20221120/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc
CROSS_COMPILE= $(MVTOOL_PREFIX)
KDIR := /home/wang/RK3568/rk356x_linux_release_v1.3.1_20221120/kernelTARGET				=myhello
EXEC = $(TARGET)
obj-m :=$(TARGET).o
PWD :=$(shell pwd)
all:$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:rm -rf *.o *~core.depend.*.cmd *.ko *.mod.c .tmp_versions $(TARGET)

    其中:

    MVTOOL_PREFIX:gcc的位置,这个搞了很久,还用另一个gcc的,也能编译过去,但是不敢保证最后是对的。aarch64-none-linux-gnu-gcc,并且位置不一样。

    注:存放位置一定要自己改写,从rk356x_linux_release_v1.3.1_20221120之后是一定的,前面的需要改到自己的位置。

    KDIR:内核的位置。这个和上面一样,前面的位置不一样,必须添加/kernel,如果不添加会报错。

    TARGET:你的文件名字。

    注:你的文件是xxx.c,这个是去掉.c之后的名字。中间生成有其他文件,名字也是这个,但是后缀不一样。所以必须这个地方必须是你文件的名字,不加后缀。

    下面是编译指令:

make ARCH=arm64

    注:这里后面的架构名称必须加上。这个地方卡了很久。其他平台上我都试验了,龙芯上,A40i上,正点原子的其他开发板上都试验了,都没啥问题。仅仅在这里出现一大堆错误。原来这个地方需要加上后面。记住直接make是不行的。

结语

    Linux的文件就这样,坑非常多,一点注意不到就不行了。后面会一点点的给大家写创龙的瑞芯微RK3568的知识。如果需要经常关注的小伙伴可以关注公众号,具体的翻看前面的文章,里面有具体的二维码。

这篇关于创龙瑞芯微RK3568交叉编译(c和驱动module)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234556

相关文章

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决