📄 mainloop.c
字号:
#include "define.h"
#include "epphal.h"
#include "d12ci.h"
#include "mainloop.h"
#include "usb100.h"
#include "chap_9.h"
#include "protodma.h"
#include "otp.h"
/*
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
*/
//USB标准请求
code 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
};
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
extern EPPFLAGS bEPPflags;
bit _want_connect=1;
CONTROL_XFER ControlData;
code char * _NAME_USB_REQUEST_DIRECTION[] =
{
"Host_to_device",
"Device_to_host"
};
code char * _NAME_USB_REQUEST_RECIPIENT[] =
{
"Device",
"Interface",
"Endpoint(0)",
"Other"
};
code char * _NAME_USB_REQUEST_TYPE[] =
{
"Standard",
"Class",
"Vendor",
"Reserved"
};
code char * _NAME_USB_STANDARD_REQUEST[] =
{
"GET_STATUS",
"CLEAR_FEATURE",
"RESERVED",
"SET_FEATURE",
"RESERVED",
"SET_ADDRESS",
"GET_DESCRIPTOR",
"SET_DESCRIPTOR",
"GET_CONFIGURATION",
"SET_CONFIGURATION",
"GET_INTERFACE",
"SET_INTERFACE",
"SYNC_FRAME"
};
/* Interrupt Control Unit */
/* **** Enabled interrupts in Interrupt Enable Register ****
**** GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
**** INTERRUPT TO WORK!
*/
/* GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
ARE DISABLED */
/* External interrupt 0 */
/* Priority Level = 0 */
/* Timer 0 interrupt */
/* Priority Level = 0 */
//中断设置
void init_special_interrupts(void)
{
IT0 = 0;
EX0 = 1;
PX0 = 0;
}
void InitialUart(unsigned int baudrate)
{
SCON=0X50;
TMOD=0X21;
TH1=TL1=256-(28800*2/baudrate);
TR1=1;
ET1=0;
ES=0;
}
void main(void)
{
DelayNms(200);
bEPPflags.bits.configuration = 0;
init_sub();
initial_timer0();
InitialUart(19200); //???test
init_special_interrupts();//设置中断
buzzer_1();
reconnect_USB();//重新连接USB
while( TRUE )
{
//=============================== 自动检测USB设备
P3_2=1;
if (P3_2)
{
if (!bEPPflags.bits.configuration)
{
if (_want_connect)
{
_want_connect=0;
reconnect_USB();//重新连接USB
}
}
IT0=1;
}
else
{
IT0=0;
}
//==================================
check_buttton();
if (bEPPflags.bits.setup_packet){//Setup包处理
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();//调用请求处理子程序
// D12SUSPD = 1;
} // if setup_packet
} // Main Loop
}
//返回stall应答
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
//断开USB总线
void disconnect_USB(void)
{
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//连接USB总线
void connect_USB(void)
{
// V2.1 enable normal+sof interrupt
D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}
//重新连接到USB总线
void reconnect_USB(void)
{
disconnect_USB();
// printf("Wait for 1 second ...\n");
connect_USB();
}
//恢复到未配置状态
void init_unconfig(void)
{
// unsigned char i;
D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
//设置配置状态
void init_config(void)
{
D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
}
//从端点号1发送数据
void single_transmit(unsigned char * buf, unsigned char len)
{
if( len <= EP0_PACKET_SIZE) {
D12_WriteEndpoint(1, len, buf);
}
}
//发送端点号1建立代码
void code_transmit(unsigned char code * 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);//发送16字节数据
ControlData.wCount += EP0_PACKET_SIZE;
DISABLE;
bEPPflags.bits.control_state = USB_TRANSMIT;
ENABLE;
}
else {
D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
ControlData.wCount += ControlData.wLength;
DISABLE;
bEPPflags.bits.control_state = USB_IDLE;
ENABLE;
}
}
//请求处理子程序
void control_handler()
{
unsigned char type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
if (type == USB_STANDARD_REQUEST)
(*StandardDeviceRequest[req])();//调用标准请求
else
stall_ep0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -