USB Mass storage大容量SD卡问题

hwei10 2011-04-27 09:54:58
在做USB mass storage功能时出现如下问题:
2G以下的卡通过USB MASS STORAGE在PC端能正常识别;
4G或8G的卡在PC端提无法识别。

系统是WINCE5.0,我用4G的卡调试了一下,发现BLOCK.CPP文件中的STORE_Init函数中OpenStore()打开失败。
请各位大侠给点建议,谢谢。

...全文
533 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhcnav456 2012-08-10
  • 打赏
  • 举报
回复
bhcnav456 2012-08-10
  • 打赏
  • 举报
回复


成功,综合14楼和13楼方案,可以结了
bhcnav456 2012-08-10
  • 打赏
  • 举报
回复
没看到图呀
ZhuXudong0518 2012-08-10
  • 打赏
  • 举报
回复
各位搞定,详细方案如下:
1:找到D:/WINCE600/PRIVATE/WINCEOS/COREOS/STORAGE/FSDMGR目录下的volumeapi.cpp文件,找到 FSDMGR_CreateFileW 函数,添加红色标记部分的代码,编译后可解决大容量SD卡的SN号读取问题

EXTERN_C HANDLE FSDMGR_CreateFileW (MountedVolume_t* pVolume, HANDLE hProcess,
const WCHAR* pPathName, DWORD Access, DWORD ShareMode,
SECURITY_ATTRIBUTES* pSecurityAttributes, DWORD Create,
DWORD FlagsAndAttributes, HANDLE hTemplate,
PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD SecurityDescriptorSize)
{
HANDLE h = INVALID_HANDLE_VALUE;

SECURITY_ATTRIBUTES SecurityAttributes;

DEBUGCHK (!pSecurityAttributes);
if (pSecurityDescriptor) {
SecurityAttributes.nLength = sizeof (SECURITY_ATTRIBUTES);
SecurityAttributes.lpSecurityDescriptor = pSecurityDescriptor;
SecurityAttributes.bInheritHandle = FALSE;
pSecurityAttributes = &SecurityAttributes;
}

LRESULT lResult = pVolume->EnterWithWait ();

if (ERROR_SUCCESS == lResult) {

// Get the topmost file system object associated with the volume.
// If another filter is hooked between now and the time we call
// create file, we'll still use this one. This file system object
// will be referenced by the handle object.
FileSystem_t* pFileSystem = pVolume->GetFileSystem ();

DWORD Attributes = 0;
if (OPEN_EXISTING != Create) {
// If not trying to open an existing file, there is the
// possibility that we will create a new one. In order to
// properly generate notifications we need to detect whether or
// not the file already exists using GetFileAttributes.
Attributes = pFileSystem->GetFileAttributesW (pPathName);
}

HANDLE hInt = pFileSystem->CreateFileW (hProcess, pPathName, Access,
ShareMode, pSecurityAttributes, Create,
FlagsAndAttributes, hTemplate);

if (INVALID_HANDLE_VALUE != hInt) {

// The file system succeeded creating/opening the file, so
// allocate an FileSystemHandle_t object and associate it with the
// MountedVolume_t object.

// Indicate whether or not this is a console or psuedo-device
// handle when creating the FileSystemHandle_t object. This will dictate
// how notifications are performed on the handle.
DWORD HandleType = FileSystemHandle_t::HDL_FILE;
/*******************chaged by pang********************************/
if (IsPsuedoDeviceName(pPathName))

{

HandleType |= FileSystemHandle_t::HDL_PSUEDO;

}
/***************************************************/

if (IsConsoleName (pPathName)) {
HandleType |= FileSystemHandle_t::HDL_CONSOLE;
}

// Allocte a new handle object to track this item.
h = pVolume->AllocFileHandle (reinterpret_cast<DWORD> (hInt),
HandleType, pFileSystem, pPathName, Access);

if (INVALID_HANDLE_VALUE != h) {

// Perform notifications only when the handle is for a real file,
// not a pseudo device handle or console handle. Devices and streams
// shouldn't ever generate notifications.
if (FileSystemHandle_t::HDL_FILE == HandleType &&
!IsPsuedoDeviceName (pPathName)) {

// Successfully opened the file. Perform file notifications
// as required.
if (INVALID_FILE_ATTRIBUTES == Attributes) {

// The file did not previously exist; notify that it has
// been added.
pVolume->NotifyPathChange (pPathName, FALSE, FILE_ACTION_ADDED);

} else if ((CREATE_ALWAYS == Create) ||
(TRUNCATE_EXISTING == Create)) {

// The file previously existed but is being re-created or
// truncated so notify that it has changed.
pVolume->NotifyPathChange (pPathName, FALSE, FILE_ACTION_MODIFIED);
}
}

} else {

// Failed to allocate a handle object, so close the handle
// that was returned by the file system.
pFileSystem->CloseFile (reinterpret_cast<DWORD> (hInt));
}

} else if (pPathName && (wcsicmp (pPathName, L"\\VOL:") == 0)) {

// TODO: Privilege check for raw disk i/o. This requires more privilege than file i/o.

// Clear error code set by the FSD when it failed to open VOL: on its own.
SetLastError (ERROR_SUCCESS);

// We failed to open the file, but if it is VOL: special case this
// and allow direct partition access.
h = pVolume->AllocFileHandle (reinterpret_cast<DWORD> (hInt),
FileSystemHandle_t::HDL_PSUEDO, pFileSystem, pPathName, Access);
}

pVolume->Exit ();

} else {

SetLastError (lResult);
}

return h;
}
2:如图所示添加系统组件,使系统支持exFAT文件系统,然后编译内核OK,烧录4G以上大容量SD卡在PC端便可以识别
ZhuXudong0518 2012-02-09
  • 打赏
  • 举报
回复
最新进展:4G卡设备可打开,也可获取设备信息。代码如下:
// open store
TCHAR sdFolderName[64]; //the SD card name such as : MMC disk, Storge card
TCHAR sdDestFileName[64];//"\\sdFolderName\\VOL:"
memset(sdFolderName,0,64);
memset(sdDestFileName,0,64);
wsprintf(sdFolderName,TEXT("%s"),TEXT("Storage Card"));
swprintf(sdDestFileName,TEXT("\\%s\\VOL:"),sdFolderName);
g_hStore_SD = CreateFile(sdDestFileName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

// g_hStore_SD = OpenStore(_T("DSK4:"));//g_hStore_SD = OpenStore(g_szDeviceName);
if ((g_hStore_SD == NULL) || (g_hStore_SD == INVALID_HANDLE_VALUE)) {
dwError = GetLastError();
DEBUGMSG(ZONE_ERROR, (_T(
"%s failed to open store %s; error = %u\r\n"
), pszFname, g_szDeviceName, dwError));
goto EXIT;
}
DEBUGMSG(ZONE_COMMENT, (_T("%s opened store %s\r\n"), pszFname, g_szDeviceName));

// read disk information
fResult = DeviceIoControl(
g_hStore_SD,
IOCTL_DISK_GETINFO,
NULL,
0,
&g_diDiskInfo_SD,
sizeof(g_diDiskInfo_SD),
&dwBytesReturned,
NULL);

通过打印信息可看到g_diDiskInfo_SD.di_bytes_per_sect和g_diDiskInfo_SD.di_total_sectors的值分别为0x200、0x760800.

但结果还是:在PC端不能通过MASS Storage对4G卡进行访问。同样的代码,2G卡访问正常。

各位加油啊,结论马上就出现啦!
ZhuXudong0518 2012-02-08
  • 打赏
  • 举报
回复
同样的问题。顶一下!有解决的兄弟吗?
shaoshengli 2011-12-20
  • 打赏
  • 举报
回复
楼上的问题解决没有呀?我也遇到相同的问题
jonsenwu 2011-05-09
  • 打赏
  • 举报
回复
SDBUS2需要设置吧,这个是SD卡驱动问题,好像还需要加上response07
  • 打赏
  • 举报
回复
我的wince6可以支持4G,8G没试过。
敖elf鸿 2011-05-07
  • 打赏
  • 举报
回复
是驱动的问题。
guetcw 2011-05-06
  • 打赏
  • 举报
回复
2G以上的卡是SD2.0协议,2G以下的卡是SD1.1协议,可能是驱动的问题,升级一下
bruce0525 2011-05-05
  • 打赏
  • 举报
回复
应该是驱动的问题,可能里面某个size的参数需要修改
vkvsyu 2011-04-28
  • 打赏
  • 举报
回复
在哪里下补丁啊?
hwei10 2011-04-28
  • 打赏
  • 举报
回复
请问驱动问题是USB的问题,还是SD驱动的问题,因为wince下是可以识别大容量8G卡的。
woshi_ziyu 2011-04-28
  • 打赏
  • 举报
回复
真的是驱动的问题
91program 2011-04-27
  • 打赏
  • 举报
回复
可能是SD卡驱动的问题,用最新的BSP+CE系统补丁试试
VS1000模块是一个非常简单的Uart控制的Ogg Vorbis音频播放器。Ogg Vorbis文件格式对于需要高度压缩音频内容的应用程序特别有用。音频内容可以位于嵌入式闪存或可移动的micro-SD卡中。嵌入式和类型闪存有两个选项2MB和16MB。频繁读取音频时建议使用音频内容(以获得最佳可靠性)。Micro-SD卡(不包含在内)可以提供巨大的音频内容,但由于大多数SD卡现在使用多级nand闪存架构,因此它们不适合多年来作为嵌入式和闪存的不断读取。该模块支持所有选项,微型SD卡,2MB闪存和16MB闪存之间的决定留给客户。 与主机的接口已经变得非常简单。六线连接(VCC,GND,RX,TX,LOUT,ROUT)是启动音频所需的一切。该模块支持用于耳机和线路输出的独立引脚。当USB引脚连接到PC时,micro-SD卡和Flash中的音频内容可用作大容量存储器。 硬件特性 播放来自micro-SD卡或内部SPI Flash(或两者)的音频 使用汽车分级嵌入式和闪存(2MB或16MB)作为启动固件和/或音频内容 由UART控制(或IO引脚) 使用高性能免许可证的Ogg Vorbis解码器来压缩音频 可以自定义,(程序)功能和音频内容 固件定制工具VSIDE免费提供 内部闪存的更新/升级可以通过micro-SD卡完成 线性输出或耳机立体声模拟输出,信噪比> 90dB(A加权) 支持可变比特率和许多采样率 单电源3.6 ... 5.5V,注:IOVDD由内部稳压器产生,IO引脚不能承受5V电压! 当USB连接到主机时,SD卡和闪存作为可移动存储器可见。文件可以从主机拖放 低功耗运行 工业温度范围-30℃至+ 85℃ 采用VS1000芯片 默认固件 默认的uart控制播放器固件有四个功能: usbmass - 当USB连接到PC时,SPI闪存可以看作是USB Mass Storage spiplayer - 从SPI FLASH播放音乐文件 sdplayer - 从SD卡播放音乐(Ogg Vorbis或WAV) sdmass - 当USB连接到PC和插入的SD卡时,将SD卡看作是USB Mass Storage sdupdate程序 - 从SD卡更新SPI FLASH的固件或内容 播放器操作由UART控制,并提供状态打印 可能感兴趣的项目设计: VS1000 多媒体播放器参考设计官方资料
U盘工具包集多款U盘测试、芯片检测、扩容检测、实用工具于一体,包含如下: 一、U盘速度检测 1,ATTO Disk Benchmarks V2.46; 2,HD Tune Pro V4.01 专业版; 3,FastCopy V2.02; 4,HD Tach V3.0.1.0; 二、U盘产品检测 1,ChipGenius芯片精灵V3.01【USB主控芯片检测工具】; 2,MyDiskTest V2.93【U盘扩容检测/速度测试工具】; 3,FlashGenius V3.4【闪存精灵/FLASH参数查询】 ; 三、U盘实用工具 1,护U使者 V1.28【全能型优盘工具】; 2,弹U专家 v1.06【强力卸载无法删除的USB移动存储设备】; 3,魅色U盘精灵 V1.74【U盘加密+文档同步+计算机锁定】; 四、U盘启动&格式化 1、USBoot V1.70【U盘启动盘制作工具】; 2、HP优盘格式化工具HPUSBFW 2.20.exe; 3、HA-LLFTOOL 低级格式化; 更新说明 -- 2010-9-5 ----------------------------------------------------------------- 新增 HP优盘格式化工具HPUSBFW 2.20; 新增 HA-LLFTOOL低格工具汉化版; 更新 FastCopy 至 V2.02; V2.02 1.如果Fastcopy安装于Vista或者Win7系统的Progmram Files文件夹(无论UAC是否开启)时,配置文件和日志文件将存放于(\Users\(USER)\AppData\roaming\FastCopy)目录。 2.修复一些BUG。 --------------------------- 各软件介绍: ATTO Disk Benchmarks ----------------------------------------------------------------- ATTO Disk Benchmark 就是专门用来解决U盘,移动硬盘读写速度测试的绿色小软件. ATTO Disk Benchmark 是一款简单易用的磁盘传输速率检测软件,可以用来检测硬盘, U盘, 存储卡及其它可移动磁盘的读取及写入速率. 该软件使用了不同大小的数据测试包, 数据包按0.5K, 1.0K, 2.0K直到到8192.0KB进行分别读写测试, 测试完成后数据用柱状图的形式表达出来. 很好的说明了文件大小比例不同对磁盘速度的影响. HD Tune Pro ----------------------------------------------------------------- 一款小巧易用的硬盘工具软件,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。另外,还能检测出硬盘的固件版本、序列号、容量、缓存大小以及当前的Ultra DMA模式等。虽然这些功能其它软件也有,但难能可贵的是此软件把所有这些功能积于一身,而且非常小巧,速度又快,更重要的是它是免费软件,可自由使用。 FastCopy ----------------------------------------------------------------- FastCopy 是 Windows 平台上最快的文件复制、删除软件。 HD Tune Pro ----------------------------------------------------------------- 一款小巧易用的硬盘工具软件,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。另外,还能检测出硬盘的固件版本、序列号、容量、缓存大小以及当前的Ultra DMA模式等。虽然这些功能其它软件也有,但难能可贵的是此软件把所有这些功能积于一身,而且非常小巧,速度又快,更重要的是它是免费软件,可自由使用。 ChipGenius芯片精灵 ----------------------------------------------------------------- ChipGenius是一款USB设备芯片型号检测工具,可以自动查询U盘、MP3/MP4、读卡器、移动硬盘等一切USB设备的主控芯片型号、制造商、品牌、并提供相关资料下载地址。当然也可以查询USB设备的VID/PID信息、设备名称、接口速度、序列号、设备版本等。 软件绿色小巧,即插即用,是数码消费者、电子爱好者、DIY人士和数码维修人员身边的好帮手。 ------------ 1、快速修复U盘:不用拆机即可查询U盘的芯片型号,快速找到对应的量产工具 2、帮你识

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧