summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-25 12:43:03 +0200
committerMiguel <m.i@gmx.at>2018-09-25 12:43:03 +0200
commit112ca29a3bb2ab38693943ed33ee51f4fd7d2d81 (patch)
treec843051f9291ebe2de6e603c45d924d843d35ea4 /driver
parent2ba77c01a33c3454aeed42d5394dd5ccede10851 (diff)
arp replies working!
Diffstat (limited to 'driver')
-rw-r--r--driver/e1000.c25
-rw-r--r--driver/e1000.h3
-rw-r--r--driver/keyboard.c28
3 files changed, 23 insertions, 33 deletions
diff --git a/driver/e1000.c b/driver/e1000.c
index 35e106e..4c6b8de 100644
--- a/driver/e1000.c
+++ b/driver/e1000.c
@@ -5,9 +5,14 @@
//registers etc. verified from pdf at https://pdos.csail.mit.edu/6.828/2006/readings/hardware/8254x_GBe_SDM.pdf
#include <stdint.h>
+
#include "log.h"
#include "e1000.h"
#include "kmalloc.h"
+#include "netdev.h"
+#include "arp.h"
+
+#include "lib/string/string.h"
#define REG_CTRL 0x0000 // device control R/W
#define REG_CTRL_LRST 1<<3 // Link Reset / transition to 0 to initiates auto-negotiation
@@ -130,6 +135,10 @@
#define E1000_NUM_RX_DESC 32
#define E1000_NUM_TX_DESC 8
+// TODO: move all global stuff to some struct so we can run multiple e1000 cards!
+//
+struct netdev dev; ///TODO not global!
+
struct e1000_rx_desc {
volatile uint32_t addr_lo; // 4
volatile uint32_t addr_hi; // 4
@@ -413,6 +422,7 @@ void e1000_handleReceive()
uint16_t len = rx_descs[rx_cur]->length;
// Here you should inject the received packet into your network stack
+ arp_incoming(&dev,buf);
rx_descs[rx_cur]->status = 0;
old_cur = rx_cur;
@@ -472,8 +482,11 @@ void e1000_linkdown()
}
-bool e1000_init(uint32_t base)
+struct netdev e1000_init(uint32_t base)
{
+ dev.ip=0;
+ dev.hwaddr[0]=dev.hwaddr[1]=dev.hwaddr[2]=dev.hwaddr[3]=dev.hwaddr[4]=dev.hwaddr[5]=0;
+
klog("init E1000");
klog("interrupt mask: 0x%08X",readCommand(REG_IMS));
klog("device status: 0x%08X",readCommand(REG_STATUS));
@@ -485,10 +498,14 @@ bool e1000_init(uint32_t base)
if(base!=0){ mem_base=base;}
detectEEProm();
- if (! readMACAddress()) return false;
+ if (! readMACAddress()) return dev;
klog("mac : %02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],mac[6]);
+ memcpy(dev.hwaddr,mac,6); // use mac obtained from device
+ dev.ip=(192<<0)+(168<<8)+(0<<16)+(20<<24); // 192.168.0.20 // TODO: not hardcode!
+ dev.transmit=e1000_sendPacket;
+
// clear multicast table
for(int i = 0; i < 0x80; i++)writeCommand(REG_MTA + i*4, 0);
@@ -498,10 +515,10 @@ bool e1000_init(uint32_t base)
txinit();
rxinit();
-
+
klog("E1000 initialized");
- return true;
+ return dev;
}
void e1000_irq (int irq)
{
diff --git a/driver/e1000.h b/driver/e1000.h
index ba7db7d..27a052e 100644
--- a/driver/e1000.h
+++ b/driver/e1000.h
@@ -1,5 +1,6 @@
#include <stdint.h>
-bool e1000_init(uint32_t base);
+#include "netdev.h"
+struct netdev e1000_init(uint32_t base);
int e1000_sendPacket(const void * p_data, uint16_t p_len);
void e1000_irq (int irq);
void e1000_linkup();
diff --git a/driver/keyboard.c b/driver/keyboard.c
index d6ce465..d201882 100644
--- a/driver/keyboard.c
+++ b/driver/keyboard.c
@@ -23,34 +23,6 @@ int hex_to_dec(char c)
}
static void put(uint8_t c)
{
- /*
-0000 8a b1 aa 7e 4d 00 52 54 00 12 34 56 08 00 45 00
-0010 00 54 1e c0 00 00 40 01 da 1f c0 a8 00 14 c0 a8
-0020 00 65 00 00 ce 07 1f 02 03 b0 bf 79 a9 5b 00 00
-0030 00 00 df 9d 08 00 00 00 00 00 10 11 12 13 14 15
-0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25
-0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35
-0060 36 37
-*/
-
- static char data_raw[]="8ab1aa7e4d005254001234560800450000541ec000004001da1fc0a80014c0a800650000ce071f0203b0bf79a95b00000000df9d080000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637";
- static uint8_t data[256];//=kballoc(1);
- int i=0;
-
- while(data_raw[i]!=0)
- {
- uint8_t val=hex_to_dec(data_raw[i])*16+hex_to_dec(data_raw[i+1]);
- data[i/2]=val;
- i+=2;
- }
-
-
- if(c=='p')e1000_sendPacket(data,i/2); // packet
-// if(c=='s')e1000_init(0); // start
- // if(c=='i')e1000_irq(11); // interrupt
- // if(c=='u')e1000_linkup(); // up
- //if(c=='d')e1000_linkdown(); // down
-
syscall_generic(SYSCALL_WRITE,kb_stream, (char *)&c , 1, 0);
}