www.pudn.com > LPC2200_USB.rar > main.c, change:2005-05-16,size:10915b


/****************************************Copyright (c)************************************************** 
**                               Guangzou ZLG-MCU Development Co.,LTD. 
**                                      graduate school 
**                                 http://www.zlgmcu.com 
** 
**--------------File Info------------------------------------------------------------------------------- 
** File name:			main.c 
** Last modified Date:  2004-09-16 
** Last Version:		1.0 
** Descriptions:		The main() function example template 
** 
**------------------------------------------------------------------------------------------------------ 
** Created by:			Chenmingji 
** Created date:		2004-09-16 
** Version:				1.0 
** Descriptions:		The original version 
** 
**------------------------------------------------------------------------------------------------------ 
** Modified by: 
** Modified date: 
** Version: 
** Descriptions: 
** 
********************************************************************************************************/ 
#include "config.h" 
#include "stdlib.h" 
 
#define	TaskStkLengh	64			//Define the Task0 stack length 定义用户任务0的堆栈长度 
  
OS_STK	TaskStk [TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈 
 
void 	Task0(void *pdata);			//Task0 任务0 
 
        int main (void) 
{ 
	OSInit ();																										 
	OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);		 
	OSStart (); 
	return 0;															 
} 
/********************************************************************************************************* 
**                            Task0 任务0 
********************************************************************************************************/ 
#define	TaskUSBStkLengh	256 
OS_STK	TaskStk_Host [TaskUSBStkLengh];		 
void Task_USB_Host_Serve(void *pdata); 
 
OS_EVENT *Uart0ReviceMbox;					/* 串口接收数据邮箱 */ 
OS_STK	TaskStk_Uart0 [TaskStkLengh]; 
void  TaskUart0Revice(void *pdata); 
 
#define	TaskUDiskStkLengh	100 
OS_STK	TaskStk_UDisk[TaskUDiskStkLengh];	 
void Task_U_disk_DEMO(void *pdata); 
 
#define	TaskOSFileStkLengh	1024 
OS_STK        TaskOSFile[TaskOSFileStkLengh]; 
 
#define	TaskUDiskFSStkLengh	100 
OS_STK	TaskStk_UDiskFS[TaskUDiskFSStkLengh];	 
void  Task_UDiskFS_DEMO(void *pdata);		// ZLG/FS操作U盘任务函数 
 
		void Task0	(void *pdata) 
{ 
	pdata = pdata; 
	 
	OSTaskCreate (Task_USB_Host_Serve,(void *)0,  
				  &TaskStk_Host[TaskUSBStkLengh-1],3);	// 建立USB主机服务任务,USB主机服务任优先级就高于其它使用USB主机操作任务 
    OSTaskCreate (TaskUart0Revice, (void *)0,  
                  &TaskStk_Uart0[TaskStkLengh - 1], 4);   
   	OSTaskCreate (Task_U_disk_DEMO,(void *)0,  
				  &TaskStk_UDisk[TaskUDiskStkLengh-1],5); 
	/*===================================================================*/ 
    OSTaskCreate (OSFileTask, (void *)0,  
    			  &TaskOSFile[TaskOSFileStkLengh-1], 6);	// 建立ZLG/FS文件管理系统任务 
	OSTaskCreate (Task_UDiskFS_DEMO,(void *)0,  
				  &TaskStk_UDiskFS[TaskUDiskFSStkLengh-1],7);		 
	TargetInit (); 
	 
                  /* 创建Uart0接收任务 */ 
	while (1) 
	{ 
		OSTimeDly(10); 
	} 
} 
    
/********************************************************************************************************* 
**                            USB 主机任务  
********************************************************************************************************/ 
   void Task_USB_Host_Serve(void *pdata) 
{ 
	pdata = pdata; 
	while (1) 
	{ 
		USB_Host_Serve(); 
	} 
} 
 
 
/********************************************************************************************************* 
** 函数名称: TaskUart0Revice 
** 功能描述: μCOS-II的任务 
********************************************************************************************************/ 
        void  TaskUart0Revice(void *pdata) 
{ 
    uint8 Buf[8],i; 
     
    pdata = pdata;                                           /* 避免编译警告 */ 
 
	Uart0ReviceMbox = OSMboxCreate(NULL);                              /* 建立邮箱 */ 
    if (Uart0ReviceMbox == NULL) 
        while (1); 
 
    for (;;) 
    { 
        Buf[0] = UART0Getch();                               /* 接收数据头 */     
        for (i = 1; i < 8; i++) 
            Buf[i] = UART0Getch(); 
         
        OSMboxPost(Uart0ReviceMbox, (void *)Buf); 
    } 
} 
 
/********************************************************************************************************* 
**                            USB 大容量演示任务  
********************************************************************************************************/ 
#define CMD_INIT		   	0x00				/* 初始化U盘命令  */                	 
#define CMD_READ    	   	0x01				/* 读命令        */ 
#define CMD_WRITE   	   	0x02				/* 写命令        */ 
 
#define CMD_DATA_TRANS		0x04				/* 将data_buf中的数据发送到PC机 */ 
#define CMD_DATA_RECV		0x05				/* 接收来自串口的数据,并放入data_buf中 */ 
 
/* U盘读写缓冲区,比U盘一个块大8字节 */   
uint8 data_buf[520];														    
 
    void  Task_U_disk_DEMO(void *pdata) 
{ 
    uint8 *pRec; 
    uint8 err; 
	uint32 bufaddr,blockaddr; 
	hMedLUN * MediumPtr; 
    device_instance * dviPtr; 
	 
    pdata = pdata;                                                     /* 避免编译警告 */ 
 
 
 
    for (;;) 
    { 
        pRec = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);          /* 接收数据 */ 
        switch(pRec[0]) 
    	{ 
    		case CMD_INIT:  
    			dviPtr = find_mass_device(0); 
				if(dviPtr) 
				{ 
					MediumPtr =  Creat_Medium( dviPtr ,0); 
    				pRec[1] = MediumPtr?0:1; 
    				// U盘总扇区数 
    				pRec[2]	= (uint8)(MediumPtr->LastLogicalBlookAddress/0x1000000); 
    				pRec[3] = (uint8)(MediumPtr->LastLogicalBlookAddress/0x10000); 
    				pRec[4] = (uint8)(MediumPtr->LastLogicalBlookAddress/0x100); 
    				pRec[5] = (uint8)MediumPtr->LastLogicalBlookAddress; 
    				// 扇区大小 
    				pRec[6] = (uint8)(MediumPtr->BlockLengthInBytes/0x100); 
    				pRec[7] = (uint8)MediumPtr->BlockLengthInBytes; 
    			} 
    			else 
    				pRec[1] = 1;			   /* 初始化卡 */ 
    		break;  
    		 
    		case CMD_READ: 
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +	   				/* 计算块地址 */ 
    						 (pRec[3] << 8) + pRec[4]; 
    			 pRec[1] = ReadBlockData(MediumPtr, data_buf, blockaddr, 1)?0:1;	/* 读U盘一个扇区 */ 			 
    		break; 
    		 	    		 
    		case CMD_WRITE:	  
    			 blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +  
    						 (pRec[3] << 8) + pRec[4]; 
    			 pRec[1] = WriteBlockData(MediumPtr, data_buf, blockaddr, 1)?0:1;	/* 写U盘一个扇区 */ 
    		break; 
    			 
   			 
    		case CMD_DATA_RECV:	  
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   				/* 计算缓冲区地址 */ 
    			 memcpy(data_buf + bufaddr, &pRec[3], 5);			   				/* 收到数据放入pRec */ 
    		break; 
    			 
    		case CMD_DATA_TRANS:  
    			 bufaddr = (pRec[1] << 8) + pRec[2];				   				/* 计算缓冲区地址 */  
    			 memcpy(&pRec[1], data_buf + bufaddr, 7);			   				/* data_buf数据放入pRec */ 
    		break;  							 
    	 
    		default: break; 
    	} 
    	 
    	UART0Write(pRec, 8);														/* 发送响应帧 */ 
    } 
} 
/********************************************************************************************************* 
**                            ZLG/FS操作U盘演示任务  
********************************************************************************************************/ 
 char  *strupr(char *Str)					// ZLF/FS需使用的函数 
{    char *cp; 
     cp = Str; 
    while (*cp != 0) 
    {   if (*cp >= 'a' && *cp <= 'z' ) 
            *cp -=  'a' - 'A'; 
       cp++; 
    } 
    return Str; 
} 
/*=======================================================================================================*/ 
#define IniLED_DiskBe()			IO2DIR  |=1<<28;IO2SET=1<<28 
#define SetLED_DiskBe()			IO2SET   =1<<28 
#define ClrLED_DiskBe()			IO2CLR   =1<<28 
 
#define IniLED_DiskRW()			IO2DIR  |=1<<29;IO2SET=1<<29 
#define SetLED_DiskRW()			IO2SET   =1<<29 
#define ClrLED_DiskRW()			IO2CLR   =1<<29 
 
#define IniBUZZ()				PINSEL0 &= ~(3<<14);IO0DIR|=1<<7;IO0SET=1<<7 
#define SetBUZZ()				IO0SET   =1<<7 
#define ClrBUZZ()				IO0CLR   =1<<7 
 
char   FNAME[] = "A:\\读我.TXT"; 
char    DIR[]="A:\\USB_HOST"; 
 
char const WritFileData[]= 
"\r\n******************Copyright (c) 周立功单片机发展有限公司***********************\r\n\ 
\r\n\ 
    ZLG/FS是广州周立功单片机发展有限公司开发的面向嵌入式系统开发的小型文件系统,\r\n\ 
是ZLG系列中间件的重要成员之一。它是与FAT12、FAT16、FAT32高度兼容的文件系统,可以\r\n\ 
直接与个人电脑交换文件。它是可移植的、可固化的文件系统,可以用于前后台系统,也可\r\n\ 
用于多任务环境。目前ZLG/FS的最新版本为1.0。\r\n\ 
    HostMassLib是基于ZLG USB HOST STACK及ZLG Mass Storage Class驱动封装的ISP116x\r\n\ 
读写U盘驱动库。该库针对LPC213x系统微处理器配置编译生成,使用RAM资源少于4K,使用\r\n\ 
CODE资源少于12.4K,可同时支持两个U盘。\r\n\ 
\r\n*********************************ARM开发部门************************************\r\n"; 
    void  Task_UDiskFS_DEMO(void *pdata)		// ZLG/FS操作U盘任务函数 
{ 
    device_instance * dviPtr; 
	 
	HANDLE FHandle; 
    pdata = pdata;    
     
 	IniLED_DiskBe();IniLED_DiskRW();IniBUZZ(); 
	while (1) 
	{	dviPtr = find_mass_device(0);						// 查找大容量类设备 
	  	if(dviPtr)											// 等待U盘插入 
		{	/* 设备插入操作 */ 
			ClrLED_DiskBe();								// 点亮LED_DiskBe指示设备连接设备有效		 
			ClrLED_DiskRW();								// 点亮LED_DiskWR指示开始对U盘操作 
			OSAddFileDriver(USBCammand);					// 安装文件系统驱动 
			FHandle = OSFileOpen(FNAME, "RW");				// 打开或创建文件 
	    	if(Not_Open_FILE!=FHandle)						// 打开文件成功 
	    	{ 
	    	/* 文件操作 */ 
	    		OSFileSeek(FHandle,0, SEEK_END);			// 将指针移到文件末尾 
 	   			OSFileWrite((uint8 *)WritFileData, 
 	   						 sizeof(WritFileData),FHandle);	// 写数据入文件 
 	   			OSFileClose(FHandle);						// 关闭文件 
				OSMakeDir(DIR);								// 创建目录 
    			OSAllCacheWriteBack();						// 将缓冲区数据写回设备 
    		   			 
    			ClrBUZZ();									// 蜂鸣器蜂鸣提示文件操作完成 
    			OSTimeDly(100); 
    			SetBUZZ();	 
    		} 
    		else 
    		{	ClrBUZZ();									// 蜂鸣器长鸣(直到U盘拔出)指示打开文件失败	 
    		} 
			/* 操作完成 */ 
     		OSRemoveFileDriver(0);							// 删除驱动	 
    		SetLED_DiskRW();								// 熄灭LED_DiskWR指示开始对U盘操作完成,这里可以拔出U盘 
    		while(dviPtr)									// 等待U盘拔出 
    		{	dviPtr=find_mass_device(0); 
    			OSTimeDly(10); 
    		} 
    		/* 设备拔出处理  */ 
    		SetBUZZ();										// 关蜂鸣器 
    		SetLED_DiskBe();								// 熄灭LED_DiskBe指示设备已拔出											 
    	} 
    	OSTimeDly(10); 
	} 
}    
/********************************************************************************************************* 
**                            End Of File 
********************************************************************************************************/