runtime: get lwip to run

This commit is contained in:
Sebastien Bourdeauducq 2015-04-22 15:01:32 +08:00
parent d5d49e73d2
commit e4251c7f41
6 changed files with 88 additions and 6 deletions

View File

@ -9,7 +9,7 @@ from misoclib.soc import mem_decoder
class KernelCPU(Module): class KernelCPU(Module):
def __init__(self, platform, lasmim, def __init__(self, platform, lasmim,
exec_address=0x40020000, exec_address=0x40400000,
main_mem_origin=0x40000000, main_mem_origin=0x40000000,
l2_size=8192): l2_size=8192):
self._reset = CSRStorage(reset=1) self._reset = CSRStorage(reset=1)

View File

@ -20,6 +20,8 @@ $(error failed to determine UP/AMP build)
endif endif
endif endif
CFLAGS += -Ilwip/src/include -Iliblwip
all: runtime.bin runtime.fbi all: runtime.bin runtime.fbi
# pull in dependency info for *existing* .o files # pull in dependency info for *existing* .o files

View File

@ -1,8 +1,8 @@
#ifndef __KLOADER_H #ifndef __KLOADER_H
#define __KLOADER_H #define __KLOADER_H
#define KERNELCPU_EXEC_ADDRESS 0x40020000 #define KERNELCPU_EXEC_ADDRESS 0x40400000
#define KERNELCPU_PAYLOAD_ADDRESS 0x40024000 #define KERNELCPU_PAYLOAD_ADDRESS 0x40404000
typedef void (*kernel_function)(void); typedef void (*kernel_function)(void);

View File

@ -3,11 +3,11 @@ ENTRY(_start)
INCLUDE generated/regions.ld INCLUDE generated/regions.ld
/* First 128K of main memory are reserved for runtime code/data /* First 4M of main memory are reserved for runtime code/data
* then comes kernel memory. First 16K of kernel memory are for support code. * then comes kernel memory. First 16K of kernel memory are for support code.
*/ */
MEMORY { MEMORY {
ksupport : ORIGIN = 0x40020000, LENGTH = 0x4000 ksupport : ORIGIN = 0x40400000, LENGTH = 0x4000
} }
/* On AMP systems, kernel stack is at the end of main RAM, /* On AMP systems, kernel stack is at the end of main RAM,

View File

@ -7,7 +7,7 @@ INCLUDE generated/regions.ld
* ld does not allow this expression here. * ld does not allow this expression here.
*/ */
MEMORY { MEMORY {
runtime : ORIGIN = 0x40000000, LENGTH = 0x20000 /* 128K */ runtime : ORIGIN = 0x40000000, LENGTH = 0x400000 /* 4M */
} }
/* Kernel memory space start right after the runtime, /* Kernel memory space start right after the runtime,

View File

@ -6,10 +6,66 @@
#include <system.h> #include <system.h>
#include <time.h> #include <time.h>
#include <generated/csr.h> #include <generated/csr.h>
#include <hw/flags.h>
#ifdef CSR_ETHMAC_BASE
#include <netif/etharp.h>
#include <netif/liteethif.h>
#include <lwip/init.h>
#include <lwip/memp.h>
#include <lwip/ip4_addr.h>
#include <lwip/ip4.h>
#include <lwip/netif.h>
#include <lwip/sys.h>
#include <lwip/tcp.h>
#include <lwip/timers.h>
#endif
#include "test_mode.h" #include "test_mode.h"
#include "session.h" #include "session.h"
#ifdef CSR_ETHMAC_BASE
unsigned char macadr[6] = {0x10, 0xe2, 0xd5, 0x00, 0x00, 0x00};
u32_t clock_ms;
static void clock_init(void)
{
timer0_en_write(0);
timer0_load_write(0xffffffff);
timer0_reload_write(0xffffffff);
timer0_en_write(1);
clock_ms = 0;
}
u32_t sys_now(void)
{
unsigned int freq;
unsigned int prescaler;
freq = identifier_frequency_read();
prescaler = freq/1000; /* sys_now expect time in ms */
timer0_update_value_write(1);
clock_ms += (0xffffffff - timer0_value_read())/prescaler;
/* Reset timer to avoid rollover, this will increase clock_ms
drift but we don't need precision */
timer0_en_write(0);
timer0_en_write(1);
return clock_ms;
}
static struct netif netif;
static void lwip_service(void)
{
sys_check_timeouts();
if(ethmac_sram_writer_ev_pending_read() & ETHMAC_EV_SRAM_WRITER) {
liteeth_input(&netif);
ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
}
}
#endif
void comm_service(void) void comm_service(void)
{ {
char *txdata; char *txdata;
@ -18,6 +74,10 @@ void comm_service(void)
static int rxpending; static int rxpending;
int r, i; int r, i;
#ifdef CSR_ETHMAC_BASE
lwip_service();
#endif
if(!rxpending && uart_read_nonblock()) { if(!rxpending && uart_read_nonblock()) {
rxdata = uart_read(); rxdata = uart_read();
rxpending = 1; rxpending = 1;
@ -38,6 +98,26 @@ void comm_service(void)
static void regular_main(void) static void regular_main(void)
{ {
#ifdef CSR_ETHMAC_BASE
struct ip4_addr local_ip;
struct ip4_addr netmask;
struct ip4_addr gateway_ip;
time_init();
clock_init();
IP4_ADDR(&local_ip, 192, 168, 0, 42);
IP4_ADDR(&netmask, 255, 255, 255, 0);
IP4_ADDR(&gateway_ip, 192, 168, 0, 1);
lwip_init();
netif_add(&netif, &local_ip, &netmask, &gateway_ip, 0, liteeth_init, ethernet_input);
netif_set_default(&netif);
netif_set_up(&netif);
netif_set_link_up(&netif);
#endif
session_start(); session_start();
while(1) while(1)
comm_service(); comm_service();