為了幫助用戶提高生產測試效率,我們提供了代為客戶拷貝應用程序的服務,在主板出廠之前我們會將用戶提交的所有程序和文件拷貝到用戶指定的系統目錄中,用戶拿到主板后可直接裝機測試,大大節省了生產測試時間。客戶也可參考此方法,在自己的整機生產中實現應用程序及配置文件的自動拷貝。本文以下介紹在CE平臺實現應用程序及配置文件自動拷貝的具體步驟。
英創主板處于調試模式啟動時,會查詢系統的usbdisk根目錄下是否有名為autotest.txt的配置文件,如果配置文件存在則會執行文件中指定的exe程序,程序的拷貝正是利用系統的這一功能自動實現的。
實現程序的自動拷貝需要以下幾個步驟:
1、編寫autotest.txt配置文件
配置文件中需要指定要啟動的exe完整路徑,同時可配置系統網口1的網絡參數,下面是示例配置。
[LOCAL_MACHINE] DefaultGateway="192.168.201.19" IPAddress="192.168.201.220" SubnetMask="255.255.255.0" [USER_EXE] Name="\usbdisk\autocfg.exe" Parameters="" [SYSTEM] Store="25" |
2、編寫自動配置程序
配置程序autocft.exe一般需要實現將應用程序拷貝到主板指定目錄的功能,同時也可完成用戶自定義的一些配置功能,比如增加特定注冊表、燒寫開機畫面等。下面是一些示例代碼可供用戶參考。
AutoCopy函數實現將當前執行的配置程序所在目錄的全部文件拷貝到系統的nandflash目錄中。
DWORD AutoCopy( ) { DWORD dwResult; TCHAR szCurrentDir[MAX_PATH]; TCHAR szLocalFile[MAX_PATH]; TCHAR szNewFile[MAX_PATH]; TCHAR szDisFolder[MAX_PATH]; CHAR localFile[MAX_PATH]; CHAR newFile[MAX_PATH]; int i1, diskType; dwResult = GetModuleFileName( NULL,szCurrentDir, sizeof( szCurrentDir ) ); if( 0 == dwResult ) { printf("GetModuleFileName failure!\r\n" ); return -1; } TCHAR *pch = _tcsrchr( szCurrentDir, '\\' ); *(pch+1) = '\0'; _tcslwr(szCurrentDir); pch = _tcsstr( szCurrentDir, _T("usb") ); if( NULL != pch ) { _tcscpy( szLocalFile, szCurrentDir ); _tcscat( szLocalFile, _T("*.*")); diskType = 1; GetFolderName(diskType, szDisFolder); HANDLE hFind; WIN32_FIND_DATA FindFileData; BOOL BFind; hFind = FindFirstFile( szLocalFile, &FindFileData); if(hFind != INVALID_HANDLE_VALUE) { BFind = TRUE; while( BFind ) { if( FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ) { _tcscpy( szLocalFile, szCurrentDir ); _tcscat( szLocalFile, FindFileData.cFileName ); _stprintf(szNewFile, _T("\\%s\"), szDisFolder); _tcscat( szNewFile, FindFileData.cFileName ); dwResult = CopyFile( szLocalFile, szNewFile, FALSE ); memset( localFile, 0, sizeof(localFile)); i1 = wcslen( szLocalFile ); wcstombs( localFile, szLocalFile, i1 ); memset( newFile, 0, sizeof(newFile)); i1 = wcslen( szNewFile ); wcstombs( newFile, szNewFile, i1 ); if( dwResult == 0 ) { printf("Copy %s to %s failure!\r\n", localFile, newFile ); return -1; } else { printf("Copy %s to %s successful!\r\n", localFile, newFile ); } } BFind = FindNextFile( hFind, &FindFileData ); } } FindClose( hFind ); } return 0; } // Get "Folder" name from register. // type = 0: SDMemory // type = 1: Nand // type = 2: USB // type = 3: EMMC // void GetFolderName( int type, LPWSTR szName ) { HKEY hKey = NULL; DWORD dwType=REG_SZ; DWORD size=100; DWORD ret; TCHAR szFolderPath[80]; switch( type ) { case 0: _tcscpy( szFolderPath, REG_SDFOLDER_PATH ); break; case 1: _tcscpy( szFolderPath, REG_NANDFOLDER_PATH ); break; case 2: _tcscpy( szFolderPath, REG_USBFOLDER_PATH ); break; case 3: _tcscpy( szFolderPath, REG_EMMC_PATH ); break; default: return; } //get the folder Name from registry in case BSP is using non-default name if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, (LPWSTR)szFolderPath, 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, NULL)) { ret=RegQueryValueEx(hKey, L"Folder", 0, &dwType, (BYTE*)szName, &size); if (ret!=ERROR_SUCCESS) RETAILMSG(1,(L"RegQueryValueEx returned error %d dwType=%d size=%dbufSz=%d\r\n", ret,dwType,size,sizeof(szName))); } if( hKey!=NULL ) RegCloseKey(hKey); return; } |
英創主板支持開機畫面在線更新,《WinCE工控主板在線更新開機畫面(2017新版)》中提到的lu程序,用戶也可以在配置程序中直接調用實現開機畫面的自動更新,下面是利用lu更新U盤目錄下usersplash800480.bmp圖片的示例代碼。
PROCESS_INFORMATION processInfo; TCHAR szProgram[] = _T("lu.exe"); TCHAR szCmdLine[100] = _T("usbdisk\\usersplash800480.bmp"); BOOL result = CreateProcess( szProgram, szCmdLine,NULL, NULL, FALSE,CREATE_NEW_CONSOLE, NULL, NULL, NULL, &processInfo ); if( result == 0 ) { //執行失敗... } |
3、將autotest.txt放在U盤根目錄,同時將配置程序autocft.exe和需要拷貝到主板上的應用程序及文件放在U盤指定目錄中。
4、將U盤連接到英創主板,主板在調試模式啟動后會自動執行用戶指定的配置程序,完成系統配置工作。
系統默認只會執行一次查詢autotest.txt啟動配置程序的過程,如果希望這個功能總是有效,可在配置程序開始處增加一個清除注冊表標志的工作,當系統注冊表項HKEY_LOCAL_MACHINE\Emtronix或HKEY_LOCAL_MACHINE\Wstartup下的Count等于0時,系統在調試模式下就會查詢U盤中的autotest.txt配置文件。下面是count清零代碼。
HKEY hKey; DWORD dwVal, dwRet; DWORD dwType = REG_DWORD; DWORD dwBufLen = sizeof(DWORD); if((dwRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("Emtronix"), 0, 0, &hKey)) != ERROR_SUCCESS) { dwRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("Wstartup"), 0, 0, &hKey); } if(dwRet == ERROR_SUCCESS) { dwVal = 0; RegSetValueEx(hKey, _T("Count"), 0, dwType, (BYTE*)&dwVal, dwBufLen); RegCloseKey(hKey); // close registry } |
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35296
發布評論請先 登錄
相關推薦
評論