diff options
| author | Miguel <m.i@gmx.at> | 2018-09-25 12:43:03 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-25 12:43:03 +0200 |
| commit | 112ca29a3bb2ab38693943ed33ee51f4fd7d2d81 (patch) | |
| tree | c843051f9291ebe2de6e603c45d924d843d35ea4 /driver | |
| parent | 2ba77c01a33c3454aeed42d5394dd5ccede10851 (diff) | |
arp replies working!
Diffstat (limited to 'driver')
| -rw-r--r-- | driver/e1000.c | 25 | ||||
| -rw-r--r-- | driver/e1000.h | 3 | ||||
| -rw-r--r-- | driver/keyboard.c | 28 |
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); } |
