Skip to content

Commit

Permalink
timer: atomic reads
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastien Bourdeauducq committed May 13, 2013
1 parent 9f81afb commit 581cf5b
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 82 deletions.
24 changes: 16 additions & 8 deletions milkymist/timer/__init__.py
Expand Up @@ -5,22 +5,30 @@

class Timer(Module, AutoCSR):
def __init__(self, width=32):
self._en = CSRStorage()
self._value = CSRStorage(width, write_from_dev=True)
self._load = CSRStorage(width)
self._reload = CSRStorage(width)
self._en = CSRStorage()
self._update_value = CSR()
self._value = CSRStatus(width)

self.submodules.ev = EventManager()
self.ev.zero = EventSourceProcess()
self.ev.finalize()

###

self.comb += [
If(self._value.storage == 0,
self._value.dat_w.eq(self._reload.storage)
value = Signal(width)
self.sync += [
If(self._en.storage,
If(value == 0,
# set reload to 0 to disable reloading
value.eq(self._reload.storage)
).Else(
value.eq(value - 1)
)
).Else(
self._value.dat_w.eq(self._value.storage - 1)
value.eq(self._load.storage)
),
self._value.we.eq(self._en.storage),
self.ev.zero.trigger.eq(self._value.storage != 0)
If(self._update_value.re, self._value.status.eq(value))
]
self.comb += self.ev.zero.trigger.eq(value != 0)
14 changes: 8 additions & 6 deletions software/bios/boot.c
Expand Up @@ -7,9 +7,9 @@
#include <sfl.h>
#include <string.h>
#include <irq.h>
#include <timer.h>

#include <hw/mem.h>
#include <hw/csr.h>

#include <net/microudp.h>
#include <net/tftp.h>
Expand All @@ -33,12 +33,13 @@ static int check_ack(void)
int recognized;
static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK;

timer_enable(0);
timer_set_reload(0);
timer_set_counter(get_system_frequency()/4);
timer_enable(1);
timer0_en_write(0);
timer0_reload_write(0);
timer0_load_write(identifier_frequency_read()/4);
timer0_en_write(1);
timer0_update_value_write(1);
recognized = 0;
while(timer_get()) {
while(timer0_value_read()) {
if(uart_read_nonblock()) {
char c;
c = uart_read();
Expand All @@ -53,6 +54,7 @@ static int check_ack(void)
recognized = 0;
}
}
timer0_update_value_write(1);
}
return 0;
}
Expand Down
14 changes: 8 additions & 6 deletions software/bios/main.c
Expand Up @@ -8,8 +8,8 @@
#include <irq.h>
#include <version.h>
#include <crc.h>
#include <timer.h>

#include <hw/csr.h>
#include <hw/mem.h>
#include <net/microudp.h>

Expand Down Expand Up @@ -459,11 +459,12 @@ static int test_user_abort(void)
printf("Q/ESC: abort boot\n");
printf("F7: boot from serial\n");
printf("F8: boot from network\n");
timer_enable(0);
timer_set_reload(0);
timer_set_counter(get_system_frequency()*2);
timer_enable(1);
while(timer_get()) {
timer0_en_write(0);
timer0_reload_write(0);
timer0_load_write(identifier_frequency_read()*2);
timer0_en_write(1);
timer0_update_value_write(1);
while(timer0_value_read()) {
if(readchar_nonblock()) {
c = readchar();
if((c == 'Q')||(c == '\e')) {
Expand All @@ -479,6 +480,7 @@ static int test_user_abort(void)
return 0;
}
}
timer0_update_value_write(1);
}
return 1;
}
Expand Down
19 changes: 0 additions & 19 deletions software/include/base/timer.h

This file was deleted.

2 changes: 1 addition & 1 deletion software/libbase/Makefile
@@ -1,7 +1,7 @@
M2DIR=../..
include $(M2DIR)/software/common.mak

OBJECTS=setjmp.o libc.o errno.o crc16.o crc32.o console.o timer.o system.o board.o uart.o vsnprintf.o strtod.o qsort.o
OBJECTS=setjmp.o libc.o errno.o crc16.o crc32.o console.o system.o board.o uart.o vsnprintf.o strtod.o qsort.o

all: libbase.a

Expand Down
3 changes: 1 addition & 2 deletions software/libbase/board.c
Expand Up @@ -3,7 +3,6 @@
#include <stdlib.h>
#include <string.h>
#include <version.h>
#include <timer.h>
#include <board.h>

static const struct board_desc boards[1] = {
Expand Down Expand Up @@ -88,7 +87,7 @@ void board_init(void)
}
rev = get_pcb_revision();
get_soc_version_formatted(soc_version);
printf("Detected SoC %s at %dMHz on %s (PCB revision %d)\n", soc_version, get_system_frequency()/1000000,
printf("Detected SoC %s at %dMHz on %s (PCB revision %d)\n", soc_version, identifier_frequency_read()/1000000,
brd_desc->name, rev);
if(strcmp(soc_version, VERSION) != 0)
printf("SoC and BIOS versions do not match!\n");
Expand Down
37 changes: 0 additions & 37 deletions software/libbase/timer.c

This file was deleted.

11 changes: 10 additions & 1 deletion software/libnet/microudp.c
@@ -1,7 +1,6 @@
#include <stdio.h>
#include <system.h>
#include <crc.h>
#include <timer.h>
#include <hw/csr.h>
#include <hw/flags.h>
#include <hw/mem.h>
Expand Down Expand Up @@ -388,6 +387,16 @@ void microudp_service(void)
}
}

static void busy_wait(unsigned int ds)
{
timer0_en_write(0);
timer0_reload_write(0);
timer0_load_write(identifier_frequency_read()/10*ds);
timer0_en_write(1);
timer0_update_value_write(1);
while(timer0_value_read()) timer0_update_value_write(1);
}

void ethreset(void)
{
minimac_phy_reset_write(0);
Expand Down
10 changes: 8 additions & 2 deletions software/videomixer/time.c
Expand Up @@ -4,15 +4,21 @@

void time_init(void)
{
timer0_reload_write(2*identifier_frequency_read());
int t;

timer0_en_write(0);
t = 2*identifier_frequency_read();
timer0_reload_write(t);
timer0_load_write(t);
timer0_en_write(1);
}

int elapsed(int *last_event, int period)
{
int t, dt;

t = timer0_reload_read() - timer0_value_read(); // TODO: atomic read
timer0_update_value_write(1);
t = timer0_reload_read() - timer0_value_read();
dt = t - *last_event;
if(dt < 0)
dt += timer0_reload_read();
Expand Down

0 comments on commit 581cf5b

Please sign in to comment.