⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 usb demo codeusb demo code
💻 C
字号:
/****************************************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 PicMem 1024             //512K的读取图片的缓存
//#define CharPerPage  868                  /*31*28*/
#define	TaskStkLengh	64			//Define the Task0 stack length 定义用户任务0的堆栈长度
uint8 data_buf[520]={0xa,0xb,0xc,0xd,0xe,0xf};	
char text_buf[8096]="";
char pic_buf[PicMem]="";
			   


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 TaskDisplayStkLength     512
OS_STK TashStk_Display[TaskDisplayStkLength];
void TaskDisplay (void *pdata);

#define TaskOSFileStkLength	   1024
OS_STK TaskOSFileStk[TaskOSFileStkLength];

#define TaskUDiskFSStkLength	100
OS_STK TaskUDiskFSStk[TaskUDiskFSStkLength];
void      TaskUDiskFS(void *pdata);

#define TaskUDiskReadPicStkLength 1024
OS_STK TaskUDiskReadPicStk[TaskUDiskReadPicStkLength];
void TaskUDiskReadPic(void *pdata);
extern void LedON(void)
{
	PINSEL2|=0xF0000000;
	IO2DIR|=0xF0000000;
	IO2CLR|=0xF0000000;
	
}
extern void LedOFF(void)
{
	PINSEL2|=0xF0000000;
	IO2DIR|=0xF0000000;
	IO2SET|=0xF0000000;
	
}
 char  *strupr(char *Str)					// ZLG/FS需使用的函数
{    char *cp;
     cp = Str;
    while (*cp != 0)
    {   if (*cp >= 'a' && *cp <= 'z' )
            *cp -=  'a' - 'A';
       cp++;
    }
    return Str;
 }

		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(TaskDisplay,(void *)0,&TashStk_Display[TaskDisplayStkLength-1],6);
	OSTaskCreate(OSFileTask,(void *)0,&TaskOSFileStk[TaskOSFileStkLength-1],7);
	//OSTaskCreate(TaskUDiskFS,(void *)0,&TaskUDiskFSStk[TaskUDiskFSStkLength-1],8);
	OSTaskCreate(TaskUDiskReadPic,(void *)0,&TaskUDiskReadPicStk[TaskUDiskReadPicStkLength-1],9);
	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);
    }
}
/*********************************************************************************************************
** 函数名称: TaskDisplay
** 功能描述: μCOS-II的任务
********************************************************************************************************/
void TaskDisplay( void *pdata)
{
	uint32 blockaddr=0;
	hMedLUN * MediumPtr;
       device_instance * dviPtr;
       //uint16 error;




	while(1)
	{
		
		
		
		
		dviPtr = find_class_interface(MASSSTRAGE_CLASS_INTERFACE,0);
		if(dviPtr)
			{
			MediumPtr =  Creat_Medium( dviPtr ,0);
			ReadBlockData(MediumPtr, data_buf, blockaddr, 1);
			}		
		//ShowText(text_buf,sizeof(text_buf));
		//ShowCode(data_buf,Pro_Buf); 
		OSTimeDly(100);
		
	}
}

/*********************************************************************************************************
**                            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字节 */  

    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);          /* 接收数据 */
        //pRec[0]=CMD_INIT;
        switch(pRec[0])
    	{
    		case CMD_INIT: 
    			dviPtr = find_class_interface(MASSSTRAGE_CLASS_INTERFACE,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] = 2;
    				
    						   /* 初始化卡 */
    		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: 
    		
    		//LedOFF();
    		//if(GUI_PutChar(50,50,77))
    		break;
    	}
    	
    	UART0Write(pRec, 8);														/* 发送响应帧 */
    }
}

/*********************************************************************************************************
** 函数名称: TaskUDiskFS
** 功能描述: μCOS-II的任务
********************************************************************************************************/   
 char FFILENAME[]="A:\\readme.TXT";

void TaskUDiskFS( void *pdata)
{
	

      device_instance * dviPtr;
	HANDLE FHandle;
	uint32 bSize;
	uint32 LastPage;
	int16 remain;
	LastPage=0;
	pdata=pdata;
	
	
	while (1)
	{
		dviPtr=find_mass_device(0);
		if (dviPtr)
		{
			OSAddFileDriver(USBCammand);
			FHandle=OSFileOpen(FFILENAME,"R");
			
			if (Not_Open_FILE!=FHandle)
			{
				bSize=OSFileGetSize(FHandle);
				//ShowCode(&bSize,Pro_Buf);
				OSFileSeek(FHandle,0,SEEK_SET);
				//bSize=OSFileGetSize(FHandle)*8;
				OSFileRead((uint8 *)text_buf,bSize,FHandle);
				//ShowCode(&bSize);
				//page=bSize/CharPerPage;
				remain=bSize;
				//ShowCode(&bSize,Pro_Buf);
				
				while (remain>0)
				{

					LastPage+=ShowText(text_buf+LastPage);
					remain=bSize-LastPage;
					OSTimeDly(100);
				}
				LastPage=0;
				remain=bSize;
				OSFileClose(FHandle);
			}
		}
	} 
}

/*********************************************************************************************************
** 函数名称: TaskUDiskReadPic
** 功能描述: 从U盘中读取BMP图片
********************************************************************************************************/   
char FPICNAME[]="A:\\mylove.BMP";
void TaskUDiskReadPic(void * pdata)
{
	
	
	
	device_instance * dviPtr;
	HANDLE FHandle;
	uint32 bSize;
	uint32 i;
	int32 remain;
	uint32 count;
	//LastPage=0;
	
	pdata=pdata;
	
	
	while (1)
	{
		dviPtr=find_mass_device(0);
		if (dviPtr)
		{
			OSAddFileDriver(USBCammand);
			FHandle=OSFileOpen(FPICNAME,"R");
			
			if (Not_Open_FILE!=FHandle)
			{
				bSize=OSFileGetSize(FHandle);
				//count=bSize/PicMem;
				//remain=bSize%PicMem;
				OSFileSeek(FHandle,0,SEEK_SET);
				OSFileRead((uint8 *)pic_buf,100,FHandle);
				//ShowCode((uint8 *)pic_buf);
				Pic_Initial((uint8 *)pic_buf);
				
				OSFileSeek(FHandle,BitMapFileHeader.bfOffBits,SEEK_SET);
				TftSetWindow(0,0, 239,319);
    				TftSetWrite(0,319);
				for (i=0;i<320;i++)
				{
					OSFileSeek(FHandle,i*720,SEEK_SET);
					OSFileRead((uint8 *)pic_buf,720,FHandle);
					
					TftSetWrite(0,319-i);	
					Disp_pic((uint8 *)pic_buf);
					
					
						//Disp_pic((uint8 *)pic_buf);
					//ShowCode((uint8 *)pic_buf);
					//ShowCode((uint8 *)pic_buf+512);
				}
				//if (remain)
				//{
					//OSFileSeek(FHandle,count*PicMem,SEEK_SET);
					//OSFileRead((uint8 *)pic_buf,remain,FHandle);
					//ShowCode((uint8 *)pic_buf);
					//Disp_pic((uint8 *)pic_buf);
				//}
				//ShowCode(&bSize);
				//remain=bSize;
				

				OSFileClose(FHandle);
			}
		}
	} 
}









/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -