创龙瑞芯微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

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )