问题标签 [usb-mass-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
608 浏览

android - 以编程方式查找 android usb 模式状态

有没有办法检测启用了哪种 USB 模式?

以前,使用Settings.Global.USB_MASS_STORAGE_ENABLED 很容易。

但是现在,只有 MTP / PTP / 充电,我们如何检测启用了哪种模式?如果设备已经连接(因此通过循环usbManager.getDeviceList();)或检查某些系统设置?

我只是在谈论检测而不是更改它,而不是扎根。

0 投票
3 回答
5758 浏览

c - 如何在使用 HAL 时擦除 STM32F405RG 中的内部闪存页面(不是扇区!)?

尝试管理 STM32F4 微控制器中的内部闪存时,我走到了死胡同。有很多示例,但大多数都使用 SPL API 或低级寄存器操作。我正在使用 HAL 库。而且我找不到只擦除一页的功能(在stm32f4xx_hal_flash.c和中stm32f4xx_hal_flash_ex.c)。建议的功能,例如HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)不允许您仅擦除一页(2048 kByte)但仅擦除整个扇区(或扇区)。当我尝试使用类似的东西时:

}

发生编译器错误,因为FLASH->ARHAL 中没有(地址寄存器)。我发现阅读了RM0090 参考手册,现在我需要使用FLASH->CRAR 并设置位FLASH_CR_SNB [3:6]来选择扇区号。

现在我不知道如何只擦除一页。int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) 有必要在内部闪存中为该功能创建一个大容量存储设备: usbd_storage_if.c将 USB 堆栈调用转换为内部闪存。

0 投票
1 回答
214 浏览

usb - USB (SCSI) 固件开发 - 如何处理可移动媒体

我正在开发一个USB 大容量存储设备。我让设备基本上工作了(它太慢了,但那是另一个话题)。没有像我想要的那样工作的是处理设备删除 - 不是从 USB 端,而是当 USB 设备被(强制)媒体删除强制脱机时,USB 设备向主机呈现正确的响应。

我尝试使用带有 MEDIUM_NOT_PRESENT 附加信息的 NOT_READY 感应键响应读/写请求,但主机似乎并没有以与断开 USB 电缆相同的方式对此作出反应。

在操作期间将媒体拉出时,带有可移动媒体的 USB 设备的预期行为是什么?

0 投票
2 回答
1444 浏览

java - 如何确定文件是否在 USB 大容量存储设备上?

给定 aFile或 a Uri,我如何可靠地确定文件是否位于连接到手机 USB 端口的 USB 大容量存储设备上?

我的测试手机是三星 Galaxy S7 Edge,它连接了一个 USB 大容量存储设备、一个内部(物理)微型 SD 卡和内部存储。当我查询时Context.getExternalCacheDirs(),我看到所有三个:

如何确定哪一个是 USB 大容量存储设备?(顺便说一句,它是 A2B3-15F3)。


研究

我查看了这个答案StorageHelper.resolveType()方法),但如您所见,设备的挂载文件路径不包含字符串“usb”。

然后我尝试使用该StorageManager服务。使用上面的设备,我们可以使用以下方法获取 StorageVolume`:

这就是事情变得有点奇怪的地方。StorageVolumeAPI 文档和我在 Android 25 源中的文件的本地副本似乎对我没有太大帮助,但是当我在 Android Studio 调试器中执行上述代码时,该对象包含一个mSubSystem将上述三个设备描述为的字段“保险丝”,“usb”和“sd”分别。这是一个例子:

Android Studio 调试器的屏幕截图,显示 USB 大容量存储设备的 StorageVolume

为什么我在调试器中看到此信息,而不是源代码?此字段是否特定于此特定手机的 Android 发行版?

0 投票
1 回答
366 浏览

c++ - 在 Linux 中为 USB 大容量存储设备禁用读取缓冲

设想:

  • 树莓派 3 B 型
  • 通过 USB 连接的自适应模块化 ECU(将自身呈现为大容量存储设备,实际上是 2,在本例中为 sda 和 sdb)

我只是使用 fopen() 打开 /dev/sda 进行读取,我寻找到我想要读取的位置并读取了 2048 个字节。然后我重新寻找我之前寻找的位置并再次读取该数据。

在我第一次阅读时,我得到了新鲜、正确的数据。在随后的每次读取中,我一遍又一遍地得到相同的数据。在第一次读取后,它不会尝试再次轮询设备(因为它有一个活动灯),但是当我杀死我的应用程序(ctrl+c)时,我看到活动灯疯狂闪烁然后停止。

我认为这是我的代码的缓冲问题(我从 ifstream 开始,并尝试过 fopen() 和 open(),都一样)并尝试了各种不同的禁用缓冲的方法(即 setvbuf())但我'我仍然没有得到新的数据。

如果我再次关闭并打开文件,那么我会得到新数据,但这是一个非常缓慢的过程(我只能得到大约 10-12 个样本/秒)。

请记住,这不是已安装的设备,它只是作为存储设备呈现,我直接从其块设备中读取。

我将相同的代码移植到 Windows 并且它可以工作,所以我不相信它是我的代码,而是 Linux 中的某些东西。

任何帮助将不胜感激。

0 投票
1 回答
873 浏览

c++ - OSX,USB大容量存储发现

我正在尝试在 MAC OSX 下发现 USB 大容量存储设备。我希望获得设备类,并在此基础上确定设备是否为大容量存储设备。但是,对于我拥有的所有 USB 闪存驱动器,我得到的设备类 == 0,这似乎是一个复合设备。请帮我弄清楚我做错了什么,或者,也许还有其他可靠的方法来发现 USB 大容量存储设备(我需要获取 PID、VID 和挂载点)。这是我的代码:

}

0 投票
1 回答
1520 浏览

linux - 如何在闪存存储的分区表上确定磁盘几何形状(C/H/S)?

我将为闪存可移动设备编写一个磁盘分区创建程序,主要由基于 SCSI 的 I/O 控制并使用 LBA 地址访问。

作为参考,我正在研究由 Ubuntu 的磁盘实用程序分区和格式化的 SD 卡上的分区表。

我在Linux中使用'parted'软件的'unit'命令来观察卡的CHS单位和字节单位的参数。

以下是针对具有 15122432 个 LBA 扇区的 8GB sd 卡:

以下是具有 7585792 个 LBA 扇区的 4GB sd 卡:

根据我的观察,不同容量的 SD 卡上的磁盘几何值 (C/H/S) 是不同的,并且几何值似乎与分区结束的结束 CHS 地址相关联。好像..

带有以 CHS 元组结尾的分区的卡是 (c, h, s),其磁盘几何结构将是 (c + 1 / h + 1 / s + 1)。他们有关系吗?

但是这些值是如何确定的呢?这些是否取决于操作系统或文件系统?

0 投票
2 回答
684 浏览

assembly - X86-asm 代码使 USB 磁盘不可启动

我们在基于 MCU 的定制硬件上开发了 USB 复合设备(CDC 和 MSD 类)。该磁盘是一个 RAM 磁盘(24 kb 空间),在通电时,它由 MCU 供应商固件格式化(FAT 12)。不幸的是,该设备被视为可引导磁盘,典型的 BIOS 会尝试引导它。但是,我们知道将不同的 USB 磁盘连接到不同的 PC 会产生不同的结果,这取决于磁盘的 FAT 类型和 BIOS 行为(显然每个 BIOS 在 HDD 之前都有 USB 启动)。我们的目标是拥有一个无法启动的U 盘(FAT12 格式)

我们尝试了许多解决方案,但没有一个奏效。在我们看来,BIOS 似乎不仅仅是检查有效引导扇区的存在,将第一个扇区复制到地址 0x7C00 并跳转到该地址,从而将控制权交给 x86 ASM 引导代码。事实上,我们已经用 Linux 格式化了一个商业 U 盘,命令如下:

这个 USB 记忆棒现在有一个 FAT12 卷启动记录,我们还没有发现在尝试从它启动时卡住的 BIOS

因此,我们将其引导扇区复制到我们的设备中,并且我们希望它可以用作商业 USB 记忆棒。不:BIOS 在尝试引导磁盘时挂起。下面是上面Linux命令生成的引导扇区的反汇编。

显然,上面的代码打印出字符串“This is not a bootable disk. Please insert a bootable floppy and press any key to try again”,然后调用INT16H和INT19H。

例如,为什么我正在写入的 PC 的 BIOS 会打印:“尝试从 USB 磁盘启动”,然后跳转到我的硬盘,而我们设备中写入的相同汇编代码却没有?也就是说,它写“请插入...”?有一个代码可以替代它并且永远不会尝试启动我的自定义 USB 磁盘吗?

另外,在读取第一个扇区之前,BIOS 是否会与 USB 设备进行一些特殊的通信,例如,从设备描述符中获取一些信息,以便了解它是否可以用作启动盘?

谢谢大家。

0 投票
0 回答
88 浏览

.net - 如何在 .NET 中从海量存储 USB 设备中读取数据?

我正在尝试从 pH 探头接收数据(在 .NET 中)。当您按下设备上的按钮时,它会通过 USB 将读数发送到 PC。我无法弄清楚如何接收这些数据。

我已经尝试了各种接收数据事件的 USB 库(例如Florian Leitner-Fischer 的 USB 驱动程序),但它们都无法检测到我的设备。它们都需要设备的产品和供应商 ID 才能连接到它,我在硬件属性中找到了。我还使用了 USBDeview(列出所有连接的 USB 设备及其详细信息的软件)来确认它们:

pH 探头 USB 详细信息

在此处输入图像描述

这是我的 Leitner-Fischer 代码,它应该列出具有指定供应商 ID 的每个设备:

当我尝试使用其他 USB 设备的视频时,它会返回当前设备的列表。当我尝试使用大容量存储设备的 vid 时,没有返回任何内容。我尝试过的其他库的代码也会发生同样的情况,例如 LibUSBDotNet。

它是我所有连接的 USB 设备中唯一被列为大容量存储的设备。我在这里采取了不正确的方法,因为它是一种不同于其他设备的大容量存储设备,还是更有可能供应商和产品 ID 被欺骗,从而阻止开发人员做这种事情?

0 投票
0 回答
244 浏览

android - 在 Xamarin.Android 中使用 OTG 电缆从笔式驱动器复制文件,无法获取路径

我已经尝试了一切,但我无法获得 pendrive 的路径。

这是我的代码:

此外,我无法使用制造商定义的挂载点。喜欢 :

正如你在这里看到的,我已经把它写成了硬编码。

自两周以来,我就陷入了困境。

我只需要从笔式驱动器中复制一些图像文件并将其存储在应用程序数据中。