diff options
Diffstat (limited to 'software')
| -rw-r--r-- | software/demo_gpio/demo_gpio.c | 49 | 
1 files changed, 25 insertions, 24 deletions
| diff --git a/software/demo_gpio/demo_gpio.c b/software/demo_gpio/demo_gpio.c index f568ae8..dec91b5 100644 --- a/software/demo_gpio/demo_gpio.c +++ b/software/demo_gpio/demo_gpio.c @@ -49,26 +49,26 @@ void handle_m_ext_interrupt(){  void handle_m_time_interrupt(){    clear_csr(mie, MIP_MTIP); -   +    // Reset the timer for 3s in the future.    // This also clears the existing timer interrupt. -   +    volatile uint64_t * mtime       = (uint64_t*) (CLINT_BASE_ADDR + CLINT_MTIME);    volatile uint64_t * mtimecmp    = (uint64_t*) (CLINT_BASE_ADDR + CLINT_MTIMECMP);    uint64_t now = *mtime;    uint64_t then = now + 1.5 * RTC_FREQUENCY;    *mtimecmp = then; -  +    // read the current value of the LEDS and invert them.    uint32_t leds = *g_output_vals; -   +    *g_output_vals ^= ((0x1 << RED_LED_OFFSET)   |  		     (0x1 << GREEN_LED_OFFSET) |  		     (0x1 << BLUE_LED_OFFSET)); -   +    // Re-enable the timer interrupt.    set_csr(mie, MIP_MTIP); -   +  } @@ -105,18 +105,18 @@ Every 1.5 second, the Timer Interrupt will invert the LEDs.\n\   ";  void print_instructions() { -   +    write (STDOUT_FILENO, instructions_msg, strlen(instructions_msg)); -   +  } +#ifdef HAS_BOARD_BUTTONS  void button_0_handler(void) {    // Red LED on    * g_output_vals |= (0x1 << RED_LED_OFFSET); -		      -  // Clear the GPIO Pending interrupt by writing 1. +  // Clear the GPIO Pending interrupt by writing 1.    GPIO_REG(GPIO_RISE_IP) = (0x1 << BUTTON_0_OFFSET);  }; @@ -126,25 +126,26 @@ void button_1_handler(void) {    // Green LED On    * g_output_vals |= (1 << GREEN_LED_OFFSET); +  // Clear the GPIO Pending interrupt by writing 1.    GPIO_REG(GPIO_RISE_IP) = (0x1 << BUTTON_1_OFFSET); -   +  }; -  +  void button_2_handler(void) {    // Blue LED On    * g_output_vals |= (1 << BLUE_LED_OFFSET);    GPIO_REG(GPIO_RISE_IP) = (0x1 << BUTTON_2_OFFSET); -   -}; +}; +#endif  void reset_demo (){ -    // Disable the machine & timer interrupts until setup is done. -   +  // Disable the machine & timer interrupts until setup is done. +    clear_csr(mie, MIP_MEIP);    clear_csr(mie, MIP_MTIP); @@ -157,7 +158,7 @@ void reset_demo (){    g_ext_interrupt_handlers[INT_DEVICE_BUTTON_1] = button_1_handler;    g_ext_interrupt_handlers[INT_DEVICE_BUTTON_2] = button_2_handler;  #endif -   +    print_instructions();  #ifdef HAS_BOARD_BUTTONS @@ -172,13 +173,13 @@ void reset_demo (){    PLIC_set_priority(&g_plic, INT_DEVICE_BUTTON_0, 1);    PLIC_set_priority(&g_plic, INT_DEVICE_BUTTON_1, 1);    PLIC_set_priority(&g_plic, INT_DEVICE_BUTTON_2, 1); -   +    GPIO_REG(GPIO_RISE_IE) |= (1 << BUTTON_0_OFFSET);    GPIO_REG(GPIO_RISE_IE) |= (1 << BUTTON_1_OFFSET);    GPIO_REG(GPIO_RISE_IE) |= (1 << BUTTON_2_OFFSET); -   +  #endif -   +      // Set the machine timer to go off in 3 seconds.      // The      volatile uint64_t * mtime       = (uint64_t*) (CLINT_BASE_ADDR + CLINT_MTIME); @@ -186,13 +187,13 @@ void reset_demo (){      uint64_t now = *mtime;      uint64_t then = now + 1.5*RTC_FREQUENCY;      *mtimecmp = then; -     +      // Enable the Machine-External bit in MIE      set_csr(mie, MIP_MEIP);      // Enable the Machine-Timer bit in MIE      set_csr(mie, MIP_MTIP); -     +      // Enable interrupts in general.      set_csr(mstatus, MSTATUS_MIE);  } @@ -207,7 +208,7 @@ int main(int argc, char **argv)    * g_pullup_en  &= ~((0x1 << BUTTON_0_OFFSET) | (0x1 << BUTTON_1_OFFSET) | (0x1 << BUTTON_2_OFFSET));    * g_input_en   |=  ((0x1 << BUTTON_0_OFFSET) | (0x1 << BUTTON_1_OFFSET) | (0x1 << BUTTON_2_OFFSET));  #endif -   +    * g_input_en    &= ~((0x1<< RED_LED_OFFSET) | (0x1<< GREEN_LED_OFFSET) | (0x1 << BLUE_LED_OFFSET)) ;    * g_output_en   |=  ((0x1<< RED_LED_OFFSET)| (0x1<< GREEN_LED_OFFSET) | (0x1 << BLUE_LED_OFFSET)) ;    * g_output_vals |=   (0x1 << BLUE_LED_OFFSET) ; @@ -215,7 +216,7 @@ int main(int argc, char **argv)    /**************************************************************************     * Set up the PLIC -   *  +   *     *************************************************************************/    PLIC_init(&g_plic,  	    PLIC_BASE_ADDR, | 
