OTG 配置为U盘

news2025/1/16 2:44:54

目录

硬件环境及目标

配置脚本

   问题1 ,创建g1 目录失败

    问题1 的解决

问题2 ,目录不存在

访问存储卡

综述


   

网上很多资料介绍通过configfs将OTG 口配置为U盘的资料,本文记录实际操作及遇到的问题。

   

硬件环境及目标

 硬件基本结构如下图。

期望PC可以访问 存储卡。

 

配置脚本

#!/bin/sh

mount -t configfs none /sys/kernel/config

cd /sys/kernel/config/usb_gadget
mkdir g1
cd g1
echo 0x18d1 > idVendor
echo 0x4ee2 > idProduct 
mkdir strings/0x409
#echo "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" > strings/0x409/serialnumber
echo "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" > strings/0x409/serialnumber
echo "shoniba" > strings/0x409/manufacturer
echo "Mass Storage" > strings/0x409/product
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "mass_storage" > configs/c.1/strings/0x409/configuration
mkdir functions/mass_storage.0
echo "/dev/mmcblk2p7" > functions/mass_storage.0/lun.0/file
#echo "/oem/vfat.img" > functions/mass_storage.0/lun.0/file
ln -s functions/mass_storage.0 configs/c.1

ls /sys/class/udc > UDC

   第一行 mount configfs,即通过configfs完成对OTG功能的配置,挂载此文件系统后,在/sys/kernel/config目录下就会出现 usb_gadget目录。

   问题1 ,创建g1 目录失败

      在运行 上述脚本,创建目录g1时,报如下错误,根据信息提示,我们猜测,在usb_gadget目录下已经存在一个目录的情况下,不能再次创建目录

[root@rk1808:/sys/kernel/config/usb_gadget]# mkdir -m 0770  g1  (报错,抛栈异常)
[ 1193.993072] sysfs: cannot create duplicate filename '/devices/virtual/android_usb/android0'
[ 1193.993166] ------------[ cut here ]------------
[ 1193.993200] WARNING: at fs/sysfs/dir.c:31
[ 1193.993218] Modmkdir: cannot create directory 'g1': Cannot allocate memory
ules link[root@rk1808:/sys/kernel/config/usb_gadget]# ed in: bcmdhd galcore(O)
[ 1193.993262]
[ 1193.993295] CPU: 0 PID: 696 Comm: mkdir Tainted: G        W  O    4.4.194 #19
[ 1193.993315] Hardware name: Rockchip RK1808 EVB V10 Board (DT)
[ 1193.993341] task: ffffffc075afe0c0 task.stack: ffffffc07c034000
[ 1193.993376] PC is at sysfs_warn_dup+0x58/0x7c
[ 1193.993412] LR is at sysfs_warn_dup+0x58/0x7c
[ 1193.993436] pc : [<ffffff800819f10c>] lr : [<ffffff800819f10c>] pstate: 00000145
[ 1193.993455] sp : ffffffc07c037ac0
[ 1193.993474] x29: ffffffc07c037ac0 x28: 0000000000000000

  而我们的确看到在 usb_gadget目录下存在一个目录: rockchip

    问题1 的解决

       在/etc/init.d目录下存在 USB configfs的配置文件,分别为: 

      .usb_config和S50usbdevices

  •      其中第一个文件控制OTG接口作为什么功能,例如UMS,即U盘,ADB、UVC等等。
  •     第二个文件 功能类似本节开始处的脚本,即通过configfs配置各种具体的功能。各个功能是互斥的。

    对于问题1的解决,由于前期我们猜测是由于 usb_gadget已经存在一个目录,因而我们将.usb_config中的usb_adb_en改成一个不存在的功能,例如usb_xxx_en。然后重启。

     此时再查看 mount信息,configfs已经没有被挂载。于是手动挂载后,通过  mkdir g1可以创建目录了。

       由此实验证实了我们的猜想: 即在usb_gadget目录下不能创建多个目录。

问题2 ,目录不存在

当脚本运行到  mkdir functions/mass_storage.0 时,一直提示:

mkdir: cannot create directory 'mass_massage.0': No such file or directory

重新编译内核,增加内核选项

 

 

    

cat .config |grep -i mass

CONFIG_USB_F_MASS_STORAGE=y

CONFIG_USB_CONFIGFS_MASS_STORAGE=y

CONFIG_USB_MASS_STORAGE is not set

采用新内核后,可以正常创建mass_storage.0目录了。

此时脚本全部运行完毕,我们在PC上可以看到一个盘符了!

访问存储卡

 lsscsi
[3:0:0:0]    disk    ATA      2.5" SATA SSD 3M 225   /dev/sda
[4:0:0:0]    disk    Linux    File-Stor Gadget 0404  /dev/sdb

    运行完第二章的脚本后,在PC上通过lsscsi命令可以看到多了一个盘符/dev/sdb,类型是file-stor gadget。这个就是我们要访问的存储卡。

   但是此/dev/sdb设备即不能被mount 也不能发disk分区,导致不能使用。

    究其原因,因为我们脚本中 对于/dev/sdb的分区   mmcblk2p7,文件系统格式为ext2导致,将此分区重新格式化成ext4 或者vfat,则可以被PC正常访问了。

    

mkfs.ext3 /dev/mmcblk2p7


mke2fs 1.43.9 (8-Feb-2018)

/dev/mmcblk2p7 contains a ext2 file system labelled 'oem'

last mounted on /oem on Sat Aug 5 12:25:21 2017

Proceed anyway? (y,N) y

Discarding device blocks: done

Creating filesystem with 65536 1k blocks and 16384 inodes

Filesystem UUID: 2a1152f9-4ffe-4040-abf5-49aca7b9fe7c

Superblock backups stored on blocks:

8193, 24577, 40961, 57345

Allocating group tables: done

Writing inode tables: done

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done

格式化成vfat

mkfs.vfat /dev/mmcblk2p7

mkfs.fat 4.1 (2017-01-24)

综述

   configfs的强大及灵活显而易见,而在应用过程中遇到的问题,需要对内核进一步了解才更容易解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造高逼格、可视化的监控系统平台

1、安装influxdb数据库 docker run -d --name influxdb -p 8083:8083 -p 8086:8086 tutum/influxdb 两个端口都要映射出来&#xff0c;同时要开启防火墙端口 web http://192.168.199.151:8083/进入8083端口&#xff0c;创建数据库cadvisor 创建管理员admin密码123456的用户…

windows glog 安装以及环境搭建

ocr 代码是用 C 写得&#xff0c;以前只有一个同事在维护&#xff0c;他离职几年了&#xff0c;那块代码没人能改得了。工作后一直在写 Java &#xff0c;写了快 10 年 Java 了。看了几天 C 代码&#xff0c;终于能在 vs 下把代码给跑起来了。 写 Java 代码是在 mac 平台下 In…

uniapp 切换WIFI

最近有一个新的需求&#xff0c;在app中实现切换wifi的功能。 方法一、 实现&#xff1a;使用安卓9&#xff08;28&#xff09;方法的WifiManager.addNetwork切换&#xff0c;具体实现方法大家自己搜&#xff0c;很容易搜到。 弊端&#xff1a; 要先忘记 WI-FI 才能连接成功&…

竞品分析:秒健康

发展历程 妙健康产品上线后&#xff0c;最初主要提供相关的在线医疗服务健康管理社区互动&#xff0c;虽然也有瘦身等相关功能&#xff0c;但整体业务偏向医疗化&#xff0c;用户年龄层也相对偏高。 15年进入健康市场后&#xff0c;不断探索并完善有关医疗业务的相关功能&am…

FBA海运是什么,FBA海运的优势是什么

FBA的方式分为海运&#xff0c;空运&#xff0c;快递这种&#xff0c;其中海运是各种方式中性价比最高的一种&#xff0c;不仅价格便宜&#xff0c;而且运货量大&#xff0c;清关简单&#xff0c;虽然时效有点慢&#xff0c;但是量大可以补救&#xff0c;我们在这里主要说一说F…

java设计模式

设计模式汇总(copy) 介绍 内容链接设计模式简介https://blog.csdn.net/m0_54485604/article/details/113309133 UML 类图介绍 内容链接UML类图https://blog.csdn.net/m0_54485604/article/details/113243818 六大设计原则 内容链接开闭原则https://blog.csdn.net/m0_54485604/a…

Spring:AOP的核心概念(10)

AOP核心概念AOP简介什么是AOPAOP作用AOP核心概念AOP入门案例AOP工作流程流程1: Spring容器启动流程2: 读取所有切面配置中的切入点流程3: 初始化bean流程4: 获取bean执行方法AOP核心概念AOP小结AOP简介 什么是AOP AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一…

SSD 1306显示屏 adafruit SSD 1306

文章目录1.常用函数1.字体oled.printoled.setRotation(1);oled.setTextSize(1);oled.setCursor(35, 5);2.图形类oled.fillScreen(WHITE );//coloroled.fillRect(10, 10, 20, 20, WHITE );//x y x1 y1 coloroled.drawRect(10, 10, 40,40, WHITE );//x y x1 y1 coloroled.drawCir…

数字信号处理-3-函数的正交

0 导读 如果函数成正交关系&#xff0c;那么它们的积的定积分为 0。反过来说就是&#xff0c;如果两个函数相乘的定积分值为 0&#xff0c;那么称这两个函数正交。sinx 与 cosx 正交&#xff0c;sinnx 与 sinmx 正交&#xff08;m与n不相等&#xff09;&#xff0c;cosnx 与 c…

留学文书Statement of Purpose写法介绍

留学目的陈述&#xff08;Statement of Purpose, 通常简写为SOP&#xff09;是留学申请文书里的重要内容之一。通过SOP&#xff0c;目标学校可以更深入地了解申请人的留学目的以及申请人的目标是否和学校的教学理念相一致。因此&#xff0c;在撰写SOP的时候&#xff0c;申请者要…

开播客户端

OBS架构 配置数据&#xff1a;json表示 libobs接口导出&#xff1a;export、import 多线程中的缓冲队列&#xff1a;circlebuf动态循环缓冲 分层 UI > libobs > 插件 libobs C实现的&#xff0c;拥有一个全局变量控制所有事务。 视频采集渲染线程、视频编码线程&…

基于PHP+MYSQL的网上鲜花店销售系统(含论文)

鲜花在人们的生活中是一个非常重要的东西,在节假日或者一些有特殊含义的日子里人们通常会给亲朋好友或者长辈们送上一束有特殊含义的鲜花来表示自己对节日的问候,为了给人们增加鲜花的选择性和降低购买的难度我们开发了本网上鲜花店销售系统 本网上鲜花店销售系统是通过当下最流…

CorelDRAW2023安装下载教程精简版矢量绘图软件

CDR全称是CorelRAW2023&#xff0c;它不同于Photoshop&#xff0c;PS是一款图片处理软件&#xff0c;而CDR是一款较为常用的矢量绘图设计软件&#xff0c;该软件给设计师提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能&#xff0c;使用的比较多的版本是202…

【读点论文】CMT: Convolutional Neural Networks Meet Vision Transformers

CMT: Convolutional Neural Networks Meet Vision Transformers Abstract 视觉transformer已经成功地应用于图像识别任务&#xff0c;因为它们能够捕获图像中的长距离依赖性。然而&#xff0c;transformer和现有卷积神经网络&#xff08;CNN&#xff09;在性能和计算成本方面仍…

Pandas太慢?快使用Vaex DataFrame,每秒数亿数据算起来 ⛵

&#x1f4a6; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/393 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

LR低代码快速开发平台 高效调整企业组织架构

组织架构以及围绕组织架构的设计、实施和变革&#xff0c;是企业管理永恒的话题&#xff0c;它上承公司的业务战略和运营模式&#xff0c;下接业务流程和信息系统建设&#xff0c;重要性不言而喻。数字化变革浪潮之下&#xff0c;商业模式的颠覆、价值链的重塑都需要由相匹配的…

解读商业智能BI,数据仓库中的元数据

之前的文章讨论过数据分析、数据治理、数据仓库等等&#xff0c;即使是非业内人员从字面意思&#xff0c;也是可以了解一二的&#xff0c;但是&#xff0c;很多人对于元数据可能就比较陌生了。那么&#xff0c;今天我们就来聊一聊元数据管理。 一、数据仓库 要说元数据&#…

IB 物理真题: 比潜热、理想气体

本题是 2017 年 IB 物理试卷 paper 2 的一道大题&#xff0c;在 SL 和 HL 的试卷中&#xff0c;这道题基本没什么区别&#xff0c;所以适用于所有考 IB 物理的学生。这道题主要涉及到了功率、比潜热、和理想气体的知识&#xff0c;具体讲了液氧蒸发成氧气的过程。如下图所示&am…

简述CompletableFuture异步任务编排

前言 在之前的项目开发中&#xff0c;都没怎么使用过CompletableFuture的功能&#xff0c;只听说过和异步编程有关。为了能够在将来有需要的时候用得上&#xff0c;这两天花了点时间学习了一下&#xff0c;并简单地总结一下如何使用CompletableFuture完成异步任务编排。 先创…

Linux20 -- 线程安全、保证线程安全的示例代码

一、线程安全 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 线程安全&#xff1a;多线程程序&#xff0c;无论调度顺序咋样&#xff0c;都可以得到正确一致的结果。安全–正确…