blob: dcb21180ddf68ca84f2142c1742f5bd0a4940afb [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include <stdint.h>
#define CLK_FIXED_FREQ_HZ (50ULL * 1000 * 1000)
/**
* Delay loop executing within 8 cycles on ibex
*/
static void delay_loop_ibex(unsigned long loops) {
int out; /* only to notify compiler of modifications to |loops| */
asm volatile(
"1: nop \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" nop \n" // 1 cycle
" addi %1, %1, -1 \n" // 1 cycle
" bnez %1, 1b \n" // 3 cycles
: "=&r" (out)
: "0" (loops)
);
}
static int usleep_ibex(unsigned long usec) {
unsigned long usec_cycles;
usec_cycles = CLK_FIXED_FREQ_HZ * usec / 1000 / 1000 / 8;
delay_loop_ibex(usec_cycles);
return 0;
}
static int usleep(unsigned long usec) {
return usleep_ibex(usec);
}
int main(int argc, char **argv) {
// Any data written to the stack segment will connect the lowest four bits to
// the board leds
volatile uint32_t *var = (volatile uint32_t *) 0x0000c010;
*var = 0xa;
while (1) {
usleep(1000 * 1000); // 1000 ms
*var = ~(*var);
}
}