Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
yhzhang0128 committed Apr 16, 2022
1 parent d46b105 commit 0564158
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 66 deletions.
4 changes: 3 additions & 1 deletion apps/user/cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ int main(int argc, char** argv) {
return 0;
}

/* Get the inode number of the new working directory */
strcat(argv[1], "/");
int dir_ino = dir_lookup(grass->workdir_ino, argv[1]);
if (dir_ino == -1) {
INFO("cd: directory %s not found", argv[1]);
return -1;
}

grass->workdir_ino = dir_ino;

/* Get the path name of the new working directory */
if (!strcmp(".", argv[1])) return 0;

int len = strlen(grass->workdir);
Expand Down
4 changes: 1 addition & 3 deletions apps/user/echo.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
#include "app.h"

int main(int argc, char** argv) {
for (int i = 1; i < argc; i++)
printf("%s ", argv[i]);

for (int i = 1; i < argc; i++) printf("%s ", argv[i]);
printf("\r\n");
return 0;
}
22 changes: 15 additions & 7 deletions earth/bus_gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,24 @@
* see chapter17 of the SiFive FE310-G002 Manual
*/

#include "egos.h"

#define GPIO0_BASE 0x10012000UL
#define GPIO0_IOF_ENABLE 56UL
#define GPIO0_IOF_SELECT 60UL

#define GPIO_REG(offset) (GPIO0_BASE + offset)
#define GPIO_REGW(offset) (ACCESS((unsigned int*)GPIO_REG(offset)))
/*
#define LED0_RED 1
#define LED0_GREEN 2
#define LED0_BLUE 3
/* #define LED0_RED 1 */
/* #define LED0_GREEN 2 */
/* #define LED0_BLUE 3 */
static void led_on(int led) {
REGW(GPIO0_BASE, GPIO0_IOF_ENABLE) |= (1 << led);
REGW(GPIO0_BASE, GPIO0_IOF_SELECT) |= (1 << led);
}
/* #define LED_ON(x) GPIO_REGW(GPIO0_IOF_ENABLE) |= (1 << x); GPIO_REGW(GPIO0_IOF_SELECT) |= (1 << x); */
/* #define LED_OFF(x) GPIO_REGW(GPIO0_IOF_ENABLE) &= ~(1 << x); GPIO_REGW(GPIO0_IOF_SELECT) &= ~(1 << x); */
static void led_off(int led) {
REGW(GPIO0_BASE, GPIO0_IOF_ENABLE) &= ~(1 << led);
REGW(GPIO0_BASE, GPIO0_IOF_SELECT) &= ~(1 << led);
}
*/
18 changes: 7 additions & 11 deletions earth/bus_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,21 @@
#define UART0_RXCTRL 12UL
#define UART0_DIV 24UL

#define ACCESS(x) (*(__typeof__(*x) volatile *)(x))
#define UART_REG(offset) (UART0_BASE + offset)
#define UART_REGW(offset) (ACCESS((unsigned int*)UART_REG(offset)))

void uart_init(long baud_rate) {
UART_REGW(UART0_DIV) = CPU_CLOCK_RATE / baud_rate - 1;
UART_REGW(UART0_TXCTRL) |= 1;
UART_REGW(UART0_RXCTRL) |= 1;
REGW(UART0_BASE, UART0_DIV) = CPU_CLOCK_RATE / baud_rate - 1;
REGW(UART0_BASE, UART0_TXCTRL) |= 1;
REGW(UART0_BASE, UART0_RXCTRL) |= 1;

/* UART0 send/recv are mapped to GPIO pin16 and pin17 */
GPIO_REGW(GPIO0_IOF_ENABLE) |= (1 << 16) | (1 << 17);
REGW(GPIO0_BASE, GPIO0_IOF_ENABLE) |= (1 << 16) | (1 << 17);
}

int uart_getc(int* c) {
int ch = UART_REGW(UART0_RXDATA);
int ch = REGW(UART0_BASE, UART0_RXDATA);
return *c = (ch & (1 << 31))? -1 : (ch & 0xFF);
}

void uart_putc(int c) {
while ((UART_REGW(UART0_TXDATA) & (1 << 31)));
UART_REGW(UART0_TXDATA) = c;
while ((REGW(UART0_BASE, UART0_TXDATA) & (1 << 31)));
REGW(UART0_BASE, UART0_TXDATA) = c;
}
5 changes: 0 additions & 5 deletions earth/sd/sd.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,3 @@ char send_data_byte(char);
#define SPI1_TXDATA 72UL
#define SPI1_RXDATA 76UL
#define SPI1_FCTRL 96UL

#define ACCESS(x) (*(__typeof__(*x) volatile *)(x))
#define SPI_REG(offset) (SPI1_BASE + offset)
#define SPI_REGW(offset) (ACCESS((unsigned int*)SPI_REG(offset)))
#define SPI_REGB(offset) (ACCESS((unsigned char*)SPI_REG(offset)))
36 changes: 18 additions & 18 deletions earth/sd/sd_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,16 @@ static void sd_spi_reset() {
INFO("Set CS and MOSI to 1 and toggle clock.");

/* Keep chip select line high */
SPI_REGW(SPI1_CSMODE) &= ~3;
SPI_REGW(SPI1_CSMODE) |= 2;
REGW(SPI1_BASE, SPI1_CSMODE) &= ~3;
REGW(SPI1_BASE, SPI1_CSMODE) |= 2;

unsigned long i, rxdata;
for (i = 0; i < 1000; i++) send_data_byte(0xFF);

/* Keep chip select line low */
SPI_REGW(SPI1_CSDEF) = 1;
SPI_REGW(SPI1_CSMODE) &= ~3;
SPI_REGW(SPI1_CSMODE) |= 2;
REGW(SPI1_BASE, SPI1_CSDEF) = 1;
REGW(SPI1_BASE, SPI1_CSMODE) &= ~3;
REGW(SPI1_BASE, SPI1_CSMODE) |= 2;
for (i = 0; i < 200000; i++);

INFO("Set CS to 0 and send cmd0 through MOSI.");
Expand All @@ -119,41 +119,41 @@ static void sd_spi_reset() {

static void sd_spi_config() {
/* Set protocol as SPI_SINGLE */
SPI_REGW(SPI1_FMT) &= ~3;
REGW(SPI1_BASE, SPI1_FMT) &= ~3;

/* Set phase as 0*/
SPI_REGW(SPI1_SCKMODE) &= ~1;
REGW(SPI1_BASE, SPI1_SCKMODE) &= ~1;

/* Set polarity as 0 */
SPI_REGW(SPI1_SCKMODE) &= ~2;
REGW(SPI1_BASE, SPI1_SCKMODE) &= ~2;

/* Set endianness as 0 */
SPI_REGW(SPI1_FMT) &= ~4;
REGW(SPI1_BASE, SPI1_FMT) &= ~4;

/* Always populate receive FIFO */
SPI_REGW(SPI1_FMT) &= ~8;
REGW(SPI1_BASE, SPI1_FMT) &= ~8;

/* Set CS active-high as 0 */
SPI_REGW(SPI1_CSDEF) = 0;
REGW(SPI1_BASE, SPI1_CSDEF) = 0;

/* Set frame length */
if ((SPI_REGW(SPI1_FMT) & 0xF0000) != 0x80000) {
SPI_REGW(SPI1_FMT) &= ~0xF0000;
SPI_REGW(SPI1_FMT) |= 0x80000;
if ((REGW(SPI1_BASE, SPI1_FMT) & 0xF0000) != 0x80000) {
REGW(SPI1_BASE, SPI1_FMT) &= ~0xF0000;
REGW(SPI1_BASE, SPI1_FMT) |= 0x80000;
}

/* Set CS line */
SPI_REGW(SPI1_CSID) = 0;
REGW(SPI1_BASE, SPI1_CSID) = 0;

/* Toggle off memory-mapped SPI flash mode;
* toggle on programmable IO mode */
SPI_REGW(SPI1_FCTRL) = 0;
REGW(SPI1_BASE, SPI1_FCTRL) = 0;
}

static void sd_spi_set_clock(long baud_rate) {
long div = (CPU_CLOCK_RATE / (2 * baud_rate)) - 1;
if (div > 0xFFF) FATAL("SPI baud rate too low");

SPI_REGW(SPI1_SCKDIV) &= ~0xFFF;
SPI_REGW(SPI1_SCKDIV) |= (div & 0xFFF);
REGW(SPI1_BASE, SPI1_SCKDIV) &= ~0xFFF;
REGW(SPI1_BASE, SPI1_SCKDIV) |= (div & 0xFFF);
}
12 changes: 5 additions & 7 deletions earth/sd/sd_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
#include "sd.h"

char send_data_byte(char byte) {
while (SPI_REGW(SPI1_TXDATA) & (1 << 31));
SPI_REGB(SPI1_TXDATA) = byte;
while (REGW(SPI1_BASE, SPI1_TXDATA) & (1 << 31));
REGB(SPI1_BASE, SPI1_TXDATA) = byte;

long rxdata;
while ((rxdata = SPI_REGW(SPI1_RXDATA)) & (1 << 31));
while ((rxdata = REGW(SPI1_BASE, SPI1_RXDATA)) & (1 << 31));
return (char)(rxdata & 0xFF);
}

Expand All @@ -23,12 +23,10 @@ inline char recv_data_byte() {
}

char sd_exec_cmd(char* cmd) {
for (int i = 0; i < 6; i++)
send_data_byte(cmd[i]);
for (int i = 0; i < 6; i++) send_data_byte(cmd[i]);

for (int reply, i = 0; i < 8000; i++)
if ((reply = recv_data_byte()) != 0xFF)
return reply;
if ((reply = recv_data_byte()) != 0xFF) return reply;

FATAL("SD card not responding cmd%d", cmd[0] ^ 0x40);
}
Expand Down
22 changes: 8 additions & 14 deletions grass/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,23 @@
#define QUANTUM_NCYCLES 5000
#define CLINT0_MTIME 0x200bff8
#define CLINT0_MTIMECMP 0x2004000
#define ACCESS(x) (*(__typeof__(*(unsigned int*)x) volatile *)((unsigned int*)(x)))

static long long mtime_get() {
unsigned int time_lo, time_hi;
/* Guard against rollover when reading mtime */
do {
time_hi = ACCESS(CLINT0_MTIME + 4);
time_lo = ACCESS(CLINT0_MTIME);
} while (ACCESS(CLINT0_MTIME + 4) != time_hi);
time_hi = REGW(CLINT0_MTIME, 4);
time_lo = REGW(CLINT0_MTIME, 0);
} while (REGW(CLINT0_MTIME, 4) != time_hi);

return (((unsigned long long)time_hi) << 32) | time_lo;
}

static void mtimecmp_set(long long time) {
ACCESS(CLINT0_MTIMECMP + 4) = 0xFFFFFFFF;
ACCESS(CLINT0_MTIMECMP) = (unsigned int)time;
ACCESS(CLINT0_MTIMECMP + 4) = (unsigned int)(time >> 32);
REGW(CLINT0_MTIMECMP, 4) = 0xFFFFFFFF;
REGW(CLINT0_MTIMECMP, 0) = (unsigned int)time;
REGW(CLINT0_MTIMECMP, 4) = (unsigned int)(time >> 32);
}

void timer_init() {
mtimecmp_set(0);
}

void timer_reset() {
mtimecmp_set(mtime_get() + QUANTUM_NCYCLES);
}
void timer_init() { mtimecmp_set(0); }
void timer_reset() { mtimecmp_set(mtime_get() + QUANTUM_NCYCLES); }
5 changes: 5 additions & 0 deletions library/egos.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,8 @@ extern struct grass *grass;
#define GRASS_ENTRY 0x08003000 /* 8KB grass code+data */
/* 12KB earth data */
/* earth code is in QSPI flash */

/* memory-mapped I/O register access macros */
#define ACCESS(x) (*(__typeof__(*x) volatile *)(x))
#define REGW(base, offset) (ACCESS((unsigned int*)(base + offset)))
#define REGB(base, offset) (ACCESS((unsigned char*)(base + offset)))

0 comments on commit 0564158

Please sign in to comment.