将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

相关文章

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

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