加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

基于WINCE6.0系统,SD卡和flash作为PC机的U盘

发布时间:2020-12-15 18:31:50 所属栏目:百科 来源:网络整理
导读:? 基于WINCE6.0系统,SD卡和flash作为PC机的U盘 分类:? WINCE驱动开发2012-05-04 21:26? 181人阅读 ? 评论(0) ? 收藏? 举报 ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi) 时间:2012.05.04
?

基于WINCE6.0系统,SD卡和flash作为PC机的U盘

分类:? WINCE驱动开发2012-05-04 21:26? 181人阅读? 评论(0)? 收藏? 举报

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

时间:2012.05.04

类别:WINCE驱动开发

********************************LoongEmbedded********************************

根据客户的要求,希望我们WINCE设备可以作为PC机器的可移动磁盘,并且可以通过应用软件能够实现mass storage和ActiveSync的切换,那怎么实现这个功能呢:

1.???????系统组件

选择ActiveSync、mass storage和serial组件,如下图所示:

图1

2.???????驱动的支持以及需要注意的注册表项

我们先来看USB客户端驱动的注册表信息

IF BSP_USBFNCLASS == MASS_STORAGE

[HKEY_LOCAL_MACHINEDriversUSBFunctionDrivers]

????"DefaultClientDriver"=- ; erase previous default

????"DefaultClientDriver"="Mass_Storage_Class"

ENDIF BSP_USBFNCLASS

?

[HKEY_LOCAL_MACHINEDriversUSBFunctionDriversMass_Storage_Class]

????"Dll"="usbmsfn.dll"

????"InterfaceSubClass"=dword:06

????"InterfaceProtocol"=dword:50

????"DeviceName"="DSK1:" ;?被映射为U盘的存储设备的设备名

????"FriendlyName"="Mass Storage";显示设备名

????"idVendor"=dword:045E;?Vendor ID,应该向USB组织申请

????"Manufacturer"="Generic Manufacturer (PROTOTYPE--Remember to change idVendor)";厂商命

????"idProduct"=dword:FFFF;?Product ID,由厂商定义

????"Product"="Generic Mass Storage (PROTOTYPE--Remember to change idVendor)";产品名

????"bcdDevice"=dword:0;设备的版本号

?

[HKEY_LOCAL_MACHINEDriversUSBFunctionDriversRNDIS]

????"idVendor"=dword:0547

????"Manufacturer"=LOC_USBFN_RNDIS_MANUFACTURER

????"idProduct"=dword:2c2d

????"Product"=LOC_USBFN_RNDIS_PRODUCT

?

[HKEY_LOCAL_MACHINEDriversUSBFunctionDriversSerial_Class]

????"FriendlyName"=LOC_USBFN_SERIAL_NAME

????"idVendor"=dword:045E

????"Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER

????"idProduct"=dword:00CE

????"Product"=LOC_USBFN_SERIAL_PRODUCT

????"Index"=dword:5

?

[HKEY_CURRENT_USERControlPanelComm]

"Cnct"="`USB"

在上面的注册表信息中,如果要把SD卡或是flash分区作为PC机的可移动盘,一定要让"DeviceName"="DSK1:"中的1和SD卡驱动或是flash驱动的index一致,这样就可以实现这个功能了。

3.???????mass storage和ActiveSync切换

这个功能可以通过一个应用软件来实现,主要的工作如下:

⑴基于GUID调用FindFirstDevice函数获取到USB控制器驱动(比如s3c2450_usbfn.dll)的句柄。

⑵通过上面获取的驱动句柄,以控制码IOCTL_UFN_GET_CURRENT_CLIENT调用DeviceIoControl函数来获取当前已经加载的USB客户端驱动,然后以控制码IOCTL_UFN_CHANGE_CURRENT_CLIENT调用DeviceIoControl函数来切换USB客户端驱动(比如由mass storage切换为ActiveSync)。

⑶修改注册表信息,比如把"DefaultClientDriver"="Mass_Storage_Class"改为"DefaultClientDriver"="serial"

?

具体的代码如下:

#define FILE_DEVICE_UNKNOWN?????????????0x00000022

#define METHOD_BUFFERED?????????????????0

#define FILE_ANY_ACCESS?????????????????0

#define CTL_CODE( DeviceType,Function,Method,Access ) (?????????????????

????((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)

)

#define _UFN_ACCESS_CTL_CODE(_Function)??

????CTL_CODE(FILE_DEVICE_UNKNOWN,_Function,METHOD_BUFFERED,FILE_ANY_ACCESS)

???

#define IOCTL_UFN_GET_CURRENT_CLIENT????????????????_UFN_ACCESS_CTL_CODE(3)

#define IOCTL_UFN_CHANGE_CURRENT_CLIENT?????????????_UFN_ACCESS_CTL_CODE(4)

?

?

?

#define UFN_CLIENT_NAME_MAX_CHARS 128

#define UFN_CLIENT_DESCRIPTION_MAX_CHARS 250

?

typedef struct _UFN_CLIENT_INFO {

????TCHAR szName[UFN_CLIENT_NAME_MAX_CHARS];

????TCHAR szDescription[UFN_CLIENT_DESCRIPTION_MAX_CHARS];

} UFN_CLIENT_INFO,*PUFN_CLIENT_INFO;

?

typedef struct _UFN_CLIENT_NAME {

????TCHAR szName[UFN_CLIENT_NAME_MAX_CHARS];

} UFN_CLIENT_NAME,*PUFN_CLIENT_NAME;

?

static HKEY hOpenKey=NULL;

#define DRIVER_USB_KEY TEXT("DriversUSBFunctionDrivers")

#define DRIVER_USB_NAME TEXT("DefaultClientDriver")

#define DRIVER_USB_VALUE_SERIAL TEXT("Serial_Class")

#define DRIVER_USB_VALUE_STORAGE TEXT("Mass_Storage_Class")

HANDLE GetUfncontroller()

?

{

?

????HANDLE hUfn = NULL;

?

DEVMGR_DEVICE_INFORMATION di;

?

memset(&di,sizeof(di));

?

di.dwSize = sizeof(di);

GUID guidUsbFn = { 0xE2BDC372,0x598F,0x4619,0xBC,0x50,0x54,0xB3,0xF7,0x84,0x8D,0x35 };

????HANDLE hf = FindFirstDevice(DeviceSearchByGuid,&guidUsbFn,&di);

?

if (hf != INVALID_HANDLE_VALUE)

?

{

?

???hUfn = CreateFile(di.szBusName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL);

?

CloseHandle(hf);

?

}

?

else

?

{

?

???hUfn = INVALID_HANDLE_VALUE;

?

}

?

return hUfn;

?

}

?

void CusbfunctionswitchDlg::OnBnClickedStorageActivesyncSwitch()

{

?????????// TODO: Add your control notification handler code here

?????????HANDLE hDisk = NULL;

?????????BOOL???fnTypeStorage = TRUE;

?

?????????UFN_CLIENT_NAME uname;

?

?????????UFN_CLIENT_INFO uinfo;

?

?????????DWORD dwReturn = 0;

?

?????????_tcscpy(uname.szName,L"Mass_Storage_Class");

?

?

?

?????????hDisk = GetUfncontroller();

?

?????????if (hDisk == INVALID_HANDLE_VALUE)

?

?????????{

?

?????????RETAILMSG(1,(TEXT("invalid usb handle,error = %d/r/n"),GetLastError()));

?

?

?????????}

?

?????????if (DeviceIoControl(hDisk,IOCTL_UFN_GET_CURRENT_CLIENT,&uinfo,sizeof(uinfo),&dwReturn,0) && (dwReturn == sizeof(uinfo)))

?

?????????{

????????

?????????if (_tcscmp(L"Mass_Storage_Class",uinfo.szName) == 0)

?????????{

???????????????????_tcscpy(uname.szName,L"Serial_Class");

???????????????????fnTypeStorage = FALSE;

?

?????????}

?????????else

?????????{

???????????????????fnTypeStorage = TRUE;

?????????}

?

?????????}

?????????if (!DeviceIoControl(hDisk,IOCTL_UFN_CHANGE_CURRENT_CLIENT,&uname,sizeof(uname),NULL))

?

?????????{

???????????????????RETAILMSG(1,(TEXT("deviceiocontrol failed,GetLastError()));

?

?????????}

?????????else

?????????{

???????????????????LONG????lResult = 0;

??????????????????

???????????????????if(fnTypeStorage)

???????????????????{

???????????????????????????

?

????????????????????????????lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,DRIVER_USB_KEY,&hOpenKey );

???????????????????????????

????????????????????????????if(ERROR_SUCCESS == lResult)

????????????????????????????{

?????????????????????????????????????lResult = RegSetValueEx(hOpenKey,DRIVER_USB_NAME,REG_SZ,(BYTE *)DRIVER_USB_VALUE_STORAGE,sizeof(DRIVER_USB_VALUE_STORAGE));

????????????????????????????}

?

???????????????????}

???????????????????else

???????????????????{

????????????????????????????lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,&hOpenKey );

????????????????????????????if(ERROR_SUCCESS == lResult)

????????????????????????????{

?????????????????????????????????????lResult = RegSetValueEx(hOpenKey,(BYTE *)DRIVER_USB_VALUE_SERIAL,sizeof(DRIVER_USB_VALUE_SERIAL));

????????????????????????????}

???????????????????????????

???????????????????}

???????????????????RegCloseKey( hOpenKey );

?????????}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读