forked from M-Labs/artiq
runtime: get lwip to run
This commit is contained in:
parent
d5d49e73d2
commit
e4251c7f41
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user