git-svn-id: https://spexeah.com:8443/svn/Asuro@352 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

This commit is contained in:
kieron
2018-04-05 19:17:46 +00:00
parent 91d6c8a608
commit 78910b6fcc
27 changed files with 253 additions and 10 deletions

227
src/driver/E1000.pas Normal file
View File

@ -0,0 +1,227 @@
unit E1000;
interface
uses
console,
strings,
vmemorymanager,
lmemorymanager,
drivermanagement;
const
INTEL_VEND = $8086;
E1000_DEV = $100E;
I217_DEV = $153A;
LM82577_DEV = $10EA;
REG_CTRL = $0000;
REG_STATUS = $0008;
REG_EEPROM = $0014;
REG_CTRL_EXT = $0018;
REG_IMASK = $00D0;
REG_RCTRL = $0100;
REG_RXDESCLO = $2800;
REG_RXDESCHI = $2804;
REG_RXDESCLEN = $2808;
REG_RXDESCHEAD = $2810;
REG_RXDESCTAIL = $2818;
REG_TCTRL = $0400;
REG_TXDESCLO = $3800;
REG_TXDESCHI = $3804;
REG_TXDESCLEN = $3808;
REG_TXDESCHEAD = $3810;
REG_TXDESCTAIL = $3818;
REG_RDTR = $2820; // RX Delay Timer Register
REG_RXDCTL = $3828; // RX Descriptor Control
REG_RADV = $282C; // RX Int. Absolute Delay Timer
REG_RSRPD = $2C00; // RX Small Packet Detect Interrupt
REG_TIPG = $0410; // Transmit Inter Packet Gap
ECTRL_SLU = $40; //set link up
RCTL_EN = (1 SHL 1); // Receiver Enable
RCTL_SBP = (1 SHL 2); // Store Bad Packets
RCTL_UPE = (1 SHL 3); // Unicast Promiscuous Enabled
RCTL_MPE = (1 SHL 4); // Multicast Promiscuous Enabled
RCTL_LPE = (1 SHL 5); // Long Packet Reception Enable
RCTL_LBM_NONE = (0 SHL 6); // No Loopback
RCTL_LBM_PHY = (3 SHL 6); // PHY or external SerDesc loopback
RTCL_RDMTS_HALF = (0 SHL 8); // Free Buffer Threshold is 1/2 of RDLEN
RTCL_RDMTS_QUARTER = (1 SHL 8); // Free Buffer Threshold is 1/4 of RDLEN
RTCL_RDMTS_EIGHTH = (2 SHL 8); // Free Buffer Threshold is 1/8 of RDLEN
RCTL_MO_36 = (0 SHL 12); // Multicast Offset - bits 47:36
RCTL_MO_35 = (1 SHL 12); // Multicast Offset - bits 46:35
RCTL_MO_34 = (2 SHL 12); // Multicast Offset - bits 45:34
RCTL_MO_32 = (3 SHL 12); // Multicast Offset - bits 43:32
RCTL_BAM = (1 SHL 15); // Broadcast Accept Mode
RCTL_VFE = (1 SHL 18); // VLAN Filter Enable
RCTL_CFIEN = (1 SHL 19); // Canonical Form Indicator Enable
RCTL_CFI = (1 SHL 20); // Canonical Form Indicator Bit Value
RCTL_DPF = (1 SHL 22); // Discard Pause Frames
RCTL_PMCF = (1 SHL 23); // Pass MAC Control Frames
RCTL_SECRC = (1 SHL 26); // Strip Ethernet CRC
// Buffer Sizes
RCTL_BSIZE_256 = (3 SHL 16);
RCTL_BSIZE_512 = (2 SHL 16);
RCTL_BSIZE_1024 = (1 SHL 16);
RCTL_BSIZE_2048 = (0 SHL 16);
RCTL_BSIZE_4096 = ((3 SHL 16) OR (1 SHL 25));
RCTL_BSIZE_8192 = ((2 SHL 16) OR (1 SHL 25));
RCTL_BSIZE_16384 = ((1 SHL 16) OR (1 SHL 25));
// Transmit Command
CMD_EOP = (1 SHL 0); // End of Packet
CMD_IFCS = (1 SHL 1); // Insert FCS
CMD_IC = (1 SHL 2); // Insert Checksum
CMD_RS = (1 SHL 3); // Report Status
CMD_RPS = (1 SHL 4); // Report Packet Sent
CMD_VLE = (1 SHL 6); // VLAN Packet Enable
CMD_IDE = (1 SHL 7); // Interrupt Delay Enable
// TCTL Register
TCTL_EN = (1 SHL 1); // Transmit Enable
TCTL_PSP = (1 SHL 3); // Pad Short Packets
TCTL_CT_SHIFT = 4; // Collision Threshold
TCTL_COLD_SHIFT = 12; // Collision Distance
TCTL_SWXOFF = (1 SHL 22); // Software XOFF Transmission
TCTL_RTLC = (1 SHL 24); // Re-transmit on Late Collision
TSTA_DD = (1 SHL 0); // Descriptor Done
TSTA_EC = (1 SHL 1); // Excess Collisions
TSTA_LC = (1 SHL 2); // Late Collision
LSTA_TU = (1 SHL 3); // Transmit Underrun
type
PE1000_rx_desc = ^TE1000_rx_desc;
TE1000_rx_desc = bitpacked record
address : uint64;
length : uint16;
checksum : uint16;
status : uint8;
errors : uint8;
special : uint16;
end;
PE1000_tx_desc = ^TE1000_tx_desc;
TE1000_tx_desc = bitpacked record
address : uint64;
length : uint16;
cso : uint8;
cmd : uint8;
status : uint8;
css : uint8;
special : uint16;
end;
procedure init();
procedure fire();
function getMACAddress : uint8;
function sendPacket(p_data : void; p_len : uint16) : sint32;
implementation
var
bar_type : uint8;
io_base : uint16;
mem_base : uint64;
eeprom_exists : boolean;
mac : array[0..5] of uint8;
rx_descs : array[0..65535] of TE1000_rx_desc;
tx_descs : array[0..65535] of TE1000_tx_desc;
rx_curr : uint16;
tx_curr : uint16;
procedure writeCommand(p_address : uint16; p_value : uint32);
begin
end;
function readCommand(p_address : uint16) : uint32;
begin
end;
function detectEEPROM() : boolean;
begin
end;
function EEPROMRead( address : uint8 ) : uint32;
begin
end;
function readMACAddress() : boolean;
begin
end;
procedure startLink();
begin
end;
procedure rxinit();
begin
end;
procedure txinit();
begin
end;
procedure enableInturrupt();
begin
end;
procedure handleReceive();
begin
end;
function load(ptr : void) : boolean;
begin
load:= true;
end;
procedure init();
var
dev : TDeviceIdentifier;
begin
dev.Bus:= biPCI;
dev.id0:= E1000_DEV;
dev.id1:= idANY;
dev.id2:= idANY;
dev.id3:= idANY;
dev.id4:= INTEL_VEND;
dev.ex:= nil;
drivermanagement.register_driver('E1000 Ethernet Driver', @dev, @load);
dev.id0:= I217_DEV;
drivermanagement.register_driver('I217 Ethernet Driver', @dev, @load);
dev.id0:= LM82577_DEV;
drivermanagement.register_driver('82577LM Ethernet Driver', @dev, @load);
end;
procedure fire();
begin
end;
function getMACAddress : uint8;
begin
end;
function sendPacket(p_data : void; p_len : uint16) : sint32;
begin
end;
end.

View File

@ -313,6 +313,7 @@ begin
DevID^.id1:= device.class_code;
DevID^.id2:= device.subclass_class;
DevID^.id3:= device.prog_if;
DevID^.id4:= device.vendor_id;
DevID^.ex:= nil;
console.writestring('PCI: Found Device: ');

View File

@ -110,6 +110,7 @@ begin
UHCI_ID.id1:= $0000000C;
UHCI_ID.id2:= $00000003;
UHCI_ID.id3:= $00000000;
UHCI_ID.id4:= $FFFFFFFF;
UHCI_ID.ex:= nil;
OHCI_ID.Bus:= biPCI;
@ -117,6 +118,7 @@ begin
OHCI_ID.id1:= $0000000C;
OHCI_ID.id2:= $00000003;
OHCI_ID.id3:= $00000010;
OHCI_ID.id4:= $FFFFFFFF;
OHCI_ID.ex:= nil;
drivermanagement.register_driver('USB-UHCI Driver', @UHCI_ID, @loadUHCI);

View File

@ -78,6 +78,7 @@ begin
devid.id1:= 0;
devid.id2:= 0;
devid.id3:= 0;
devid.id4:= 0;
devid.ex:= nil;
drivermanagement.register_driver_ex('PS/2 Keyboard', @devid, @load, true);
console.writestringln('PS/2 KEYBOARD: INIT END.');

View File

@ -122,6 +122,7 @@ begin
devid.id1:= 0;
devid.id2:= 0;
devid.id3:= 0;
devid.id4:= 0;
devid.ex:= nil;
drivermanagement.register_driver_ex('PS/2 Mouse', @devid, @load, true);
console.writestringln('PS/2 MOUSE: INIT END.');

View File

@ -24,6 +24,7 @@ begin
devID.id1:= $00000006; { CLASS }
devID.id2:= $00000000; { SUBCLASS }
devID.id3:= $00000000; { PROGIF }
devID.id4:= idANY;
devID.ex:= nil; { NO EXTENDED INFO }
drivermanagement.register_driver('DUMMY DRIVER', @devID, @load);
end;

View File

@ -26,12 +26,13 @@ type
TBusIdentifier = (biUnknown, biPCI, biUSB, bii2c, biPCIe, biANY);
PDeviceIdentifier = ^TDeviceIdentifier;
TDeviceIdentifier = record
TDeviceIdentifier = record
Bus : TBusIdentifier;
id0 : uInt32;
id1 : uInt32;
id2 : uInt32;
id3 : uint32;
id4 : uint32;
ex : PDevEx;
end;
@ -93,8 +94,8 @@ begin
if Drv^.Loaded then begin
console.writeint(i);
console.writestring(') ');
console.writestring(Drv^.Driver_Name);
console.writestring(' [');
console.writestringln(Drv^.Driver_Name);
console.writestring('[');
writeBusType(Drv^.Identifier^.Bus);
console.writestring(' - ID:');
console.writeHex(Drv^.Identifier^.id0);
@ -104,6 +105,8 @@ begin
console.writeHex(Drv^.Identifier^.id2);
console.writestring('-');
console.writeHex(Drv^.Identifier^.id3);
console.writestring('-');
console.writeHex(Drv^.Identifier^.id4);
ex:= Drv^.Identifier^.ex;
while ex <> nil do begin
console.writestring('-');
@ -130,8 +133,8 @@ begin
console.writeint(i);
if Drv^.Loaded then console.writestring('L');
console.writestring(') ');
console.writestring(Drv^.Driver_Name);
console.writestring(' [');
console.writestringln(Drv^.Driver_Name);
console.writestring('[');
writeBusType(Drv^.Identifier^.Bus);
console.writestring(' - ID:');
console.writeHex(Drv^.Identifier^.id0);
@ -141,6 +144,8 @@ begin
console.writeHex(Drv^.Identifier^.id2);
console.writestring('-');
console.writeHex(Drv^.Identifier^.id3);
console.writestring('-');
console.writeHex(Drv^.Identifier^.id4);
ex:= Drv^.Identifier^.ex;
while ex <> nil do begin
console.writestring('-');
@ -165,8 +170,8 @@ begin
while Dv <> nil do begin
console.writeint(i);
console.writestring(') ');
console.writestring(Dv^.Device_Name);
console.writestring(' [');
console.writestringln(Dv^.Device_Name);
console.writestring('[');
writeBusType(Dv^.Identifier^.Bus);
console.writestring(' - ID:');
console.writeHex(Dv^.Identifier^.id0);
@ -176,6 +181,8 @@ begin
console.writeHex(Dv^.Identifier^.id2);
console.writestring('-');
console.writeHex(Dv^.Identifier^.id3);
console.writestring('-');
console.writeHex(Dv^.Identifier^.id4);
ex:= Dv^.Identifier^.ex;
while ex <> nil do begin
console.writestring('-');
@ -212,6 +219,7 @@ begin
New_DevID^.id1:= DeviceID^.id1;
New_DevID^.id2:= DeviceID^.id2;
New_DevID^.id3:= DeviceID^.id3;
New_DevID^.id4:= DeviceID^.id4;
root_ex:= nil;
if DeviceID^.ex <> nil then begin
root_ex:= PDevEx(kalloc(sizeof(TDevEx)));
@ -243,6 +251,7 @@ begin
identifiers_match:= identifiers_match and ((i1^.id1 = i2^.id1) OR (i1^.id1 = $FFFFFFFF) OR (i2^.id1 = $FFFFFFFF));
identifiers_match:= identifiers_match and ((i1^.id2 = i2^.id2) OR (i1^.id2 = $FFFFFFFF) OR (i2^.id2 = $FFFFFFFF));
identifiers_match:= identifiers_match and ((i1^.id3 = i2^.id3) OR (i1^.id3 = $FFFFFFFF) OR (i2^.id3 = $FFFFFFFF));
identifiers_match:= identifiers_match and ((i1^.id4 = i2^.id4) OR (i1^.id4 = $FFFFFFFF) OR (i2^.id4 = $FFFFFFFF));
ll1:= i1^.ex;
ll2:= i2^.ex;
while true do begin

View File

@ -34,7 +34,8 @@ uses
strings,
AHCI,
USB,
testdriver;
testdriver,
E1000;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall;
@ -128,7 +129,7 @@ begin
pci.init();
console.writestringln('DRIVERS: INIT END.');
console.writestring('AHCI TEST');
{console.writestring('AHCI TEST');
console.writestringln('A');
atmp:= puint32(kalloc(sizeof(1024*128)));
console.writestringln('B');
@ -141,7 +142,7 @@ begin
AHCI.read(0, $5, $1, 32, atmp);
console.writestringln('F');
console.writeint(atmp^);
console.writestringln('G');
console.writestringln('G');}
console.writestringln('');
console.setdefaultattribute(console.combinecolors(Green, Black));