?? port.c
字號:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <bios.h>
#include <mem.h>
#include <graphics.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>
#include "isp1362.h"
#include "isa290.h"
#include "reg.h"
#include "cheeyu.h"
void enable_port(void)
{
unsigned long dat32;
w32(HcRhP1,0x00000102);
w32(HcRhP2,0x00000102);
w32(HcRhStatus,0x00010000); //set Global Power
w32(HcRhA,0x20000102);
w32(HcRhB,0x00000000);
dat32=r32(HcRhP2);
if((dat32&0x00000001)==1)
{
set_port_speed(2,0);
if(((dat32)&(0x00000200))!=0)
{
set_port_speed(2,1);
}
}
dat32=r32(HcRhP1);
if((dat32&0x00000001)==1)
{
set_port_speed(1,0);
if(((dat32)&(0x00000200))!=0)
{
set_port_speed(1,1);
}
}
}
void reset_usb(void)
{
if (g_is_PCI == TRUE) w16(HcHWCfg , 0x3429 ); // set INT1 to Active LOW, Level Triggered
else w16(HcHWCfg , 0x342D );
w32(HcFmItv , 0x25002EDF);
w32(HcControl , 0x00000600);
}
void set_operational(void)
{
if (g_is_PCI == TRUE) w16(HcHWCfg , 0x3429 ); // set INT1 to Active LOW, Level Triggered
else w16(HcHWCfg , 0x342D );
w32(HcFmItv , 0x25002EDF);
w32(HcControl , 0x00000680);
}
void port_monitor(void)
{
unsigned long control,irq_status,status1,status2;
unsigned int start_y=10;
unsigned int user_in;
clrscr();
set_operational();
w32(HcRhP1,0x00000102);
w32(HcRhP2,0x00000102);
w32(HcRhA,0x20000002);
w32(HcRhB,0x00000000);
w32(HcRhStatus,0x00010000); //set Global Power
do
{
control =r32(HcControl);
irq_status=r32(HcIntStatus);
status1 =r32(HcRhP1);
status2 =r32(HcRhP2);
if((status1&0x00000001)==1)
{
gotoxy(20,start_y+6);
w32(HcRhP1,0x00000102);
if((status1&0x00000200)!=0)
{
printf("LS Device connected to Port 1");
set_port_speed(1);
}
else
{
printf("FS Device connected to Port 1");
set_port_speed(0);
}
}
else
{
gotoxy(20,start_y+6);
printf(" ");
}
if((status2&0x00000001)==1)
{
gotoxy(20,start_y+7);
w32(HcRhP2,0x00000102);
if((status2&0x00000200)!=0)
{
printf("LS Device connected to Port 2");
set_port_speed(1);
}
else
{
printf("FS Device connected to Port 2");
set_port_speed(0);
}
}
else
{
gotoxy(20,start_y+7);
printf(" ");
}
gotoxy(20,start_y);
printf("Port Status Monitor");
gotoxy(20,start_y-1);
printf("OTGStatus Register = %8X.",r16(0x67));
gotoxy(20,start_y+1);
printf("OTGControl Register = %8X.",r16(0x62));
gotoxy(20,start_y+2);
printf("Control Register = %8lX.",control);
gotoxy(20,start_y+3);
printf("Int Status Register = %8lX.",irq_status);
gotoxy(20,start_y+4);
printf("P1 Status Register = %8lX.",status1);
gotoxy(20,start_y+5);
printf("P2 Status Register = %8lX.",status2);
gotoxy(20,start_y+8);
printf("Press '1' to go back to main menu");
user_in=read_key(0);
}
while(user_in!='1');
}
void check_ports(void)
{
unsigned long control,irq_status,status1,status2;
control =r32(HcControl);
irq_status=r32(HcIntStatus);
status1 =r32(HcRhP1);
status2 =r32(HcRhP2);
if((status1&0x00000001)==1)
{
w32(HcRhP1,0x00000102);
if((status1&0x00000200)!=0)
{
printf("\nLS Device connected to Port 1 ");
set_port_speed(1);
}
else
{
printf("\nFS Device connected to Port 1 ");
set_port_speed(0);
}
}
if((status2&0x00000001)==1)
{
w32(HcRhP2,0x00000102);
if((status2&0x00000200)!=0)
{
printf("\nLS Device connected to Port 2 ");
set_port_speed(1);
}
else
{
printf("\nFS Device connected to Port 2 ");
set_port_speed(0);
}
}
printf("\nControl Register = %8lX.",control);
printf("\nInt Status Register = %8lX.",irq_status);
printf("\nP1 Status Register = %8lX.",status1);
printf("\nP2 Status Register = %8lX.",status2);
}
unsigned int assign_address(unsigned int addr1, unsigned int addr2, int mode)
{
unsigned long rhp1,rhp2;
unsigned int status;
unsigned int ccode=0;
rhp1=r32(HcRhP1);
rhp2=r32(HcRhP2);
enable_port();
gotoxy(1,5);
if(mode==1)
{
printf("\nRhP1 = %8lX RhP2 = %8lX",rhp1,rhp2);
printf("\nPort1Speed = %2d",get_port_speed(1));
printf("\nPort2Speed = %2d",get_port_speed(2));
}
if( ((rhp1&0x01)==1) && ((rhp2&0x01)==1) )
{
if(mode==1)printf("\nBoth ports has USB device connected.");
w32(HcRhP1,0x00000010); //Resets port 1
delay(500);
w32(HcRhP2,0x00000010); //Resets port 2
ccode=set_address(0,1,1);
status=0x0100|(ccode<<12);
enable_port();
delay(200);
ccode=set_address(0,2,2);
status=0x0001|(ccode<<4);
}
else if( ((rhp1&0x01)==1) && ((rhp2&0x01)==0) )
{
if(mode==1)printf("\nPort 1 has USB device connected, assigning address 1...");
ccode=set_address(0,1,1);
status=0x0100|(ccode<<12);
}
else if( ((rhp1&0x01)==0) && ((rhp2&0x01)==1) )
{
if(mode==1)printf("\nPort 2 has USB device connected, assigning address 2...");
ccode=set_address(0,2,2);
status=0x0001|(ccode<<4);
}
else
{
if(mode==1)printf("\nNo device connected to ISP1362, aborting enumeration...");
status=0x0000;
}
return(status);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -