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

📄 mainloop.c

📁 ARM嵌入式系统软件开发实例(一) 里面含有很多UCOS教程和源码
💻 C
📖 第 1 页 / 共 2 页
字号:
   //*************************************************************************
   //
   //                  P H I L I P S   P R O P R I E T A R Y
   //
   //           COPYRIGHT (c)   1999 BY PHILIPS SINGAPORE.
   //                     --  ALL RIGHTS RESERVED  --
   //
   // File Name:	MainLoop.C
   // Author:       Hilbert Zhang ZhenYu
   // Created:      Nov. 19 99
   // Modified:
   // Revision: 	0.0.
   //
   //*************************************************************************
   // Implementation Notes:
   //
   //   4. Bulk-Only Transport FSM
   //      IDLE Stage ->  CBW -> CBW Proc -> DATA OUT Stage -> CSW Proc -> CSW Stage -> IDLE
   //      IDLE Stage ->  CBW -> CBW Proc -> DATA IN Stage -> CSW Proc -> CSW Stage -> IDLE
   //      STALL Stage ->  IDLE -> ...
   //
   //
   //   3. Default Control Pipe Finite State Machine
   //      SETUP Stage -> SETUP Proc -> DATA OUT Stage -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
   //      SETUP Stage -> SETUP Proc -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
   //      SETUP Stage -> SETUP Proc -> DATA IN Stage-> CONTROL IN Handshake ->STATUS Stage -> IDLE
   //      STALL -> SETUP Stage -> ...
   //
   //   2. Stack Overflow Avoidance.
   //      Setup TK overwritten allowance.
   //
   //   1. System Modeling
   //       A. D12
   //       B. 8051
   //       C. ATA controller emulation by 8051
   //
   //   0. 8051 Modeling
   //       A. Target 8051 , 128B RAM, 16KB ROM
   //       B. Choose 2 IRQL levels, Interrupt Priority 0 as IRQL_1, Mainloop as IRQL_0
   //       C. Bit Address Space, Byte Ram Addess Space, Code Address Space, IO port Space
   //
   //*************************************************************************
   // Development Environment
   //
   //   1. Use VC++ IDE instead of DOS enviroment
   //   0. Keil C Ver4
   //
   //*************************************************************************

#include  "config.h"       /* special function register declarations */

#define GLOBAL_EXT			//定义全局

#include "SysCnfg.h"
#include "BasicTyp.H"

#include "usb100.h"

#include "Common.h"
#include "Hal4Sys.h"
#include "Hal4d12.h"
#include "Hal4ata.h"

//#include "ATA.h"
#include "RBCCmd.h"
#include "RBC.h"

#include "mainloop.h"
#include "chap_9.h"
#include "TPBulk.h"


//*************************************************************************
//  Public data
//*************************************************************************


// bit Flags
STRUC_EXT BITFLAGS     bFlags;

#define             MCUBF_Timer  					bFlags.bits.timer
#define             D12BF_SetupOverwritten  		bFlags.bits.setup_overwritten
#define             D12BF_Configuration	  			bFlags.bits.;configuration
#define             REQBF_DCPRequest_dir  			bFlags.bits.DCPRequst_Dir
#define             REQBF_DCPRequest_EPdir  		bFlags.bits.DCPRequst_EPDir
#define             REQBF_StallDCPRequest   		bFlags.bits.Stall_DCPRequest
#define             BOTBF_StallAtBulkOut  			bFlags.bits.BO_Stalled
#define             BOTBF_StallAtBulkIn  			bFlags.bits.BI_Stalled
#define             BOTXfer_Abort  					bFlags.bits.Abort_BOT
#define             ATABF_IsAttached  				bFlags.bits.ATABF_IsAttached
#define             ATABF_IsSupportMultiSector  	bFlags.bits.ATABF_IsSupportMultiSector
#define             ATABF_IDEXfer_dir	 			bFlags.bits.ATABF_IDEXfer_dir
#define             ATABF_IsSkipSetParameters 	 	bFlags.bits.ATABF_IsSkipSetParameters

INT8_EXT            Hal4Sys_ClockTicks = 0;

// D12 bit flags


//USB
// DefaultControlPipe Finite State Machine [One-Hot]
STRUC_EXT char_bit   _DCPFSMstate;
#define		DCPFSMstate			_DCPFSMstate.char_
#define		DCPFSM_SetupProc 	_DCPFSMstate.bit_.b0
#define     DCPFSM_DataIn 		_DCPFSMstate.bit_.b1
#define     DCPFSM_DataOut 		_DCPFSMstate.bit_.b2
#define     DCPFSM_COhandshake 	_DCPFSMstate.bit_.b3
#define     DCPFSM_CIhandshake 	_DCPFSMstate.bit_.b4
#define     DCPFSM_Stall 		_DCPFSMstate.bit_.b7
//      DCP FSM
//      SETUP Stage -> SETUP Proc -> DATA OUT Stage -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
//      SETUP Stage -> SETUP Proc -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
//      SETUP Stage -> SETUP Proc -> DATA IN Stage-> CONTROL IN Handshake ->STATUS Stage -> IDLE
//

// USB Device Request
STRUC_EXT DEVICE_REQUEST  DCPDeviceRequest;

INT8_EXT            UsbReq_Recipient;
INT8_EXT            UsbReq_Type;
INT8_EXT            UsbReq_Request;

INT16_EXT           DCPXfer_wResidue;
INT8_EXT            * DCPXfer_pdata;

// Bulk-Only TP Finite State Machine [One-Hot]      端点状态
STRUC_EXT char_bit _BOTFSMstate;
#define 	BOTFSMstate		_BOTFSMstate.char_ 
#define 	BOTFSM_IDLE 	_BOTFSMstate.bit_.b0
#define     BOTFSM_CBWProc  _BOTFSMstate.bit_.b1
#define     BOTFSM_DataIn 	_BOTFSMstate.bit_.b2
#define     BOTFSM_DataOut  _BOTFSMstate.bit_.b3
#define     BOTFSM_CSWProc  _BOTFSMstate.bit_.b4
#define     BOTFSM_CSW 		_BOTFSMstate.bit_.b5
#define     BOTFSM_Stall 	_BOTFSMstate.bit_.b7
//      BOT FSM
//      IDLE Stage ->  CBW -> CBW Proc -> DATA OUT Stage -> CSW Proc -> CSW Stage -> IDLE
//      IDLE Stage ->  CBW -> CBW Proc -> DATA IN Stage -> CSW Proc -> CSW Stage -> IDLE
//      STALL Stage ->  IDLE
//
INT16_EXT   BOTXfer_wResidue;   //数据沉余
INT8_EXT    * BOTXfer_pdata;
STRUC_EXT	TPBLK_STRUC			TPBulk_Block;
#define     TPBulk_CBW			TPBulk_Block.TPBulk_CommandBlock
#define	    RBC_CDB				TPBulk_CBW.cdbRBC
#define     RBC_LUN				TPBulk_CBW.bCBW_LUN
#define     Hal4ATA_Atapi		RBC_CDB
#define     TPBulk_CSW			TPBulk_Block.TPBulk_CommandStatus


// Xfer_Space
STRUC_EXT char_bit  	_Xfer_Space;
#define 	Xfer_Space 			_Xfer_Space.char_
#define     DCPXfer_atMCUCODE 	_Xfer_Space.bit_.b0
#define     DCPXfer_atMCURAM 	_Xfer_Space.bit_.b1
#define    	DCPXfer_atEEROM 	_Xfer_Space.bit_.b2
#define    	DCPXfer_atATA 		_Xfer_Space.bit_.b3
#define   	BOTXfer_atRAM 		_Xfer_Space.bit_.b4
#define   	BOTXfer_atATA 		_Xfer_Space.bit_.b5
#define    	BOTXfer_atROM 		_Xfer_Space.bit_.b6


STRUC_EXT HW_ATA_DEVICES_EXTENSION	Hal4ATA_DevExt;
#define     ATADevExt_IDData		Hal4ATA_DevExt.IdentifyData



INT8_EXT            Hal4ATA_SectCntInBlk;

//*************************************************************************
//  Public temp var
//*************************************************************************


STRUC_EXT FLEXI_INT32 tempvars4UsbReq;		//????????????????

STRUC_EXT char_bit   _FlexByte;
#define    FlexByte		_FlexByte.char_
#define    FlexByte_b0 	_FlexByte.bit_.b0
#define    FlexByte_b1 	_FlexByte.bit_.b1
#define    FlexByte_b2 	_FlexByte.bit_.b2
#define    FlexByte_b3 	_FlexByte.bit_.b3
#define    FlexByte_b4 	_FlexByte.bit_.b4
#define    FlexByte_b5 	_FlexByte.bit_.b5
#define    FlexByte_b6 	_FlexByte.bit_.b6
#define    FlexByte_b7 	_FlexByte.bit_.b7

//INT8_EXT            TempByte;



//*************************************************************************
// USB protocol function pointer arrays协议函数指针
//*************************************************************************


 void (*StandardDeviceRequest[MAX_STD_REQUEST])(void) =
{
	Chap9_GetStatus,
	Chap9_ClearFeature,
	MLsup_StallEP0,
	Chap9_SetFeature,
	MLsup_StallEP0,
	Chap9_SetAddress,
	Chap9_GetDescriptor,
	MLsup_StallEP0,
	Chap9_GetConfiguration,
	Chap9_SetConfiguration,
	Chap9_GetInterface,
	Chap9_SetInterface,
};

void (*ClassDeviceRequest[MAX_CLASS_REQUEST])(void) =
{
	TPBulk_ResetATA,
    TPBulk_GetMaxLUN
};

/*
const void (*VendorDeviceRequest[MAX_VENDOR_REQUEST])(void) =
{
	MLsup_StallEP0
};
*/


//*************************************************************************
//  Functions
//*************************************************************************
  

int main(void)
{
	BCFG2 = 0x00002480;

	PINSEL0 = 0x00000005;		    // 设置所有管脚连接GPIO 设置I/O连接到UART0
   	PINSEL1 = 0x55400000;
	PINSEL2 = 0x0f814914;
	
	IO0DIR = 0x00002400;			//D12、P0.15(U_V):输入 P0.13(SUSP):输出 P0.10(USBRST):输出

   	IO0DIR |= OUT_PUT_P0;				// IDE 接口定义
	IO1DIR |= OUT_PUT_P1; 

	
    if(Hal4ATA_FindIDEDevice()==0)	//查找IDE设备
		while(1);					//没找到可用设备

    Hal4Sys_InitD12();				//初始化D12
	IOCLR = SUSP;			// 

	while (readchipid() != 0x1012);//读取ID号

// Connect to USB Host
    MLsup_ReconnectUSB();

    // Init FSM
	DCPFSMstate = USBFSM4DCP_IDLE;
    BOTFSMstate = USBFSM4BOT_IDLE;// USBFSM4BOT_IDLE=0x01


       // LowerIRQL();  //LowerIRQL() == EA=1 , (no IRQ when EA=0!)
        // USB Control Pipe

    /* Main program loop */
    while(TRUE)
    {		
    	if (!(IOPIN & USBINT))
		{
			usb_isr();
		}
		
		// Enable Interrupt for Interrupt Type Event Stimulie
        // LowerIRQL();  //LowerIRQL() == EA=1 , (no IRQ when EA=0!)
        // USB Control Pipe
        if (DCPFSM_SetupProc)	// DCPFSM_SetupProc=DCPFSMstate^0
        {
        	//RaiseIRQL();						//关中断
            MLsup_USBSetupTokenHandler();
            //LowerIRQL();						//开中断
		} // if SetupProc

		// USB Bulk Pipe
        //RaiseIRQL();
        //if(D12BF_SetupOverwritten==1)
        {
            if(BOTFSM_IDLE)   //BOTFSM_IDLE = BOTFSMstate^0
            {
			    Hal4Sys_D12CmdPortOutB( 0x04);// SelectEP BulkOut
			    FlexByte = Hal4Sys_D12DataPortInB();
                if(FlexByte_b0 == 1) // BulkOut Full
                    TPBulk_CBWHandler(); // Goto BOTFSMstate_CBWProc
           	   // Hal4D12_ReadLastTransactionStatus(5); 
            } // if BOT in IDLE


            while(BOTFSM_DataOut) //BOTFSM_DataOut = BOTFSMstate^3

⌨️ 快捷键说明

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