#include "ircut.h"

unsigned int fd;
PIO_Map *PIO = NULL;
unsigned int *gpio_map;
unsigned int addr_start, addr_offset;
unsigned int PageSize, PageMask;
extern char textbuf[256];
void GPIO_Init(void)
{

    if ((fd = open("/dev/mem", O_RDWR)) == -1)
    {
        printf("open error");
        return;
    }

    PageSize = sysconf(_SC_PAGESIZE); //ʹ��sysconf��ѯϵͳҳ���С
    PageMask = (~(PageSize - 1));     //ҳ����
    printf("PageSize:%d,PageMask:0x%.8X", PageSize, PageMask);

    addr_start = PIO_BASE_ADDRESS & PageMask;   //0x01C20800 & 0xfffff000 =  0x1C20000
    addr_offset = PIO_BASE_ADDRESS & ~PageMask; //0x01C20800 & 0x00000fff = 0x00000800
    printf("addr_start:%.8X,addr_offset:0x%.8X", addr_start, addr_offset);
    //mmap(ϵͳ�Զ������ڴ��ַ��ӳ�������ȡ��ڴ�ҳ������������ѡ��ɶ���д��MAP_SHARED=����������ӳ�䵽�������Ľ��̹����ռ䣬�ļ��������ӳ�����ݵ����)
    //offest ӳ�������ڴ�Ļ�������ҳ����!!!   ���������ʼ��ַӦ����0x1000������������ô����0x01C20800��Ҫ��ȥ0x800������������
    if ((gpio_map = mmap(NULL, PageSize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start)) == NULL)
    {
        printf("mmap error");
        close(fd);
        return;
    }
    printf("gpio_map:%.8X", gpio_map);
    
    //�����Ѿ���0x1c20000�ĵ�ַӳ�䵽���ڴ��У�����������Ҫ�ĵ�ַ��0x01C20800������Ҫ�ټ��ϵ�ַƫ������
    PIO = (PIO_Map *)((unsigned int)gpio_map + addr_offset);
    printf("PIO:0x%.8X", PIO);

    close(fd); //ӳ���֮��Ϳ��Թر��ļ���
}

void GPIO_ConfigPin(PORT port, unsigned int pin, PIN_MODE mode)
{
    if (gpio_map == NULL)
        return;
    PIO->Pn[port].CFG[pin / 8] &= ~((unsigned int)0x07 << pin % 8 * 4);
    PIO->Pn[port].CFG[pin / 8] |= ((unsigned int)mode << pin % 8 * 4);
    printf("struct PIO_Struct size : %d",sizeof(PIO->Pn[port]));
    
}

void GPIO_SetPin(PORT port, unsigned int pin, unsigned int level)
{
    if (gpio_map == NULL)
        return;
    if (level)
        PIO->Pn[port].DAT |= (1 << pin);
    else
        PIO->Pn[port].DAT &= ~(1 << pin);

        
}

int GPIO_Free(void)
{
    if ((munmap(gpio_map, PageSize * 2)) == 0)//ȡ��ӳ��
    {
        printf("unmap success!");
    }
    else
    {
        printf("unmap failed!");
    }
    return 0;
}


void init_amplifier(void)//������ʼ��
{
    GPIO_Init();
    GPIO_ConfigPin(PB,4,OUT);
	
}

void set_amplifier(int amplifier_mode){//���ſ���
	if(amplifier_mode==0){//�رչ���
		  GPIO_SetPin(PB,4,0);
	}
	else if(amplifier_mode==1){//�򿪹���
		  GPIO_SetPin(PB,4,1);
	}
}