📄 testusb.c
字号:
INT8U x2;
INT8U x3;
x0 = (n3 % 16);
n3 /= 16;
x1 = (n3 % 16);
n3 /= 16;
x2 = (n3 % 16);
n3 /= 16;
x3=n3;
x0=convertH(x0);
x1=convertH(x1);
x2=convertH(x2);
x3=convertH(x3);
VT102DispChar (x, y, '0', COLOR_WHITE, COLOR_BLACK);
VT102DispChar (x+1, y, 'X', COLOR_WHITE, COLOR_BLACK);
VT102DispChar (x+2, y, x3, COLOR_WHITE, COLOR_BLACK);
VT102DispChar (x+3, y, x2, COLOR_WHITE, COLOR_BLACK);
VT102DispChar (x+4, y, x1, COLOR_WHITE, COLOR_BLACK);
VT102DispChar (x+5, y, x0, COLOR_WHITE, COLOR_BLACK);
VT102DispStr(x+6, y, " ", COLOR_WHITE, COLOR_BLACK);
}
//USB mainloop 主循环
void USB(void)
{
int i,j,k;
unsigned char key=0,cycle=0;
//for(i = 0; i < 64; i ++) EpBuf[i]=mainep.MainEpBuf[i];
init_port();
init_special_interrupts(); /* Initialize the AVR UART and Timer */
PORTD&=~(1<<6); /*reset d12*/
printf(1,11,"reset USB chip...",0);
PORTD|=1<<6;
if((i = D12_GetDMA()) == 0xC3) {
D12_SendResume();
VT102DispStr(51, 19, "DMA is ", COLOR_WHITE, COLOR_BLACK);
VT102DispNumH(60, 19, i, COLOR_WHITE, COLOR_BLACK);
}
else {
bEPPflags.value = 0;
/* disconnect and reconnect Soft-Connect */
VT102DispStr(1, 6, "PDIUSBD12 SEAPORT board firmware .", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 7, "input number 1 to see status. ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 8, "input number 2 to reconect.", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 9, "input number 3 to see the state of verbose. ", COLOR_WHITE, COLOR_BLACK);
printf(1, 10, "input symble # : esc of USB bNoRAM= %d", bNoRAM);
VT102DispStr(1, 22, " Connecting USB...... ", COLOR_WHITE, COLOR_BLACK);
reconnect_USB();
}
/* Main program loop */
// for(i=0;i<64;i++) EpBuf[i]=i;
//D12_WriteEndpoint(5,64,EpBuf);
while(key!='#')
{
key=GetKeyPro();
if(key) {
VT102DispStr(1, 20, "you have entered:", COLOR_WHITE, COLOR_BLACK);
VT102DispChar (30, 20, key, COLOR_WHITE, COLOR_BLACK);
VT102DispStr(31, 20, " ", COLOR_WHITE, COLOR_BLACK);
//printf(1,18,"OSIntNesting :%d",OSIntNesting);
}
switch(key) {
case '1':
if(bEPPflags.bits.control_state == USB_IDLE)
VT102DispStr(1, 11, "Control state = USB_IDLE. ", COLOR_WHITE, COLOR_BLACK);
else if(bEPPflags.bits.control_state == USB_RECEIVE)
VT102DispStr(1, 11, "Control state = USB_RECEIVE. ", COLOR_WHITE, COLOR_BLACK);
else if(bEPPflags.bits.control_state == USB_TRANSMIT)
VT102DispStr(1, 11, "Control state = USB_TRANSMIT. ", COLOR_WHITE, COLOR_BLACK);
printf(40,11," ControlData.wCount = %d.\n", ControlData.wCount);
printf(1,12,"Endpoint 4 (Bulk Out) Status = %h\n", D12_ReadEndpointStatus(4));
printf(40,12,"Endpoint 5 (Bulk In) Status = %h.\n",D12_ReadEndpointStatus(5));
/*if(bEPPflags.bits.dma_state == DMA_IDLE)
//printf(1,13,"DMA_State = DMA_IDLE.\n",0);
else if(bEPPflags.bits.dma_state == DMA_RUNNING)
//printf(1,13,"DMA_State = DMA_RUNNING.\n",0);
else if(bEPPflags.bits.dma_state == DMA_PENDING)
//printf(1,13,"DMA_State = DMA_PENDING.\n",0);*/
printf(1,13,"Last Device Request: bmRequestType = %d",ControlData.DeviceRequest.bmRequestType);
printf(45,13," bRequest= %h,",ControlData.DeviceRequest.bRequest);
printf(1,14," wValue = %h,",ControlData.DeviceRequest.wValue);
printf(20,14," wLength = %h,",ControlData.DeviceRequest.wLength);
printf(40,14," wIndex = %h\n",ControlData.DeviceRequest.wIndex );
printf(1,15,"Data: ",0);
for(i = 0,j=7,k=15;i < ControlData.DeviceRequest.wLength|| i<=8; i++) {
printf(j,k,"%h ", *((ControlData.dataBuffer)+i));
j+=8;
if(j>=80) {
if(k==19) {
j=7;
k=15;
}
else {
j=1;
k++;
}
}
}
break;
case '2':
VT102DispStr(1, 17, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 16, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 15, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 14, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 13, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 12, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 11, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 18, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 19, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 20, " ", COLOR_WHITE, COLOR_BLACK);
reconnect_USB();
break;
case '3':
VT102DispStr(1, 17, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 16, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 15, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 14, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 13, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 12, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 11, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 18, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 19, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 20, " ", COLOR_WHITE, COLOR_BLACK);
if(bEPPflags.bits.verbose == 0) {
printf(1,11,"Verbose Mode = ON.\n",0);
DISABLE;
bEPPflags.bits.verbose = 1;
ENABLE;
}
else {
printf(1,11,"Verbose Mode = OFF.\n",0);
DISABLE;
bEPPflags.bits.verbose = 0;
ENABLE;
}
break;
case '#':
VT102DispStr(1, 17, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 16, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 15, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 14, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 13, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 12, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 11, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 18, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 19, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 20, " ", COLOR_WHITE, COLOR_BLACK);
break;
case '4':
VT102DispStr(1, 17, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 16, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 15, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 14, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 13, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 12, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 11, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 18, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 19, " ", COLOR_WHITE, COLOR_BLACK);
VT102DispStr(1, 20, " ", COLOR_WHITE, COLOR_BLACK);
PORTD&=~(1<<6); /*reset d12*/
printf(1,11,"reset USB chip...",0);
PORTD|=1<<6;
DDRD = 0x7F;
PORTD&=~(1<<4);
DDRD&=~(1<<4) ;
break;
case '5':
cycle=!cycle;
if(cycle) printf(35,11,"Cycle.",0);
else printf(35,11," ",0);
break;
case '6':
D12_SetBufEnable();
//for(i=0;i<63;i++) EpBuf[i]=i;
//D12_WriteEndpoint(5,63,EpBuf);
bEPPflags.bits.ep2_txdone=1;
break;
default:
break;
}
if (bEPPflags.bits.bus_reset) {
DISABLE;
bEPPflags.bits.bus_reset = 0;
ENABLE;
printf(1,11,"bus reset. \n",0);
// Release D12's SUSPEND pin after bus reset
// Enable 74HCT123 pulse generation before disconnect
// D12SUSPD = 1;
DDRD = 0x7F;
PORTD|=1<<4;
DDRD&=~(1<<4) ;
} // if bus reset
if (bEPPflags.bits.suspend) {
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
printf(20,11,"suspend. ",0);
} // if suspend change
if (bEPPflags.bits.setup_packet){
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
// D12SUSPD = 1;
DDRD = 0x7F;
PORTD|=1<<4;
DDRD&=~(1<<4) ;
} // if setup_packet
if(bEPPflags.bits.setup_dma != 0) {
DISABLE;
bEPPflags.bits.setup_dma --;
ENABLE;
printf(1,11,"setup DMA.\n",0);
setup_dma();
} // if setup_dma
if(bEPPflags.bits.ep2_rxdone!= 0) {
DISABLE;
bEPPflags.bits.ep2_rxdone=0;
ENABLE;
printf(1,12,"Reveive data, endpoint 5: ",0);
if(cycle) mainep.datacount=0;
for(i = 0,j=27,k=12;i < 64; i++) {
printf(j,k,"%h ", *((EpBuf)+i));
if(cycle) {
mainep.MainEpBuf[mainep.datacount++]= *((EpBuf)+i);
bEPPflags.bits.ep2_txdone=1;
}
j+=8;
if(j>=80) {
if(k==19) {
j=27;
k=12;
}
else {
j=1;
k++;
}
}
}
} //end point 2 receive data
if(bEPPflags.bits.ep2_txdone != 0) {
DISABLE;
bEPPflags.bits.ep2_txdone = 0;
ENABLE;
if(mainep.datacount>0) {
if(mainep.datacount<64) {
for(i=0;i<mainep.datacount;i++) EpBuf[i]=mainep.MainEpBuf[i];
D12_WriteEndpoint(5,mainep.datacount,EpBuf);
mainep.datacount=0;
}
else {
for(i=0;i<64;i++) EpBuf[i]=mainep.MainEpBuf[i];
D12_WriteEndpoint(5,64,EpBuf);
mainep.datacount-=64;
}
}
else printf(60,11,"no data ",0);
} //end point2 transmit data
} // Main Loop
return ;
}
//USB surport
void StandardDeviceRequest(unsigned char req)
{
switch(req) {
case 0:
get_status();
break;
case 1:
clear_feature();
break;
case 2:
reserved();
break;
case 3:
set_feature();
break;
case 4:
reserved();
break;
case 5:
set_address();
break;
case 6:
// printf("get descriptor\n",0);
get_descriptor();
break;
case 7:
reserved();
break;
case 8:
get_configuration();
break;
case 9:
set_configuration();
break;
case 10:
get_interface();
break;
case 11:
set_interface();
break;
case 12:
case 13:
case 14:
case 15:
reserved();
break;
default:
break;
}
}
void VendorDeviceRequest(unsigned char req)
{
switch(req) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 13:
case 14:
case 15:
reserved();
break;
case 12:
read_write_register();
break;
default:
break;
}
}
void help_devreq(unsigned char typ, unsigned char req)
{
typ >>= 5;
if(typ == USB_STANDARD_REQUEST) {
}
else {
if(bEPPflags.bits.verbose){
printf(1,12,"Request Type =",0);
VT102DispStr(17,12,&_NAME_USB_REQUEST_TYPE[typ][0], COLOR_WHITE, COLOR_BLACK);
printf(40,12,", bRequest = %d.\n", req);
}
}
}
/* 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)
{
sei();
EIMSK|=0x01;
}
void init_port(void)
{
// D12SUSPD = 0;
DDRD = 0x7F;
PORTD&=~(1<<4);
DDRD&=~(1<<4) ;
PORTD|=1<<6;
PORTC|=0xEF;
}
//void on_exit(void)
//{
//}
//返回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)
{
// reset event flags
DISABLE;
bEPPflags.value = 0;
ENABLE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -