mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
RTL driver changes.
Set size of packet to send. Initialize RxBuffer. Packet sending is still VERY unstable.
This commit is contained in:
parent
f4c9709932
commit
6d287c9681
6 changed files with 78 additions and 47 deletions
|
|
@ -20,9 +20,12 @@ namespace Cosmos.Driver.RTL8139
|
||||||
body = data;
|
body = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] PacketBody()
|
public byte[] PacketBody
|
||||||
|
{
|
||||||
|
get
|
||||||
{
|
{
|
||||||
return body;
|
return body;
|
||||||
|
}
|
||||||
//return new byte[10]; //TODO: Redo this completely! Hardcoded to some bogus value now.
|
//return new byte[10]; //TODO: Redo this completely! Hardcoded to some bogus value now.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -227,16 +227,18 @@ namespace Cosmos.Driver.RTL8139
|
||||||
/// Initialize the Receive Buffer. The RBSTART register consists of 4 bytes (0x30h to 0x33h) which should contain
|
/// Initialize the Receive Buffer. The RBSTART register consists of 4 bytes (0x30h to 0x33h) which should contain
|
||||||
/// the address of a buffer to save incoming data to.
|
/// the address of a buffer to save incoming data to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitReceiveBuffer()
|
public void InitReceiveBuffer()
|
||||||
{
|
{
|
||||||
//TODO: Really unsure of the types and math here...
|
|
||||||
//char[] rx_buffer = new char[8192+16]; //8k + header
|
|
||||||
//pciCard.Write8(RTL8139Register.RxBuf, (byte)rx_buffer);
|
|
||||||
//byte[] rxbuffer = new byte(
|
|
||||||
|
|
||||||
//Prepare a buffer area
|
//Prepare a buffer area
|
||||||
|
byte[] rxbuffer = new byte[2048];
|
||||||
|
|
||||||
|
UInt32 address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.RxBuf;
|
||||||
|
|
||||||
//Write the address of the buffer area to the RBSTART
|
//Write the address of the buffer area to the RBSTART
|
||||||
|
WriteAddressToPCI(ref rxbuffer, address);
|
||||||
|
|
||||||
|
Console.WriteLine("RxBuffer contains address: " + IOSpace.Read32(address));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -245,12 +247,13 @@ namespace Cosmos.Driver.RTL8139
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="bytearray"></param>
|
/// <param name="bytearray"></param>
|
||||||
/// <param name="address"></param>
|
/// <param name="address"></param>
|
||||||
private unsafe void WriteBufferToPCI(byte[] bytearray, uint address)
|
private unsafe void WriteAddressToPCI(ref byte[] bytearray, uint address)
|
||||||
{
|
{
|
||||||
/*fixed (byte* bodystart = &bytearray[0])
|
|
||||||
{
|
/* The data in the bytearray contains the actual bytes we want to transfer to the network.
|
||||||
IOSpace.Write32(address, (uint)bodystart);
|
* This bytearray must be in a continous memoryarea on the computer.
|
||||||
}
|
* We then write the address of this memoryarea to the network card.
|
||||||
|
* The address is stored in the Transmit Start Address which corresponds to the Transmit Status Descriptor we are currently using (0-3).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -258,7 +261,7 @@ namespace Cosmos.Driver.RTL8139
|
||||||
{
|
{
|
||||||
IntPtr bodyAddress = (IntPtr)bodystart;
|
IntPtr bodyAddress = (IntPtr)bodystart;
|
||||||
IOSpace.Write32(address, (uint)bodyAddress);
|
IOSpace.Write32(address, (uint)bodyAddress);
|
||||||
Console.WriteLine("Address: + " + (uint)bodyAddress);
|
Console.WriteLine("Address where packet body is stored: " + (uint)bodyAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -271,37 +274,27 @@ namespace Cosmos.Driver.RTL8139
|
||||||
//Tell the PCI card the address of body of the Packet.
|
//Tell the PCI card the address of body of the Packet.
|
||||||
UInt32 address =
|
UInt32 address =
|
||||||
pciCard.BaseAddress1 +
|
pciCard.BaseAddress1 +
|
||||||
(byte)MainRegister.Bit.TSD0 +
|
(byte)MainRegister.Bit.TSD0 + //I think this should be TSAD0, but then no packet is sent...
|
||||||
TransmitStatusDescriptor.GetCurrentTSDescriptor();
|
TransmitStatusDescriptor.GetCurrentTSDescriptor();
|
||||||
byte[] body = packet.PacketBody();
|
Console.WriteLine("Address of TSAD0: " + address);
|
||||||
|
|
||||||
Console.WriteLine("Packet to send: ");
|
byte[] body = packet.PacketBody;
|
||||||
foreach (byte item in body)
|
|
||||||
{
|
|
||||||
Console.Write(item + ":");
|
|
||||||
}
|
|
||||||
Console.WriteLine();
|
|
||||||
|
|
||||||
this.WriteBufferToPCI(body, address);
|
WriteAddressToPCI(ref body, address);
|
||||||
|
|
||||||
Console.WriteLine("Data in TSD0:");
|
Console.Write("Data in Transmit Status Descriptor " + TransmitStatusDescriptor.GetCurrentTSDescriptor() + ":");
|
||||||
Console.WriteLine(IOSpace.Read32(address));
|
Console.WriteLine(IOSpace.Read32(address));
|
||||||
|
//At this point the TSDA0 should contain the address of the data.
|
||||||
//Console.WriteLine("Address of packet: " + (string)(&body[0]));
|
Console.WriteLine("The Data pointed to: " + IOSpace.Read32(IOSpace.Read32(address)));
|
||||||
|
|
||||||
//Set the transmit status - which enables the transmit.
|
//Set the transmit status - which enables the transmit.
|
||||||
TransmitStatusDescriptor tsd = TransmitStatusDescriptor.Load(pciCard);
|
TransmitStatusDescriptor tsd = TransmitStatusDescriptor.Load(pciCard);
|
||||||
this.SetEarlyTxThreshold(1024);
|
tsd.Size = body.Length;
|
||||||
|
Console.WriteLine("Told NIC to send " + tsd.Size + " bytes.");
|
||||||
|
SetEarlyTxThreshold(1024);
|
||||||
Console.WriteLine("Sending...");
|
Console.WriteLine("Sending...");
|
||||||
tsd.ClearOWNBit();
|
tsd.ClearOWNBit();
|
||||||
TransmitStatusDescriptor.IncrementTSDescriptor();
|
TransmitStatusDescriptor.IncrementTSDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,25 @@ namespace Cosmos.Driver.RTL8139.Register
|
||||||
IOSpace.Write8(tdsAddress + offset, data);
|
IOSpace.Write8(tdsAddress + offset, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The total size in bytes of the data in the descriptor. Must not be longer then 1792 bytes (0x700h), this
|
||||||
|
/// will set Tx queue invalid.
|
||||||
|
/// </summary>
|
||||||
|
public int Size
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
byte offset = 0;
|
||||||
|
return (int)IOSpace.Read8(tds + offset);
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
//TODO: Check this - the register contains 12 bits. We only write 8 bits here.
|
||||||
|
byte offset = 0;
|
||||||
|
IOSpace.Write8(tds + offset, (byte)value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UInt32 TSD()
|
public UInt32 TSD()
|
||||||
{
|
{
|
||||||
return IOSpace.Read32(tdsAddress);
|
return IOSpace.Read32(tdsAddress);
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ namespace FrodeTest
|
||||||
//Test.SwitchTest.RunTest();
|
//Test.SwitchTest.RunTest();
|
||||||
Test.RTL8139Test.RunTest();
|
Test.RTL8139Test.RunTest();
|
||||||
//Test.BinaryHelperTest.RunTest();
|
//Test.BinaryHelperTest.RunTest();
|
||||||
Test.TransmitStatusDescriptorTest.RunTest();
|
//Test.TransmitStatusDescriptorTest.RunTest();
|
||||||
//Test.PacketHeaderTest.RunTest();
|
//Test.PacketHeaderTest.RunTest();
|
||||||
//Test.RAMBusTest.RunTest();
|
//Test.RAMBusTest.RunTest();
|
||||||
//Test.BoolTest.RunTest();
|
//Test.BoolTest.RunTest();
|
||||||
|
|
|
||||||
|
|
@ -30,14 +30,32 @@ namespace FrodeTest.Shell
|
||||||
nic.Enable();
|
nic.Enable();
|
||||||
Console.WriteLine("Enabled Network card");
|
Console.WriteLine("Enabled Network card");
|
||||||
}
|
}
|
||||||
else if (command.Equals("timer"))
|
else if (command.Equals("send"))
|
||||||
{
|
{
|
||||||
Console.WriteLine("NIC TimerCount: " + nic.TimerCount);
|
//Console.WriteLine("NIC TimerCount: " + nic.TimerCount);
|
||||||
|
//Cosmos.Hardware.PC.Bus.PCIDevice pciNic = Cosmos.Hardware.PC.Bus.PCIBus.GetPCIDevice(0, 3, 0);
|
||||||
|
Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0xFF);
|
||||||
|
byte[] data = FrodeTest.Test.Mock.FakeBroadcastPacket.GetFakePacketAllHigh();
|
||||||
|
Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data);
|
||||||
|
|
||||||
|
//nic = new Cosmos.Driver.RTL8139.RTL8139(pciNic);
|
||||||
|
if (nic == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Enable NIC with command nic first");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nic.Enable();
|
||||||
|
nic.EnableRecieve();
|
||||||
|
nic.EnableTransmit();
|
||||||
|
nic.Transmit(packet);
|
||||||
}
|
}
|
||||||
else if (command.Equals("reset"))
|
else if (command.Equals("reset"))
|
||||||
{
|
{
|
||||||
nic.TimerCount = 1;
|
//nic.TimerCount = 1;
|
||||||
Console.WriteLine("NIC TimerCount: " + nic.TimerCount);
|
nic.SoftReset();
|
||||||
|
nic.EnableTransmit();
|
||||||
|
nic.EnableRecieve();
|
||||||
|
Console.WriteLine("NIC reset");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Console.WriteLine("No such systemcommand or application: " + command);
|
Console.WriteLine("No such systemcommand or application: " + command);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ namespace FrodeTest.Test
|
||||||
|
|
||||||
//Console.WriteLine("PCI Command: " + pciNic.Command);
|
//Console.WriteLine("PCI Command: " + pciNic.Command);
|
||||||
//pciNic.EnableDevice();
|
//pciNic.EnableDevice();
|
||||||
Console.WriteLine("PCI Command: " + pciNic.Command);
|
//Console.WriteLine("PCI Command: " + pciNic.Command);
|
||||||
|
|
||||||
if (!pciNic.DeviceExists)
|
if (!pciNic.DeviceExists)
|
||||||
Console.WriteLine("Unable to find PCI device for Network card");
|
Console.WriteLine("Unable to find PCI device for Network card");
|
||||||
|
|
@ -31,18 +31,16 @@ namespace FrodeTest.Test
|
||||||
Console.WriteLine("BaseAddress1 is : " + pciNic.BaseAddress1);
|
Console.WriteLine("BaseAddress1 is : " + pciNic.BaseAddress1);
|
||||||
Console.WriteLine("Enabling card...");
|
Console.WriteLine("Enabling card...");
|
||||||
nic.Enable();
|
nic.Enable();
|
||||||
|
//nic.InitReceiveBuffer();
|
||||||
//nic.SoftReset();
|
|
||||||
nic.EnableRecieve();
|
nic.EnableRecieve();
|
||||||
nic.EnableTransmit();
|
nic.EnableTransmit();
|
||||||
Cosmos.Hardware.PC.Global.Sleep(50);
|
//Cosmos.Hardware.PC.Global.Sleep(50);
|
||||||
Console.WriteLine("Timer: " + nic.TimerCount);
|
//Console.WriteLine("Timer: " + nic.TimerCount);
|
||||||
|
|
||||||
Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0x77);
|
Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0x77);
|
||||||
byte[] data = Mock.FakeBroadcastPacket.GetFakePacket();
|
byte[] data = Mock.FakeBroadcastPacket.GetFakePacketAllHigh();
|
||||||
Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data);
|
Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data);
|
||||||
nic.Transmit(packet);
|
nic.Transmit(packet);
|
||||||
Console.WriteLine("Transmit called");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue