将RK3588平台的TMC等USB function驱动挪出内核源码树

2024-09-04 17:44

本文主要是介绍将RK3588平台的TMC等USB function驱动挪出内核源码树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

前一段时间定位一个上位机通过USB-TMC连接下位机(基于RK3588平台)时界面发生卡顿的问题,发现USB-TMC驱动代码是放在内核源码树里跟内核一起编译的,觉着这样既不便于更换TMC 驱动版本(每次修改代码都要重编内核),也不便于将TMC驱动代码单独放到SVN管理(RK的build系统有16GB之巨,全部提交到SVN服务器吃不消),于是考虑将其挪到源码树外。

想参照自己之前在zynq平台上开发的TMC驱动代码,结果发现也是放在内核源码树内的,尴尬,无奈从头摸索,几经周折,特别是踩了RK3588的systemd服务adbd的坑之后,总算实现目标了。

实现方法

创建独立工程

在SVN为产品开辟的目录下新建TMC目录并检出,并添加以下Makefile

obj-m += ftmc.o
SDK = ~/RK3588_LINUX_NNEWN_NH102_SDK_Release
CROSS_PREFIX = $(SDK)/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-rockchip1031-linux-gnu-
KDIR = $(SDK)/kernel
PWD ?= $(shell pwd)all:make -C $(KDIR) M=$(PWD) modules modules ARCH=arm64  CROSS_COMPILE=$(CROSS_PREFIX)
clean:rm -rf modules.order *.o *.mod Module.symvers *.mod.c *.ko *.cmd .*.cmd

注:ftmc.o是源码ftmc.c编译出来的目标文件

在adbd服务启动脚本里加载ko

目前USB function驱动基本都切换到configfs开发方式了,因此RK3588为所有function驱动提供了一个adbd服务,用于在Linux启动阶段自动在configfs里创建一些目录和文件,从而触发驱动的alloc_inst、alloc_func、bind等方法。

以前所有function驱动都编译到内核,因此该脚本只操作configfs即可启用function,但因为tmc驱动变成了独立的ko,因此要先insmod一个ko,具体做法是在/etc/init.d/adbd.sh添加

    if [ $TMC_EN = on ];thenif [ ! -e "${USB_FUNCTIONS_DIR}/tmc.gs0" ] ;theninsmod /path/to/ftmc.ko  # 就添加这一行mkdir -p ${USB_FUNCTIONS_DIR}/tmc.gs0ln -s ${USB_FUNCTIONS_DIR}/tmc.gs0 ${USB_CONFIGS_DIR}/tmc.gs0fifi

禁用adbd服务的ExecStop语句

RK3588的adbd服务是这样写的:
RK3588的adbd服务

这个写法是有问题的,会导致ExecStop语句紧跟着ExecStart执行,而adbd.sh的stop分支是会删除gadget的:

stop)echo "none" > ${USB_CONFIGFS_DIR}/UDC  # 这行命令会删除整个gadget,包括依附其上的各种function,比如TMCif [ $ADB_EN = on ];thenstart-stop-daemon --stop --oknodo --pidfile /var/run/adbd.pid --retry 5fi;;

因此不能这么写,我尝试过将服务的Type改成oneshotsimple等,也试过添加RemainAfterExit=yesKillMode=none等语句,均无法达到RK3588想要的效果——系统启动时执行且只执行ExecStart,系统关闭时执行且只执行ExecStop——或许systemd可以增加一个新的Unit类型😉

不管怎么样,现在的解决办法是禁用adbd服务的ExecStop语句,反正嵌入式系统关机时就算设备没卸载也影响不大。

总结

configfs是个好东西,值得研究一番

这篇关于将RK3588平台的TMC等USB function驱动挪出内核源码树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短