📄 z228_usb_msc.cpp
字号:
Sleep(25000);
while (TRUE) {
gpio.num = GPIO_num; gpio.pin = GPIO_pin;
gpio.code = GPIO_Read; value = 0;
gpio.value = &value;
KernelIoControl(HAL_IOCTL_GPIO , &gpio , sizeof(OEM_IOCTL_GPIO) , 0 , 0 , 0 );
if(bCharge && value ==0) {
#ifdef DEBUG_TEXT
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "usb device check the usb cable pull out\r\n");
fflush(fp);
}
#else
RETAILMSG(1, (_T("usb device check the usb cable pull out\r\n")));
#endif
bCharge = 0;
}
if((value == 0) && (pContext->fAttached || pContext->hIST)) {
#ifdef DEBUG_TEXT
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "gpio = %d set event\r\n", value);
fflush(fp);
}
#else
RETAILMSG(1, (_T("gpio = %d set event\r\n"), value));
#endif
pContext->fExitIST = TRUE;
SetEvent(pContext->hevDevEvent);
Sleep(1100);
}
else{
if( pContext->fFunction ==1 && pContext->fAttached == FALSE ) {
z228_Hw_Init();
Sleep(1000);
}
}
Sleep(1200);
}
RETAILMSG(1, (_T("-ISTMain1\r\n")));
return 0;
}
// z228 interrupt service routine.
static
DWORD
WINAPI
ISTMain(
LPVOID lpParameter
)
{
PZ228_CONTEXT pContext = (PZ228_CONTEXT) lpParameter;
DWORD Mode = -1;
// int value = -1;
// OEM_IOCTL_GPIO gpio;
ValidateContext(pContext);
RETAILMSG(USB_INIT, (_T("+ISTMain\r\n")));
CeSetThreadPriority(pContext->hIST, pContext->dwISTPriority);
// disable the out endpoint
RETAILMSG(USB_DEBUG, (_T("before(2) = %x\r\n"),usb_read(UDC_TX_STATUS(2))));
usb_clear((1 << 2), UDC_ENDP_INTR_ENABLE);
// Force into full speed mode if required.
while (TRUE) {
DWORD dwWait = WaitForSingleObject(pContext->hevIntrEvent, INFINITE);
if (pContext->fExitIST) {
break;
}
if (dwWait == WAIT_OBJECT_0) {
Mode = (usb_read(UHC_OTG_CSR)& OTG_MODE_DEVICE)? DEV_MODE : HOST_MODE;
if(Mode == DEV_MODE) {
HandleUSBEvent(pContext);
InterruptDone(29);
}
//因为重复弹框,故去掉下面的代码 2007-2-12
#if 0
else if(Mode == HOST_MODE) {
pContext->fExitIST = TRUE;
SetEvent(pContext->hevDevEvent);
Sleep(100);
}
#endif
}
else {
RETAILMSG(USB_DEBUG, (_T("ISTMain: WaitForSingleObject failed. Exiting IST.\r\n")));
break;
}
}
// Send detach
pContext->fSpeedReported = FALSE;
//z228_suspend_intr(pContext);
if(pContext->fAttached == TRUE) {
pContext->pfnNotify(pContext->pvMddContext,UFN_MSG_BUS_EVENTS, UFN_DETACH);
pContext->fAttached = FALSE;
usb_set(UDC_BUSRESET_INTR, UDC_INTR_ENABLE);
usb_clear(UDC_SUSPEND_INTR, UDC_INTR_ENABLE);
}
RETAILMSG(USB_INIT, (_T("-ISTMain\r\n")));
return 0;
}
static
DWORD
WINAPI
MainThread(
LPVOID lpParameter
)
{
FUNCTION_ENTER_MSG();
PZ228_CONTEXT pContext = (PZ228_CONTEXT) lpParameter;
DWORD dwID_Change = -1, dwMode = -1;
DWORD dwRet, dwWait ;
BOOL fIntInitialized;
HCURSOR hCur;
OEM_IOCTL_GPIO gpio;
int value = 0;
DWORD *pAddrGpio = NULL;
RETAILMSG(USB_INIT, (_T("+MainThread \r\n")));
pContext->fExitIST = false;
#ifdef DEBUG_TEXT
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "++MainThread\n");
fflush(fp);
}
#endif
// Create Z228 Dev notify event
pContext->hevDevEvent = CreateEvent(0, FALSE, FALSE, _T("DevNotifyEvent"));
if (pContext->hevDevEvent == NULL) {
dwRet = GetLastError();
RETAILMSG(USB_ERROR, (_T("%s Error creating Z228 DevNotifyEvent. Error = %d\r\n"),
pszFname, dwRet));
goto EXIT;
}
pContext->hevDevDoneEvent = CreateEvent(0, FALSE, FALSE, _T("DevNotifyDoneEvent"));
if (pContext->hevDevDoneEvent == NULL) {
dwRet = GetLastError();
RETAILMSG(USB_ERROR, (_T("%s Error creating z228 DevNotifyDoneEvent. Error = %d\r\n"),
pszFname, dwRet));
goto EXIT;
}
// Create Z228 Host notify event
pContext->hevHostEvent= CreateEvent(0, FALSE, FALSE, _T("HostNotifyEvent"));
if (pContext->hevHostEvent == NULL) {
dwRet = GetLastError();
RETAILMSG(USB_ERROR, (_T("%s Error creating Z228 HostNotifyEvent. Error = %d\r\n"),
pszFname, dwRet));
goto EXIT;
}
pContext->hevHostDoneEvent = CreateEvent(0, FALSE, FALSE, _T("HostNotifyDoneEvent"));
if (pContext->hevHostDoneEvent== NULL) {
dwRet = GetLastError();
RETAILMSG(USB_ERROR, (_T("%s Error creating z228 HostNotifyDoneEvent. Error = %d\r\n"),
pszFname, dwRet));
goto EXIT;
}
while(TRUE){
Sleep(100);
dwWait = WaitForSingleObject(pContext->hevDevEvent, INFINITE);
if (dwWait != WAIT_OBJECT_0) {
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Dev ERROR EVENT\r\n");
fflush(fp);
}
}
#else
RETAILMSG(USB_ERROR, (_T("Dev ERROR EVENT\r\n")));
#endif
continue;
}
RETAILMSG(USB_DEBUG, (_T("Device Rx ID change!charge = %d\r\n"), bCharge));
if(pContext->fExitIST) {
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "++MainThread\n");
fflush(fp);
}
}
#else
RETAILMSG(1, (_T("Exit ISTMain! %d\r\n"), bCharge));
#endif
if(pContext->hIST) {
SetEvent(pContext->hevIntrEvent);
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Stop Dev IST ...\r\n");
fflush(fp);
}
}
#else
RETAILMSG(1, (_T("Stop Dev IST ...\r\n")));
#endif
dwWait = WaitForSingleObject(pContext->hIST, 2000);
if ( dwWait != WAIT_OBJECT_0 ) {
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Stop Dev IST Forcely ...\r\n");
fflush(fp);
}
}
#else
RETAILMSG(USB_ERROR, (_T("Stop Dev IST Forcely ...\r\n")));
#endif
TerminateThread(pContext->hIST , DWORD(-1));
}
CloseHandle(pContext->hIST);
if(pContext->fAttached == TRUE) {
pContext->pfnNotify(pContext->pvMddContext,UFN_MSG_BUS_EVENTS, UFN_DETACH);
pContext->fAttached = FALSE;
}
pContext->hIST = NULL;
pContext->fExitIST = FALSE;
}
pContext->fFunction = FALSE;
Sleep(50);
InterruptDone(29);
InterruptDisable(29);
if(pContext->hevIntrEvent) {
CloseHandle(pContext->hevIntrEvent);
pContext->hevIntrEvent = NULL;
}
usb_set(UDC_BUSRESET_INTR |UDC_SUSPEND_INTR, UDC_INTR);
if(bCharge) {
gpio.num = GPIO_num; gpio.pin = GPIO_pin;
gpio.code = GPIO_Read; value = 0;
gpio.value = &value;
KernelIoControl(HAL_IOCTL_GPIO , &gpio , sizeof(OEM_IOCTL_GPIO) , 0 , 0 , 0 );
bCharge = (value>0);
if(!bCharge)
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Stop Dev IST Forcely ...\r\n");
fflush(fp);
}
}
#else
RETAILMSG(1, (TEXT("Dev Gpio value = 0x%x 0x%x\n"), bCharge, value));
#endif
}
//write the value to the register
{
HKEY ActiveKey;
DWORD status;
const LPCTSTR pszKey = L"Drivers\\BuiltIn\\USB_MSC";
//DWORD dwValLen;
status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
(LPCWSTR)pszKey,
0,
0,
&ActiveKey );
if(status != ERROR_SUCCESS){
RETAILMSG(USB_ERROR, (TEXT("500k debug: Failed to open active key \r\n")));
}
RETAILMSG(USB_DEBUG, (TEXT("set: Val = %d\r\n"), bCharge));
//set the registry
status = RegSetValueEx(ActiveKey, L"MscExInfo", 0, REG_DWORD, (BYTE *)&bCharge, sizeof(DWORD));
if(status != ERROR_SUCCESS){
RETAILMSG(USB_ERROR, (TEXT("Failed to set active key\r\n")));
RegCloseKey(ActiveKey);
}
RegCloseKey(ActiveKey);
}
SetEvent(pContext->hevHostEvent);
Sleep(50);
continue;
}
else {
bCharge = 1;
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Start Dev ISTMain! %d\r\n", bCharge);
fflush(fp);
}
}
#else
RETAILMSG(1, (_T("Start Dev ISTMain! %d\r\n"), bCharge));
#endif
Sleep(200);
pContext->hevIntrEvent = CreateEvent(0, FALSE, FALSE, NULL);
if(pContext->hevIntrEvent == NULL) {
DWORD dwRet = GetLastError();
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Error creating z228 IntrEvent. Error = %d\r\n", dwRet);
fflush(fp);
}
}
#else
RETAILMSG(USB_ERROR, (_T("Error creating z228 IntrEvent. Error = %d\r\n"),dwRet));
#endif
continue;
}
//enable intr
fIntInitialized = InterruptInitialize(29, pContext->hevIntrEvent , NULL, 0);
if (fIntInitialized == FALSE) {
DWORD dwRet = GetLastError();
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Z228 USB Dev interrupt initialization failed! Error = %d\r\n", dwRet);
fflush(fp);
}
}
#else
RETAILMSG(USB_ERROR, (_T(" Z228 USB Dev interrupt initialization failed! Error = %d\r\n"),dwRet));
#endif
if(pContext->hevIntrEvent) {
CloseHandle(pContext->hevIntrEvent);
pContext->hevIntrEvent = NULL;
}
continue;
}
Sleep(50);
// Disable cursor, and save old value
hCur = SetCursor(NULL);
#if 0
{
PROCESS_INFORMATION pi;
HANDLE hEvents[2];
hEvents[0] = CreateEvent(NULL, FALSE, FALSE, L"SelUsbEvent");
hEvents[1] = CreateEvent(NULL, FALSE, FALSE, L"SelChargeEvent");
if(!CreateProcess(L"\\windows\\UsbTip.exe",L".EXE",NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,NULL,&pi))
{
RETAILMSG (1, (TEXT("open UsbTip.exe FAIL!\r\n")));
}
else
{
if( WaitForMultipleObjects(2, &hEvents[0], FALSE, INFINITE) == WAIT_OBJECT_0)
{
pContext->fFunction = TRUE;
}
else
{
pContext->fFunction = FALSE;
}
}
if(hEvents[0])
{
CloseHandle(hEvents[0]);
}
if(hEvents[1])
{
CloseHandle(hEvents[1]);
}
}
#else
pContext->fFunction = (MessageBox( NULL, MESSAGE_TITLE,TEXT("USB"), MB_YESNO |MB_DEFBUTTON2 |MB_TOPMOST|MB_ICONWARNING) == IDYES ) ? TRUE : FALSE;
#endif
SetCursor(hCur);
// start intr ist
if( pContext->hIST ) {
RETAILMSG(USB_DEBUG, (_T("Stop Dev IST 2...\r\n")));
pContext->fExitIST = TRUE;
SetEvent(pContext->hevIntrEvent);
RETAILMSG(USB_ERROR, (_T("Stop Dev IST ...\r\n")));
dwWait = WaitForSingleObject(pContext->hIST, 2000);
if ( dwWait != WAIT_OBJECT_0 ) {
RETAILMSG(USB_ERROR, (_T("Stop Dev IST Forcely ...\r\n")));
TerminateThread(pContext->hIST , DWORD(-1));
}
CloseHandle(pContext->hIST);
pContext->fExitIST = FALSE;
pContext->hIST = NULL;
}
pContext->hIST = CreateThread(NULL, 0, ISTMain, pContext, 0, NULL);
if (pContext->hIST == NULL) {
#ifdef DEBUG_TEXT
{
if(fp == NULL)
fp = fopen("\\debug.txt", "a+");
if(fp) {
fprintf(fp, "Dev IST creation failed\r\n");
fflush(fp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -