home *** CD-ROM | disk | FTP | other *** search
/ hobbes.nmsu.edu / 2008-06-02_hobbes.nmsu.edu.zip / dos / Usb4pas.zip / HUBDISCO.PAS < prev    next >
Pascal/Delphi Source File  |  1999-01-25  |  13KB  |  338 lines

  1. { Sample Program uses USB.PAS                                                }
  2. { -------------------------------------------------------------------------- }
  3. { Configures an USB 4-port-HUB-Device and enables its downstream ports       }
  4. { (c) 1998 by Dieter Pawelczak, <dieterp@bigfoot.de>                         }
  5. { This is public domain Software - selling this software is prohibeted!      }
  6. { -------------------------------------------------------------------------- }
  7. { For more info seek www.usb.org                                             }
  8.  
  9.  
  10. uses dutils,pci,usb,dos,crt;
  11.  
  12. Var DeviceID,VendorID:word;         { PCI-BUS USB Device }
  13.     BusNumber,FunctionNumber:Byte;  { PCI-BUS Address    }
  14.     Description:string;             { PCI-BUS Ddevice Description }
  15.  
  16.     { Helpers }
  17.  
  18.     result:longint;
  19.     IOSpace:word;
  20.     hwint:word;
  21.     dummytimer:word;
  22.     hwactive:boolean;
  23.     flbase:framelistpointer;
  24.     flptr:framelist;
  25.  
  26.     var testbuffer:array[0..1279] of byte;
  27.         const deviceaddress=1;
  28.  
  29. const preferredHWInterrupt=3;       { if not configured then use this HW-interrupt }
  30.       preferredIOSpace=$120;        { if not configured then use this IO Addressspace }
  31.  
  32. {Requests to enable HUB}
  33.  
  34. const SetAddressDescriptor : USBRequest =
  35.        (bmRequestType:$00;bRequest:$5;wValue:$0001;
  36.         { Address for USB device at port 1 }
  37.         wIndex:$000;wLength:$0000);
  38.  
  39. const GetHubDescriptor : USBRequest =
  40.        (bmRequestType:$A0;bRequest:$06;wValue:$0001;wIndex:$0000;wLength:$0012);
  41.  
  42. const SetConfiguration : USBRequest =
  43.        (bmRequestType:$00;bRequest:$9;wValue:$0001;wIndex:$0000;wLength:$000);
  44.  
  45. const GetConfiguration : USBRequest =
  46.        (bmRequestType:$00;bRequest:$8;wValue:$0001;wIndex:$0000;wLength:$000);
  47.  
  48. const GetHubStatus : USBRequest =
  49.        (bmRequestType:$A0;bRequest:$0;wValue:$000;wIndex:$0000;wLength:$004);
  50.  
  51. const GetDeviceDescriptor : USBRequest =
  52.        (bmRequestType:$80;bRequest:$06;wValue:$0001;wIndex:$0000;wLength:$008);
  53.  
  54. const SetHubPortPowerFeature : USBRequest =
  55.        (bmRequestType:$23;bRequest:$3;wValue:$0008;wIndex:$0001;wLength:$000);
  56.  
  57.  
  58. var oldUsbInt:pointer;              { store original Interrupt service routine }
  59.     serviceInt:word;                { HW-INT VEC != SW-INT VEC }
  60.  
  61.  
  62. procedure slaveInterrupt;interrupt;
  63. begin
  64.   cprint(1,24,' XXX ',48);          { display IRQ call }
  65.   inc(dummytimer);
  66.   port[$20]:=$20;
  67.   port[$A0]:=$20;
  68. end;
  69.  
  70. procedure masterinterrupt;interrupt;
  71. begin
  72.   inc(dummytimer);
  73.   cprint(1,24,' XXX ',48);          { display IRQ call }
  74.   port[$20]:=$20;
  75. end;
  76.  
  77. procedure USBStatus;
  78. var status,comm:word;
  79.  
  80.  
  81. begin
  82.   status:=UsbReadStatusReg;
  83.   comm:=UsbReadCommandReg;
  84.   writeln('S:',bins8(status),'=',hexs8(status),'  C:',bins8(Comm),'=',hexs8(comm),
  85.   '  FN:',hexs16(USBReadFrameNumberReg),'  FB:',hexs(USBreadFrameBaseReg)+
  86.   '  PS:',bins16(USBreadPort0Reg),'=',hexs8(USBreadPort0Reg));
  87.   USBWriteStatusReg($ffff);
  88. end;
  89.  
  90. var i:word;
  91.     sampleTD:^transferDescriptor;
  92.     sampleTD1:^transferDescriptor;
  93.     sampleTD2:^transferDescriptor;
  94.     sampleTD3:^transferDescriptor;
  95.     sampleTD4:^transferDescriptor;
  96.     sampleTD5:^transferDescriptor;
  97. Label DoItAgain;
  98.  
  99. begin
  100.   clrscr;
  101.   assign(output, '');rewrite(output);
  102.  
  103.   writeln('Testprogramm to detect and initialize the USB controller');
  104.   writeln('and switch through a 4 PORT Hub');
  105.   writeln;
  106.  
  107.   { Create TD for HUB initialization }
  108.  
  109.   sampleTD:=CreateTransferDescriptor(true{ Terminate } ,
  110.                                      false { Queue },
  111.                                      false { Depth },
  112.                                      0 { Link },
  113.                                      $0 { Actlen },
  114.                                      $80 { $80 = active Status },
  115.                                      true { IOC },
  116.                                      false { IOS },
  117.                                      false { LS } ,
  118.                                      1 { C_error: },
  119.                                      false { SPD },
  120.                                      $2d  { e1 = OUT 2d { 2d PID = SETUP },
  121.                                      0 , { Deviceaddress }
  122.                                      0 { EndPt },
  123.                                      false { DataToggle },
  124.                                      $7 { MaxLen },
  125.                                      getPtrBase(@SetAddress));
  126.   sampleTD1:=CreateTransferDescriptor(true{ Terminate } ,
  127.                                      false { Queue },
  128.                                      false { Depth },
  129.                                      0{ Link },
  130.                                      $7ff { Actlen },
  131.                                      $80 { $80=active Status },
  132.                                      true { IOC },
  133.                                      false { IOS },
  134.                                      false { LS } ,
  135.                                      1 { C_error: },
  136.                                      false { SPD },
  137.                                      $69 { 69 = PID = IN },
  138.                                      0 { DeviceAddress },
  139.                                      0 { EndPt },
  140.                                      true { DataToggle },
  141.                                      $7ff { MaxLen },
  142.                                      getPtrBase(@testbuffer) { BufferPtr });
  143.   sampleTD2:=CreateTransferDescriptor(true{ Terminate } ,
  144.                                      false { Queue },
  145.                                      false { Depth },
  146.                                      0 { Link },
  147.                                      $0 { Actlen },
  148.                                      $80 { $80 = active Status },
  149.                                      true { IOC },
  150.                                      false { IOS },
  151.                                      false { LS } ,
  152.                                      1 { C_error: },
  153.                                      false { SPD },
  154.                                      $2d  { e1 = OUT 2d { 2d PID = SETUP },
  155.                                      1 , { Deviceaddress }
  156.                                      0 { EndPt },
  157.                                      false { DataToggle },
  158.                                      $7 { MaxLen },
  159.                                      getPtrBase(@SetConfiguration));
  160.   sampleTD3:=CreateTransferDescriptor(true{ Terminate } ,
  161.                                      false { Queue },
  162.                                      false { Depth },
  163.                                      0{ Link },
  164.                                      $7ff { Actlen },
  165.                                      $80 { $80=active Status },
  166.                                      true { IOC },
  167.                                      false { IOS },
  168.                                      false { LS } ,
  169.                                      1 { C_error: },
  170.                                      false { SPD },
  171.                                      $69 { 69 = PID = IN },
  172.                                      1 { DeviceAddress },
  173.                                      0 { EndPt },
  174.                                      true { DataToggle },
  175.                                      $7ff { MaxLen },
  176.                                      getPtrBase(@testbuffer) { BufferPtr });
  177.  
  178.   sampleTD4:=CreateTransferDescriptor(true{ Terminate } ,
  179.                                      false { Queue },
  180.                                      false { Depth },
  181.                                      0 { Link },
  182.                                      $0 { Actlen },
  183.                                      $80 { $80 = active Status },
  184.                                      true { IOC },
  185.                                      false { IOS },
  186.                                      false { LS } ,
  187.                                      1 { C_error: },
  188.                                      false { SPD },
  189.                                      $2d  { e1 = OUT 2d { 2d PID = SETUP },
  190.                                      1 , { Deviceaddress }
  191.                                      0 { EndPt },
  192.                                      false { DataToggle },
  193.                                      $7 { MaxLen },
  194.                                      getPtrBase(@SetHubPortPowerFeature));
  195.   sampleTD5:=CreateTransferDescriptor(true{ Terminate } ,
  196.                                      false { Queue },
  197.                                      false { Depth },
  198.                                      0{ Link },
  199.                                      $7ff { Actlen },
  200.                                      $80 { $80=active Status },
  201.                                      true { IOC },
  202.                                      false { IOS },
  203.                                      false { LS } ,
  204.                                      1 { C_error: },
  205.                                      false { SPD },
  206.                                      $69 { 69 = PID = IN },
  207.                                      1 { DeviceAddress },
  208.                                      0 { EndPt },
  209.                                      true { DataToggle },
  210.                                      $7ff { MaxLen },
  211.                                      getPtrBase(@testbuffer) { BufferPtr });
  212.   { IF VR-mode then abort }
  213.   if detectvirtualrealmode then
  214.     begin
  215.       writeln('System is running under V-Real Mode - abort');
  216.       halt(3);
  217.     end;
  218.   { if no PCI-Bios then abort }
  219.   if not detectPCIBios then
  220.     begin
  221.       writeln('PCI-BIOS not supported - abort!');
  222.       halt(3);
  223.     end;
  224.   { Get USB-Controller (PCI-Configuration) }
  225.   if USBdetect(DeviceId,VendorId,BusNumber,FunctionNumber,description) then
  226.     begin
  227.       writeln(description);
  228.       writeln('---------------------');
  229.       writeln('DeviceID:',hexs(DeviceId));
  230.       writeln('VendorID:',hexs(VendorId));
  231.       writeln('BusNumber:',hexs(BusNumber));
  232.       writeln('FunctionNumber:',hexs(FunctionNumber));
  233.     end;
  234.   { Detect configured IO-Space Address }
  235.   if USBGetDeviceIOSpace(IOSpace) then
  236.       writeln('Maped I/O-Space: ',hexs(iospace));
  237.   { Install IO-Space Address }
  238.   if iospace<$100 then
  239.   if USBSetDeviceIOSpace(preferredIOSpace) then
  240.     if USBGetDeviceIOSpace(IOSpace) then
  241.       writeln('Maped I/O-Space: ',hexs(iospace));
  242.   { Enable PCI-Master }
  243.   USBStatus;
  244.   writeln('USB enable:',USBEnable);
  245.   USBStatus;
  246.   { Set Software programmable bit to check if IO-Space settings work }
  247.   USBStatus;
  248.   { Allocate page aligned Framelist }
  249.   USBAllocateFrameList(FlPtr,FLbase);
  250.  
  251.   { Detect configured HW-Interrupt }
  252.   USBGetInterruptNumber(hwint,hwactive);
  253.   writelN('HW-Interrupt:',hwint:2,'  - Active:',hwactive);
  254.   { Install HW-interrupt and Interrupt service routine }
  255.  
  256.   hwint:=preferredHWInterrupt;
  257.   if hwint>7 then
  258.     begin
  259.       serviceInt:=hwint+$70;
  260.       getintvec(serviceInt,oldUsbInt);
  261.       setintvec(serviceInt,@slaveInterrupt);
  262.     end else
  263.     begin
  264.       serviceInt:=hwint+$8;
  265.       getintvec(serviceInt,oldUsbInt);
  266.       setintvec(serviceInt,@masterInterrupt);
  267.     end;
  268.   USBSetInterruptNumber(9,false);
  269.   USBSetInterruptNumber(hwint,True);
  270.   { Re-Check... }
  271.   USBGetInterruptNumber(hwint,hwactive);
  272.   USBWriteInterruptReg($0f);  { enable all interrupt occurences }
  273.  
  274.   writelN('HW-Interrupt:',hwint:2,'  - Active:',hwactive);
  275.  
  276.   usbstatus;
  277.  
  278.   InsertTransferDescriptorInFrameList(00, SampleTD);
  279.   InsertTransferDescriptorInFrameList(20, SampleTD1);
  280.   InsertTransferDescriptorInFrameList(40, SampleTD2);
  281.   InsertTransferDescriptorInFrameList(60, SampleTD3);
  282.   InsertTransferDescriptorInFrameList(80, SampleTD4);
  283.   InsertTransferDescriptorInFrameList(100, SampleTD5);
  284.  
  285.   DoItAgain:
  286.   { wait for attachement }
  287.   repeat
  288.   until (usbReadPort0Reg and 1=1) or keypressed;
  289.   usbstatus;
  290.   usbWritePort0Reg(512+8+2);   { Port Reset }
  291.   usbstatus;
  292.   delay(50);
  293.   usbstatus;
  294.   usbWritePort0Reg($95);
  295.   usbWritePort0Reg($4+8+2);
  296.   usbWriteFrameNumberReg(0);
  297.   usbcommandrun; { start from FrameList 0 }
  298.   usbWritePort0Reg($4+8+2);
  299.   usbWritePort0Reg($4+8+2);
  300.  
  301.   repeat
  302.   usbWritePort0Reg($4+8+2);
  303.        { Port Enable }    begin delay(100);usbstatus; end;
  304.   if (sampleTD5^.status<>$80) then
  305.     begin
  306.      sampleTD5^.status:=$80;
  307.      sampleTD4^.status:=$80;
  308.      inc(SetHubPortPowerFeature.windex);
  309.      if SetHubPortPowerFeature.windex>5 then
  310.        begin
  311.          SetHubPortPowerFeature.windex:=0;
  312.          usbCommandstop;
  313.          sampleTD^.status:=$80;
  314.          sampleTD1^.status:=$80;
  315.          sampleTD2^.status:=$80;
  316.          sampleTD3^.status:=$80;
  317.           goto DoItAgain;
  318.        end;
  319.     end;
  320.   until keypressed;
  321.   delay(10);
  322.   usbcommandstop;
  323.   usbstatus;
  324.   writeln('Calls to USB interrupt:',dummytimer);
  325.   USBWriteInterruptReg($00);  { Disable all interrupt occurences }
  326.   setintvec(serviceInt,oldUsbInt);
  327.   writeln('USB disable:',USBDisable);
  328.   USBdone; { Restore old IRQ values }
  329.   USBprintTD(sampleTD);
  330.   USBprintTD(sampleTD1);
  331.   USBprintTD(sampleTD2);
  332.   USBprintTD(sampleTD3);
  333.   USBprintTD(sampleTD4);
  334.   USBprintTD(sampleTD5);
  335.   writeln;
  336.  
  337. end.
  338.