基于WINCE6.0系统,SD卡和flash作为PC机的U盘
?
基于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 ); ?????????} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |