一个易于使用的MTP实现,为您的下一个嵌入式Linux项目实现

2021-04-14 05:23:13

您是否知道您可以使用嵌入式设备上的最小依赖性运行许可的MTP实现?这里'关于如何在Rock PI 4上轻松运行CMTP响应器的逐步指南或配备UDC的任何其他板。

重新回顾:在本系列的第1部分中,我将您介绍到USB小工具的概念,它们的ConfigFS组合界面,可用的OpenSource工具和基本系统集成。在第2部分,我撰写了一个特定的USB小工具函数 - FunctionFS - 以及与Systemd的集成。然后我介绍了CMTP响应者,允许许可的MTP响应者实现,并显示了如何使用Dummy_hcd驱动程序在PC上玩它。它在后一篇文章中,我向您承诺在真正的硬件上运行CMTP响应者。您也可以在ELC 2019和Linux Piter 2019上看我谈论USB小工具。

在这篇文章中,我赢得了' t详细介绍了如何撰写小工具或如何使用systemd集成该进程。第一个段落包含足够的链接供您遵循,如果您尚未完成,我会鼓励您进行。我将谈论的是如何构建在真正硬件上运行所需的组件。

就硬件而言,您可以在任何ARM板上运行您的小工具,提供一个UDC(OTG)芯片,该芯片被连接到电路板上的实际USB连接器(所以RPI零将使用此功能,但RPI不会工作) 。它绝对超出了这篇文章的范围,以谈论所有可能的硬件。我正在使用的硬件是RockPI 4型号B,但您可以轻松调整对您的特定板的说明,我将标记特定于硬件的所有位置。

系统单位和小工具方案显然是与平台无关的。所以让' s一步一步地通过构建平台依赖的碎片。

首先,您可以在目标板上自然构建。它肯定会花更多的时间而不是交叉编译,而是一个可行的选择。对于自然建立建立又有另一个选项,您可以在仿真环境中编译在PC上(不需要全系统仿真,只需一个目标rootfs和内部的静态qemu即可加入并建立正在自然地建造)。在任何一种情况下,该过程应该看起来像x86上的x86的构建,并且您需要在电路板上安装相同类型的软件包(或在您的rootfs中)。但是,如果您期望您将经常重建CMTP响应者,并且交叉编译它绝对值得最初的努力,这篇文章的其余部分致力于这种后一种方法。

我们想要实现的是建立一块软件,以便它在不同类型的机器上运行而不是用于建筑的机器。此过程称为交叉编译。无论我们是否需要使用Autotools样式(LibusBGX),CMake样式(GT,CMTP-Responder)或者说,Meson样式,一般概念都是一样的。

首先需要一个交叉编译器。它是一个编译器,它本身是一个用于在构建主机上运行的程序,并为目标主机生成二进制文件。

除非你正在编译尤。内核,你不能只是一个裸露的编译器。虽然它正在做它的工作,但它需要咨询几个文件,例如,库标题文件,它应该与目标主机中的文件匹配,而不是构建主机中的文件。这就是为什么你需要Sysroot - 更多关于下面的Sysroot。有些库将其文件安装在已知位置,但Linux发行版可以选择其自定义位置。这就是为什么一个名为pkg-config的程序。您将在那里放入pkg-config调用而不是硬编码库文件位置。请注意,PKG-Config本身与您的分发和#39; S包装系统(Deb,RPM等)无关。当然,您的开发库(和PKG-Config本身!)可以由您的分发包提供,但安装后,在编译程序时查找库的方式是使用PKG-CONFIG - 而且无论如何,您都这样做您正在使用的分发(或者如果您根本不使用任何分发,但是从源代码编译整个系统)。

您使用Sysroot使您的交叉编译器知道在哪里寻找特定于目标的某些文件。 Sysroot需要镜像rootfs' s图书馆和标题。如果您是,您可以在您的实际目标rootfs上点点。将其安装在目标板上的NFS上。

您使用pkg_config_path,以便pkg-config知道在哪里寻找特定于目标的文件。

这些先决条件终于让'终于实际建立了我们的东西。我假设基于Debian的系统和目标。如果您在所有使用不同的分发或无分发时调整用于安装所需包的命令。

#相应地调整Sysroot $ Export Sysroot = / home / ap / collabora / rootfs / arm64 / debian-testing $ sudo apt-get安装pkg-config(在sysroot / targetro rootfs中) $ sudo apt-get安装libconfig-dev(在sysroot / targetro rootfs中) $ git clone https://github.com/libusbgx/libusbgx.git $ cd libusbgx. $ autoreconf -i. #USR / lib下的子目录是特定于平台的,所以--host = $ pkg_config_path = $ sysroot / usr / lib / aarch64-linux-gnu / pkgconfig ./configure --host = aarch64-linux-gnu --prefix = / usr --with-sysroot = $ sysroot $ make cflags =" - sysroot = $ sysroot" $ sudo make destdir = $ sysroot安装

$ sudo apt-get安装asciidoc-base $ sudo apt-get安装libglib2.0-dev $ sudo apt-get安装libsystemd-dev $ git clone https://github.com/kopasiak/gt.git $ cd gt / source #使用以下内容创建工具链文件 #cmake_system_processor,cmake_c_compiler和pkg_config_libdir是特定于平台的 $ cat aarch64-toolchain.txt set(cmake_system_name linux) SET(CMake_System_Processor AARCH64) #相应调整 SET(CMake_sysroot / home / ap / collabora / rootfs / arm64 / debian-testing) SET(CMake_C_COMPILER AARCH64-LINUX-GNU-GCC) set(env {pkg_config_libdir}" $ {cmake_sysroot} / usr / lib / pkgconfig:$ {cmake_sysroot} / usr / lib / aarch64-linux-gnu / pkgconfig")`)` set(env {pkg_config_sysroot_dir} $ {cmake_sysroot}) set(cmake_find_root_path_mode_program never) SET(cmake_find_root_path_mode_library) set(cmake_find_root_path_mode_include) set(cmake_find_root_path_mode_package) $ cmake -dcmake_install_prefix = $ sysroot -dcmake_runtime_prefix = / -dcmake_toolchain_file = aarch64-toolchain.txt $ make $ sudo make安装

在我们进入交叉编译CMTP响应程序之前,您必须了解它需要的描述符和字符串BLOB。它们可以以类似于本系列之前的一个博客文章中所示的方式手工制作。好消息是你不需要用手来做,因为CMTP响应者的构建系统也可以为您做到这一点。但是,目前此功能仅适用于当本地构建时,因此为了构建描述符和字符串Blobs的唯一目的,您将在目标板上进行本地编译。当Cross Compling此仍然有用时,您需要调用本机和交叉构建。 "副作用"本机构建将是我们的描述符百波,依赖于目标平台和Don'每次编译CMTP响应者时需要重新构建,然后我们删除其他所有东西并运行交叉构建。

$ git clone https://github.com/cmtp-responder/cmtp-responder.git $ CD CMTP响应者 #自然地构建以获取描述符和字符串BLOB $ cmake -dbuild_descriptors =上。 $ ls -l descs strs -rw-r - r-- 1 ap ap 80 sty 5 13:08 descs -rw-r - r-- 1 ap 32 sty 5 13:08 strs #移动描述符和字符串BLOB到安全的地方 $ mv descs .. $ mv strs .. #将工作目录恢复到新状态 $ rm -rf * $ git重置 - 哈达头 #还原描述符和字符串BLOB $ mv ../descs。 $ mv ../strs。 #现在做十字架 $ cp ../gt/aarch64-toolchain.txt。 $ cmake -dcmake_toolchain_file = aarch64-toolchain.txt $ make $ sudo make destdir = $ sysroot安装

有许多在线来源描述了这个主题,请使用您喜欢的搜索引擎查找说明。对于.config:

config_configfs_fs = y#configfs支持 config_usb = y#usb支持 config_usb_gadget = y#usb小工具框架 config_usb_configfs = y#与configfs编写USB小工具 config_usb_configfs_f_fs = y #mementfs与configfs创建USB小工具的组件

最重要的是,您需要启用您的UDC,这是特定于平台的。对于Rockpi 4我不得不说:

#在构建主机上,而在CMTP-Responder目录中 $ sudo mkdir $ sysroot / etc / gt / templates $ sudo cp systemd / mtp-ffs.scheme $ sysroot / etc / gt / templates $ sudo cp systemd / *。套接字$ sysroot / etc / systemd / system $ sudo cp systemd / *。服务$ sysroot / etc / systemd / system $ sudo cp systemd / *。安装$ sysroot / etc / systemd / system

#在目标上 $ sudo systemctl启用usb-gadget.service $ sudo systemctl启用run-ffs_mtp.mount $ sudo systemctl启用ffs.socket

重新启动后,它应显示为USB主机看到的MTP设备。 享受! 请勾选此框以确认您已阅读并接受有关您个人数据的集合/存储和使用情况的隐私通知条款:*