#include "nmap_gpio_screen.h"

void init_pin_screen(int *fd,void **gpio_base_addr)
{
  uint32_t *pioa;
  uint32_t *pio_oer;

  *fd = open("/dev/mem", O_RDWR|O_SYNC);

  if (*fd == -1) {
		printf("Failed opening /dev/mem\n");
		//return EXIT_FAILURE;
	}
  // mmap pioA registers
  *gpio_base_addr = mmap(0, PIOA_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, *fd, SMC_BASE);
  if (gpio_base_addr == MAP_FAILED)
  {
  		printf("Failed memory mapping registers\n");
      close(*fd);
      //return -1;
  }


}

void set_backlight(bool state, void *gpio_base_addr)
{
  uint32_t *pioa;
  uint32_t *pio_per;
  uint32_t *pio_sodr;
  uint32_t *pio_codr;
  uint32_t *pio_oer;
  pioa = gpio_base_addr + GPIOA_OFFSET;
  pio_sodr = pioa + PIO_SODR/4;
  pio_codr = pioa + PIO_CODR/4;
  pio_oer  = pioa + PIO_OER/4;
  pio_per  = pioa + PIO_PER/4;
  *pio_per=(1<<BACKLIGHT_PIN);
  *pio_oer = (1 << BACKLIGHT_PIN);
  if(state)
  {
    *pio_sodr = (1 << BACKLIGHT_PIN);
  }
  else
  {
    *pio_codr = (1 << BACKLIGHT_PIN);
  }
}

void set_command(bool state, void *gpio_base_addr)
{
  uint32_t *pioa;
  uint32_t *pio_per;
  uint32_t *pio_sodr;
  uint32_t *pio_codr;
  uint32_t *pio_oer;
  pioa = gpio_base_addr + GPIOA_OFFSET;
  pio_sodr = pioa + PIO_SODR/4;
  pio_codr = pioa + PIO_CODR/4;
  pio_oer  = pioa + PIO_OER/4;
  pio_per  = pioa + PIO_PER/4;
  *pio_per = (1 << COMMAND_PIN);
  *pio_oer = (1 << COMMAND_PIN);
  if(state)
  {
    *pio_sodr = (1 << COMMAND_PIN);
  }
  else
  {
    *pio_codr = (1 << COMMAND_PIN);
  }
}


void free_pin_screen(int fd, void *gpio_base_addr)
{
  uint32_t *pioa;
  uint32_t *pio_pdr;
  pioa = gpio_base_addr + GPIOA_OFFSET;
  pio_pdr  = pioa + PIO_PDR/4;
  *pio_pdr = (1 << BACKLIGHT_PIN);//disable Backlight
  *pio_pdr = (1 << COMMAND_PIN);
  close(fd);
  munmap(gpio_base_addr, PIOA_MEM_SIZE);
}
