📄 mainloop.c
字号:
//*************************************************************************
//
// 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 + -