#include "soc-hw.h" uart_t *uart0 = (uart_t *) 0xF0000000; timer_t *timer0 = (timer_t *) 0xF0010000; gpio_t *gpio0 = (gpio_t *) 0xF0020000; uint32_t msec = 0; /*************************************************************************** * General utility functions */ void sleep(int msec) { uint32_t tcr; // Use timer0.1 timer0->compare1 = (FCPU/1000)*msec; timer0->counter1 = 0; timer0->tcr1 = TIMER_EN | TIMER_IRQEN; do { //halt(); tcr = timer0->tcr1; } while ( ! (tcr & TIMER_TRIG) ); } void tic_init() { // Setup timer0.0 timer0->compare0 = (FCPU/1000); timer0->counter0 = 0; timer0->tcr0 = TIMER_EN | TIMER_AR | TIMER_IRQEN; } /*************************************************************************** * UART Functions */ void uart_init() { //uart0->ier = 0x00; // Interrupt Enable Register //uart0->lcr = 0x03; // Line Control Register: 8N1 //uart0->mcr = 0x00; // Modem Control Register // Setup Divisor register (Fclk / Baud) //uart0->div = (FCPU/(57600*16)); } char uart_getchar() { while (! (uart0->ucr & UART_DR)) ; return uart0->rxtx; } void uart_putchar(char c) { while (uart0->ucr & UART_BUSY) ; uart0->rxtx = c; } void uart_putstr(char *str) { char *c = str; while(*c) { uart_putchar(*c); c++; } } void hexprint(unsigned int hexval) { int digit[8], pos; uart_putstr("0x"); for(pos = 0; pos < 8; pos++) { digit[pos] = (hexval & 0xF); /* last hexit */ hexval = hexval >> 4; } for(pos = 7; pos > -1; pos--) { if(digit[pos] < 0xA) uart_putstr((char *)digit[pos] + '0'); else uart_putstr((char *)digit[pos] + 'A' - 10); } uart_putchar(' '); }