#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <asm/types.h>
#include <unistd.h>
//#include <asm/io.h>
#include <sys/io.h>

#define LP_BASE 0x3bc

void displayCommand(unsigned int cmd)
{
//printf("displayCommand ... %d\n", cmd);
  usleep(5);
  outb(0xee, LP_BASE+2);
  usleep(5);
  outb(cmd, LP_BASE);
  usleep(5);
  outb(0xec, LP_BASE+2);
  usleep(5);
  outb(0xee, LP_BASE+2);
  usleep(5);
}

void displayChar(char c)
{
//printf("displayChar ... %c\n", c);
  usleep(5);
  outb(0xe6, LP_BASE+2);
  usleep(5);
  outb(c, LP_BASE);
  usleep(5);
  outb(0xe4, LP_BASE+2);
  usleep(5);
  outb(0xe6, LP_BASE+2);
  usleep(5);
}

void initLCD()
{
  displayCommand(0x01);
//  displayCommand(0x02);
  displayCommand(0x06);
  displayCommand(0x0d);
//  displayCommand(0x10);
//  displayCommand(0x20);
}

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

        char *p;


	/* attempt to reserve region in io space */
	if(ioperm(LP_BASE, 3, 1) < 0) {
		fprintf(stderr, "Cannot reserve region in io space, aborting...\n");
		exit(1);
	}

	if(argc < 2) {
                initLCD();
                ioperm(LP_BASE, 3, 0);
		fprintf(stderr, "Must supply a value to send to port...\n");
		exit(1);
	}

        p = argv[1];

        initLCD();
        while (*p != '\0')
          displayChar(*p++);     

	/* attempt to release reserved region in io space */
	if(ioperm(LP_BASE, 3, 0) < 0) {
		fprintf(stderr, "Cannot release region in io space, aborting...\n");
		exit(1);
	}

	return(0);  /* just to be nice ;) */

}
