#define U0THR (*((volatile unsigned char *) 0xE000C000)) /* UART0 transmitter holding register */
#define U0LSR (*((volatile unsigned char *) 0xE000C014)) /* UART0 line status register */
#define U0THRE ((U0LSR & (1<<5))) /* UART0 transmitter holding register is empty */

#define IO0DIR (*((volatile unsigned long *) 0xE0028008))
/* Legacy register to switch GPIO ports between input and output */

#define IO0SET (*((volatile unsigned long *) 0xE0028004))
/* Legacy register to put high level on GPIO port */
#define IO0CLR (*((volatile unsigned long *) 0xE002800C))
/* Legacy register to put low level on GPIO port */

#define LED_R (1<<19)
#define LED_G (1<<21)
#define LED_B (1<<20)

void rgb_on(unsigned long color) {
	IO0CLR |= color;
}

void rgb_off(unsigned long color) {
	IO0SET |= color;
}

void rgb_init() {
	IO0DIR |= LED_R|LED_G|LED_B;
}

void putch(char c) {
	while (!U0THRE);
	U0THR = c;
}

void putstr(char *s) {
	while (*s) putch(*s++);
}

void pause() {
	int i = 0;
	volatile int k = 0;
	while (i++ < 1500000) k=1;
}

int main(int  argc, char *argv[]) {

	putstr("Initializing RGB led...\n");
	rgb_init();
	rgb_off(LED_R|LED_G|LED_B);
	
	putstr("Starting the loop...\n");
	while (1) {
		rgb_on(LED_R);
		pause();
		rgb_on(LED_G);
		pause();
		rgb_off(LED_R);
		pause();
		rgb_on(LED_B);
		pause();
		rgb_off(LED_G);
		pause();
		rgb_on(LED_R);
		pause();
		rgb_on(LED_B|LED_G);
		pause();
		rgb_off(LED_R|LED_G|LED_B);
		pause();
	}

	return 0;
}

