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

📄 main.c

📁 U盘读写协议:我开发U盘的重要参考代码。 bulk_only传输协议
💻 C
字号:
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\def.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\flash.h"
#include "..\inc\download.h"


#include "..\inc\cache.h"
#include "..\inc\lcd240.h"
#include "..\inc\KeyBoard16.h"
#include "..\inc\ata.h"
#include <stdio.h>
//following is CPU test functions include
#include "..\inc\cputest\adc.h"

#include "..\inc\cputest\idle.h"
#include "..\inc\cputest\iic.h"
#include "..\inc\cputest\iis.h"
#include "..\inc\cputest\nwait.h"
#include "..\inc\cputest\power.h"
#include "..\inc\cputest\rtc.h"
#include "..\inc\cputest\sio.h"
#include "..\inc\cputest\stop.h"
#include "..\inc\cputest\timer.h"
#include "..\inc\cputest\uart.h"


#include"..\fat16\File.h"
#include "main.h"
#include "d12ci.h"
#include "isr.h"
#include "chap9.h"
#include "usb100.h"
#include "..\inc\tchScr.h"

#include "..\fat16\fat16.h"
#include "..\bulk\bulk_only.h"
//*******************************

extern unsigned char *downPt;
extern unsigned int fileSize;

EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;

//migrated for 51ok
extern unsigned long ClockTicks;

extern unsigned char  GenEpBuf[];
extern IO_REQUEST  ioRequest;

extern unsigned char ioSize, ioCount;
extern unsigned char  MainEpBuf[];
extern unsigned char  EpBuf[];

extern U8 Flash_One_Page[];


extern U8 Bulk_In_Buf[];
extern U32 Logical_Block_Address;
extern U32 nCurrentPage,nBeginPage;
extern U8 Flash_One_Page[];

//////////////////////////////////////////////
static void (*run)(void)=(void (*)(void))DOWNLOAD_ADDRESS;

U16 EthernetMac[3];

void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};




void Isr_Init(void)
{
	rINTCON=0x5;	     	 ////3(reserved)	2(V 0=vector 1= non vector)	1(I,0=Enable IRQ,1=Disable IRQ) 0(FIQ Related0=enable 1=diable)
						// 1,Non-vectored,0,IRQ enable,1,FIQ disable //
						// 1,1,1 0x7,disable interupt.
	rINTMOD=0x0;	      //0=IRQ mode Set all of the INT to IRQ mode//
	
	rI_ISPC=BIT_EINT2;
	rINTMSK=BIT_GLOBAL;
	//pISR_FIQ,pISR_IRQ must be initialized//
	pISR_EINT2=(unsigned)usb_isr;
	rINTMSK=~(BIT_EINT0 |BIT_EINT2 | ~BIT_GLOBAL);

    
	//pISR_FIQ,pISR_IRQ must be initialized//
}

void reconnect_USB(void)
{
	unsigned long clk_cnt;

	MCU_LED0 = MCU_LED0_ON;
	MCU_LED1 = MCU_LED1_ON;

	D12SUSPD = D12SUSPD_OFF;
	//Disconnect Usb
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);

	Delay(500);

	//Connect USB
	DISABLE;
	bEPPflags.value = 0;
	ENABLE;

	// V2.1 enable normal+sof interrupt
	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);

	// Initialize D12 configuration

	//D12_SetMode(D12_NOLAZYCLOCK ,D12_SETTOONE | D12_CLOCK_12M );
	D12_SetMode(D12_ENDP_NONISO |D12_NOLAZYCLOCK | D12_SOFTCONNECT|D12_CLOCKRUNNING,D12_SETTOONE | D12_CLOCK_12M );
	
	//End of Connect USB
	MCU_LED0 = MCU_LED0_OFF;
 	MCU_LED1 = MCU_LED1_OFF;
 	
}



void control_handler(void)
{
	unsigned char type, req;
	
	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;	//0x60
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;		//0x0F
	//help_devreq(type, req); // print out device request

	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();
	else{
		stall_ep0();
		}
}

void single_transmit(unsigned char * buf, unsigned char len)
{
if( len <= EP0_PACKET_SIZE) {
D12_WriteEndpoint(1, len,buf);
}
}

void code_transmit(unsigned char  * pRomData, unsigned short len)
{
	ControlData.wCount = 0;
	if(ControlData.wLength > len)
	ControlData.wLength = len;
	ControlData.pData = pRomData;
	if( ControlData.wLength >= EP0_PACKET_SIZE) {
		D12_WriteEndpoint(1,EP0_PACKET_SIZE, ControlData.pData);
		ControlData.wCount = ControlData.wCount + EP0_PACKET_SIZE;
//		Uart_Printf("len=%d,wCount=%d\n",len,ControlData.wCount);
		DISABLE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
		ENABLE;
		}
	else {
		D12_WriteEndpoint(1, ControlData.wLength,pRomData);
		ControlData.wCount = ControlData.wCount + ControlData.wLength;
//		Uart_Printf("else*code_transmit,len=%d,wCount=%d\n",len,ControlData.wCount);
		DISABLE;
		bEPPflags.bits.control_state = USB_IDLE;
		ENABLE;
		}
//	Uart_Printf("bEPPflags.bits.control_state=%d\n",bEPPflags.bits.control_state);
}



void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);

}
/*
void Main(void)
{     
	int i=0;
       ARM_FILE *ffp[512];

	rSYSCFG=CACHECFG;	// Using 8KB Cache//

	Uart_Init(0,115200);
	Port_Init();
	Isr_Init();
	Delay(0);
	downPt=(unsigned char *)DOWNLOAD_ADDRESS;


	Flash_Reset();

	Uart_Select(0); //Select UART0//

	rINTMSK=~(BIT_EINT0 |BIT_EINT2| BIT_GLOBAL);
	

//	Format_Fat16Media();//将Flash格式化成Fat16
       //for(i=0;i<32*528;i+=528) Flash_One_Page[i+5] = 0x55;
       //	Write2Flash(0,4,14,Flash_One_Page);
	LOAD_SYSTEM_CODE();
	reconnect_USB();




	//ffp[0]=CreatFile("YANGXIN.TXT");





//  D12 usb mainloop program
	while( TRUE ){
		if (bEPPflags.bits.setup_packet){
			DISABLE;
			bEPPflags.bits.setup_packet = 0;
			ENABLE;
			control_handler();
			//D12SUSPD = 1;
			D12SUSPD=D12SUSPD_OFF;
		} // if setup_packet

 	}
	
}
*/
void Main(void)
{
	unsigned int SerialNo;
	unsigned int SerialNo1=123802;
	unsigned int SerialNo2=943845;
	int i;//memError=0;
	char aa;
	U32 mode;
	int x,y;
	
	 rSYSCFG=CACHECFG;	// Using 8KB Cache//
	Port_Init();
	Isr_Init();
	Uart_Init(0,115200);
	Uart_Select(0); //Select UART0//
	Delay(100);
	downPt=(unsigned char *)DOWNLOAD_ADDRESS;
	/*******************************/
	/*          Cache test         */
	/*******************************/
	for(i=0;i<100;i++)
		Uart_SendByte(0xff);

	Uart_Printf("\nBIOS start:OK!");
	Delay(100);
	LCD_Init();

	LCD_printf("Testing Cache...");
	if(Test_Cache()){
		Uart_Printf("\nCache Test:OK!");
		LCD_printf("Cache Test:OK!\n");
	}
	else{
		Uart_Printf("\nCache Test:FAIL!");
		LCD_printf("Cache Test:FAIL!\n");
		while(1);
	}

	Flash_Reset();
	if(Check_Flash_Id()==KM29U128_ID)
	{
		Uart_Printf("\nKM29U128T is found.");
		LCD_printf("KM29U128T is found.\n");
	}
	else
	{
		Uart_Printf("\nKM29U128T is not found.");
		LCD_printf("KM29U128T is not found.\n");
	}

	SerialNo=SerialNo1+SerialNo2;
	Uart_Printf("\n*************************************************************************");
	Uart_Printf("\n*                SerialNo:0x%8x                                    *");   
	Uart_Printf("\n*                COM:115.2kbps,8Bit,NP,UART0                            *");
	Uart_Printf("\n*                Build Time: 2002-1-25                                  *");
	Uart_Printf("\n*-----------------------------------------------------------------------*");

	LCD_printf("******************************\n");
	LCD_printf("*  Embeded Controller        *\n");
	LCD_printf("*      BIOS  ver 1.1         *\n");
	LCD_printf("*      Copyright 2002-2007   *\n");
	LCD_printf("*          By Up-tech        *\n");
	LCD_printf("*  Build Time: 2002-7-30     *\n");
	LCD_printf("******************************\n");
	LCD_printf("Enter BIOS test mode\n");
	LCD_printf("press any key\n");
	Delay(8000);
	
	if(GetScanKey()==0xffff){	//无按键按下,正常引导系统
		 LOAD_SYSTEM_CODE();
		 while(1);
	}
	
	if(GetScanKey()==0xfffe){//按确定键时直接进U盘
		reconnect_USB();
		Uart_Printf("\nEntering USB Disk state,please waiting...");
		while( TRUE ){
			if (bEPPflags.bits.setup_packet){
				DISABLE;
				bEPPflags.bits.setup_packet = 0;
				ENABLE;
				control_handler();
				D12SUSPD=D12SUSPD_OFF;
			} // if setup_packet
	 	}//while( TRU
		
	}
	//按其他键,进入BIOS 测试状态
	while(1)
	{
		LCD_printf("Enter the Embedded System BIOS\n");
		Uart_Printf("\n*                You had selected Monitor Tools                         *");
		Uart_Printf("\n*                     F(f)>>Flash Rom Tools                             *");
		Uart_Printf("\n*                     R(r)>>Enter USB Disk                              *");
		Uart_Printf("\n*                     L(l)>>LCD test                                    *");
		Uart_Printf("\n*                      1  >>Format Media To FAT                        *");
		Uart_Printf("\n*                     K(k)>>KeyBoard Test                               *");
		Uart_Printf("\n*                     T(t)>>Touch Screent Test                          *");
		Uart_Printf("\n*                     S(s)>>Set touch Screen                            *");
		Uart_Printf("\n*-----------------------------------------------------------------------*");
		aa= Uart_Getch();
		switch(aa)
		{
			case 'f':
			case 'F':
				Flash_Tools();
				break;
			case 'r':
			case 'R':
				/*对USBN9603进行一次软件复位*/

				reconnect_USB();
//				Delay(10000);//it should be delay a long time for pc software stable
				Uart_Printf("\nEntering USB Disk state,please waiting...");

				while( TRUE ){
					if (bEPPflags.bits.setup_packet){
						DISABLE;
						bEPPflags.bits.setup_packet = 0;
						ENABLE;
						control_handler();
						//D12SUSPD = 1;
						D12SUSPD=D12SUSPD_OFF;
					} // if setup_packet
			 	}//while( TRU

				break;
			case 'l':
			case 'L':
				Uart_Printf("\nPlease look at LCD.");
				Uart_Printf("\nPress any key return.");
				LCD_printf("Hello.\n");
				LCD_printf("This is LCD text Mode\n");
				LCD_printf("Please wait.....\n");
				LCD_printf("Then show LCD gray bar.\n");
				LCD_printf("Press any key return.\n");
				Delay(20000);
//				LCD_TestShow();
				Uart_Getch();
				break;
			case '1':
				Format_Fat16Media();
				break;
			case 'k':
			case 'K':
				Uart_Printf("\n");
				Uart_Printf("press any key get the scan number\n");
				while(1){
					U32 getkey=GetKey();
					static U8 key[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
					Uart_SendByte(key[getkey]);
				}
				break;
			case 't':
			case 'T':
				Uart_Printf("\n");
				TchScr_init();
				Uart_Printf("please touch the screen\n");
				for(;;){
					mode=TchScr_GetOSXY(&x, &y);
					switch(mode){
					case TCHSCR_ACTION_CLICK:
						Uart_Printf("Action=click:x=%d,\ty=%d\n",x,y);
						break;
					case TCHSCR_ACTION_DBCLICK:
						Uart_Printf("Action=double click:x=%d,\ty=%d\n",x,y);
						break;
					case TCHSCR_ACTION_DOWN:
						Uart_Printf("Action=down:x=%d,\ty=%d\n",x,y);
						break;
					case TCHSCR_ACTION_UP:
						Uart_Printf("Action=up:x=%d,\ty=%d\n",x,y);
						break;
					case TCHSCR_ACTION_MOVE:
						Uart_Printf("Action=move:x=%d,\ty=%d\n",x,y);
						break;
					}
					Delay(1000);
				}
				break;
			case 's':
			case 'S':
				TchScr_init();
				SetTouchScr();
				break;
		}
	}
}

⌨️ 快捷键说明

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