📄 usbap.c
字号:
/*************************************************************************/
/* */
/* Copyright (c) 2003, 名人电脑科技有限公司深圳研发中心 */
/* All rights reserved. */
/* */
/* 文件名称: USBAP.c */
/* 文件描述: 移动硬盘的应用 */
/* */
/* 当前版本: 1.0 */
/* 作 者: King */
/* 完成日期: 2003年xx月xx日 */
/* */
/* 函数列表: */
/* */
/* 更改记录: */
/* ===================================================================== */
/* 日期 人员 版本 描述 */
/* ===================================================================== */
/* 2003-06-27 King 1.0 创建 */
/* */
/*************************************************************************/
#include "Kernel.h"
#include "mss.h"
#include "hal.h"
//#include "UsbDrv.h"
#define USB_TASK_STACK_SIZE 0x1000 //USB任务的堆栈大小
#define USB_AUOTEXIT QUIT_USER+1
/* 全局变量定义 */
//static MWindow* g_hUSBWnd;
//MWindow* USBCreateWindow(void);
//UINT32 USBHandleEvent(MWindow* hWnd, MEvent* pEvent);
VOID USB_TASK(UNSIGNED argc, VOID *argv);
extern BOOL PrjDetectUSB(void);
extern BOOL prj_bIsUSB;
extern volatile BOOL UsbConnectCompleted;
extern VOID __UsbCreatePartitionTable(BOOL bFlashOnly);
extern void PrjDestroyVolTimer(void);
STATUS UsbInit(void);
INT FlashUpdate(void);
/*************************************************************************/
/* */
/* 函数名称: USBMain */
/* 函数描述: 移动硬盘的主程序 */
/* */
/* 输入参数: */
/* pEvent - 消息结构指针 */
/* 输出参数: */
/* NULL */
/* 返回值 : */
/* UINT32 - 函数返回值 */
/* */
/* ===================================================================== */
/* 日期 人员 版本 描述 */
/* ===================================================================== */
/* 2003-06-29 King 1.0 创建 */
/* */
/*************************************************************************/
extern BOOL g_bUsbStarted;
//UINT32 USBMain(UINT32 hInstance, UINT32 hPrevInst, UINT8* pCmdLine, INT nCmdShow)
INT USBMain(INT Param)
{
UINT32 dwResult;
// g_hUSBWnd = NULL;
dwResult = 0;
g_bUsbStarted=TRUE;
//*************************
// 检测USB连线
//*************************
UsbInit();
/*
if (!EstimateCablePluged())
{
HwShowString(1,1,"请先接上USB连线",0x000000ff);
return 0;
}*/
/*************************\
进入U盘的准备工作
\*************************/
// prj_bIsUSB = TRUE; // 设上标志,电压检测时要判断
// PrjStopOffTimer(); // 停止自动关机时间
// 暂时去掉用于测试USB, MANN
// PrjDisableAlarm(); // 提供为函数,在格式化的时候也要用。
// SysWatchEnd(); // close watchdog
/*************************\
创建U盘窗口
\*************************/
// g_hUSBWnd = USBCreateWindow();
// if (g_hUSBWnd)
/* 创建分区表 */
__UsbCreatePartitionTable(FALSE);
/* 关闭SDCard中断 */
// *((volatile UINT8 *)0x40270) &= ~0x01; // disable interrupt: EP0(D0) = 0
/* 关闭低电压检测 */
// PrjDestroyVolTimer();
/* if (NU_SUCCESS != NU_Create_Task(&Task_USB, "UsbDisk", USB_TASK,
0, NU_NULL, pointer, USB_TASK_STACK_SIZE,
3, 20, NU_PREEMPT, NU_START))
{
goto QUIT;
}
*/
// dwResult = ApRun((MWinView *)g_hUSBWnd);
USB_TASK(0,NULL);
//while (g_uExitMSS == 0)
{
NU_Sleep(1);
}
// prj_bIsUSB = FALSE; // 已经退出USB
/*************************\
U盘退出,系统启动
\*************************/
// MsgBoxRun(NULL, 0, "退出U盘,返回主画面。", "USB", MT_ICONINFO);
// PrjEnableAlarm();
// SysWatchHotReset(SYS_INIT_RESTORE);
return dwResult;
}
//#define HwUBIDX (*((volatile unsigned short *)(0x80000538)))
//#define USBMASS_EP_RECV 2 // OUT (PC -> TCC730)
//#define HwOCSR1 (*((volatile unsigned short *)(0x80000550)))
//======================================================================
//======================================================================
// DennyHan Added this for Ap 2006-5-18 15:59
// THis Only be called after MSS_Init();
//----------------------------------------------
extern NU_DRIVER *pndUSB;
static VOID UsbApTerminateConnect(VOID)
{
NU_DRIVER_REQUEST ndrTemp;
if (pndUSB)
{
memset((UINT8*)&ndrTemp,0,sizeof(NU_DRIVER_REQUEST));
ndrTemp.nu_function = NU_STATUS;
ndrTemp.nu_supplemental = USB_IOCTL_DISCONNECT;
ndrTemp.nu_supplemental_ptr = (void*)(UINT32)USB_INIT_MASSSTORAGE;
#ifdef SYS_UPDATE
USBDriver_Func(NULL, &ndrTemp);
uRet = ndrTemp.nu_status;
#else
NU_Request_Driver(pndUSB, &ndrTemp);
#endif
}
}
//======================================================================
//======================================================
//#define UAP_USB_TEST 1
VOID USB_TASK(UNSIGNED argc, VOID *argv)
{
char szBuf[64] = {'U', 'S', 'B', 'C'};
UINT uRet;
DWORD dwStatus;
UINT uEvent[2];
g_uExitMSS = 0; // indicate that the task is terminated.
#ifdef UAP_USB_TEST
GraphDrawText(40,40,0,0,(UINT8*)"EnterTask");
if ( !EstimateCablePluged() )
{
GraphDrawText(40,60,0,0,(UINT8*)"DISConnect");
}
else
{
GraphDrawText(40,80,0,0,(UINT8*)"Connect");
}
#endif
if (0 == MSS_Init())
{
#ifndef _WIN32
// DennyHan added for Cabled pulled out
if ( !EstimateCablePluged() )
{
#ifndef UAP_USB_TEST
// exit
UsbApTerminateConnect();
g_uExitMSS =1;
#else
GraphDrawText(40,80,0,0,(UINT8*)"DISConnect");
}
else
{
GraphDrawText(40,80,0,0,(UINT8*)"Connect");
#endif
}
#endif
while( (! g_uExitMSS)
&& (EstimateCablePluged()) )
{
// if(!UsbCoreCheck())continue;
// uRet=USBMASS_ReceiveData( szBuf, 64 );
// DennyHan added for Messge Pulled
GetOsKnlMsg(&uEvent[0],&uEvent[1]);
uRet= BOL_BulkOut(31, (BYTE *)szBuf);
BOL_BulkCtrl(GETSTATUS, &dwStatus);
if (DEVICE_IDLE != dwStatus)
{
continue;
}
if (uRet)
{
uRet = BOL_OnRecvCmd(uRet, (BYTE *)szBuf);
switch(uRet)
{
case CSW_GOOD:
{
}break;
case CSW_FAIL:
{
// g_uExitMSS = 1;
}break;
case CSW_PHASE_ERROR:
{
}break;
case CSW_WAITFOR_MORE_DATA:
{
}break;
case CSW_NEEDTO_STALL_BULK:
{
BOL_BulkCtrl(STALL, (DWORD *)STALL_BULKALL);
}break;
default:
{
}break;
}
}
}
}
// 检查到Win98下最后16块没有写入,在这里确保写入
FlashUpdate();
MSS_Stop();
// MsgPost(g_hUSBWnd, EV_QUIT, USB_AUOTEXIT, 0, 0); // 退出对话框
// MsgPost(g_hUSBWnd, EV_QUIT, USB_AUOTEXIT, 0, 0); // 退出窗口
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -