• 创龙瑞芯微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这个指令。

        下面给出具体具体函数:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include "fcntl.h"
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include "sys/ioctl.h"
    12. int count = 0;
    13. void *thread_fun(void *arg)
    14. {
    15. while(1)
    16. {
    17. printf("led_running\n");
    18. count++;
    19. if(count == 1)
    20. {
    21. system("echo 1 > /sys/class/leds/user-led0/brightness");
    22. system("echo 0 > /sys/class/leds/user-led1/brightness");
    23. }
    24. if(count == 2)
    25. {
    26. system("echo 0 > /sys/class/leds/user-led0/brightness");
    27. system("echo 1 > /sys/class/leds/user-led1/brightness");
    28. }
    29. if(count == 2)count = 0;
    30. sleep(1);
    31. }
    32. }
    33. int main()
    34. {
    35. pthread_t tid;
    36. if (pthread_create(&tid, NULL, thread_fun, (void *)(&tid)) != 0)
    37. {
    38. perror("pthread_led_create error");
    39. exit(1);
    40. }
    41. else
    42. {
    43. printf("led thread open correct\n");
    44. }
    45. pthread_join(tid,NULL);
    46. }

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

        (2)编译驱动ko文件

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

        先来主函数myhello.c:

    1. #include
    2. #include
    3. #include
    4. static int __init hello_init(void)
    5. {
    6. printk(KERN_INFO "%s : enter\n", __func__);
    7. return 0;
    8. }
    9. static void __exit hello_exit(void)
    10. {
    11. printk(KERN_INFO "%s : enter\n", __func__);
    12. }
    13. module_init(hello_init);
    14. module_exit(hello_exit);
    15. MODULE_AUTHOR("wang");
    16. MODULE_DESCRIPTION("hello");
    17. MODULE_LICENSE("GPL");

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

        下面是make文件

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

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

    1. MVTOOL_PREFIX = /home/wang/RK3568/rk356x_linux_release_v1.3.1_20221120/buildroot/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc
    2. CROSS_COMPILE= $(MVTOOL_PREFIX)
    3. KDIR := /home/wang/RK3568/rk356x_linux_release_v1.3.1_20221120/kernel
    4. TARGET =myhello
    5. EXEC = $(TARGET)
    6. obj-m :=$(TARGET).o
    7. PWD :=$(shell pwd)
    8. all:
    9. $(MAKE) -C $(KDIR) M=$(PWD) modules
    10. clean:
    11. 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的知识。如果需要经常关注的小伙伴可以关注公众号,具体的翻看前面的文章,里面有具体的二维码。

  • 相关阅读:
    微信小程序实现上拉加载更多
    Typescript 之 快速入门
    最新AI智能写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成
    使用vue互联QQ音乐完成网站音乐播放器
    初入数据分析
    C++11(包装器)
    计算机毕业设计 基于SpringBoot的健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解目录
    【学习笔记】CF1103D Professional layer
    “北京到底有谁在啊”影视APP开发,解锁最简单的快乐
    面了个字节拿25k出来的测试,算是真正见识到了基础的天花板
  • 原文地址:https://blog.csdn.net/weixin_45426095/article/details/133905671