#include <stdio.h>
#include <stdint.h> 
#include "csi_core.h"
#include <csi_config.h>
#include "board_config.h"
#include "app_gpio.h"
#include "app_wdt.h"


#include "asr_config.h"

#ifdef CONFIG_XIP
#define ATTRIBUTE_DATA __attribute__((section(".ram.code")))
#else
#define ATTRIBUTE_DATA
#endif

#define PA_OUTPUT_TOGGLE_GPIO_PIN        	PA26
#define PA_GPIO_OUT_PIN_MASK 				(1 << PA_OUTPUT_TOGGLE_GPIO_PIN ) 
#define GPIO_OUT_PIN_MASK  					(1 << PA_OUTPUT_TOGGLE_GPIO_PIN ) 

#define EXAMPLE_GPIO_OUT_PIN_MASK      ( ( 1 << EXAMPLE_TOGGLE_GPIO_PIN ) | ( 1 << EXAMPLE_TOGGLE_GPIO_PIN1  ) \
                                   | ( 1 << EXAMPLE_TOGGLE_GPIO_PIN2 ) | ( 1 << EXAMPLE_TOGGLE_GPIO_PIN3  ) )

#define EXAMPLE_GPIO0_OUT_PIN_MASK      ( 1 << EXAMPLE_TOGGLE_GPIO_PIN )	//PA9
#define EXAMPLE_GPIO1_OUT_PIN_MASK      ( 1 << EXAMPLE_TOGGLE_GPIO_PIN1 )	//PA0
#define EXAMPLE_GPIO2_OUT_PIN_MASK      ( 1 << EXAMPLE_TOGGLE_GPIO_PIN2 ) 	//PA21
#define EXAMPLE_GPIO3_OUT_PIN_MASK      ( 1 << EXAMPLE_TOGGLE_GPIO_PIN3 ) 	//PA22


#define EXAMPLE_GPIO_IRQ_PIN_MASK      (( 1 << EXAMPLE_INTR_GPIO_PIN ) |  ( 1 << EXAMPLE_INTR_GPIO_PIN1 ) )

unsigned int deb_intr_cnt =0;
static csi_gpio_t gpio_test;
static csi_gpio_t gpio_irq;
static csi_gpio_t gpio_output;


static void gpio_interrupt_handler(csi_gpio_t *gpio, unsigned int pin_mask, void *arg)
{
	deb_intr_cnt++;
}

/* gpio operation */
void app_gpio_init(void)
{	//gpio初始化的时候 设备id都是0
	
	/* 下面这一段是一个IO输入中断的case ，设置的是PA5/PA6，参考用*/
    csi_gpio_init(&gpio_irq, EXAMPLE_INTR_GPIO_IDX);
    csi_gpio_mode(&gpio_irq,EXAMPLE_INTR_GPIO_PIN_MASK,GPIO_MODE_PULLUP);//设置上拉输入
    csi_gpio_attach_callback(&gpio_irq, gpio_interrupt_handler, NULL);//注册回调函数gpio_interrupt_handler
    csi_gpio_dir(&gpio_irq, EXAMPLE_INTR_GPIO_PIN_MASK, GPIO_DIRECTION_INPUT);//GPIO输入/输出模式配置
    csi_gpio_irq_mode(&gpio_irq, EXAMPLE_INTR_GPIO_PIN_MASK, GPIO_IRQ_MODE_FALLING_EDGE);//配置GPIO的中断模式，下降沿触发
    csi_gpio_irq_enable(&gpio_irq, EXAMPLE_INTR_GPIO_PIN_MASK, true);//ture中断使能
  
	
	/* 功放使能 PA26，必不可少*/
	csi_gpio_init(&gpio_output, EXAMPLE_TOGGLE_GPIO_IDX);
    csi_gpio_dir(&gpio_output, GPIO_OUT_PIN_MASK, GPIO_DIRECTION_OUTPUT);
    csi_gpio_write(&gpio_output, GPIO_OUT_PIN_MASK,  GPIO_PIN_LOW);
	
	/* 以下配置io输出 ，本例主要用于指示灯，没啥用，参考用*/
    csi_gpio_init(&gpio_test, EXAMPLE_TOGGLE_GPIO_IDX);
    csi_gpio_dir(&gpio_test, EXAMPLE_GPIO_OUT_PIN_MASK, GPIO_DIRECTION_OUTPUT);
    csi_gpio_write(&gpio_test, EXAMPLE_GPIO_OUT_PIN_MASK,  GPIO_PIN_LOW);

#if APP_LOG_ENABLE
    printf("app gpio init\r\n");
#endif

}

 /* 自己看api说明，都是些gpio的操作 */
ATTRIBUTE_DATA void gpio0_set(csi_gpio_pin_state_t value)
{
	/* Set one or zero to the selected pin mask */
	csi_gpio_write(&gpio_test, EXAMPLE_GPIO0_OUT_PIN_MASK, value);
} 
ATTRIBUTE_DATA void gpio0_toggle(void)
{
	/* toggle pin interval */
	csi_gpio_toggle(&gpio_test, EXAMPLE_GPIO0_OUT_PIN_MASK);
}
ATTRIBUTE_DATA void gpio1_set(csi_gpio_pin_state_t value)
{
	/* Set one or zero to the selected pin mask */
	csi_gpio_write(&gpio_test, EXAMPLE_GPIO1_OUT_PIN_MASK, value);
} 
ATTRIBUTE_DATA void gpio1_toggle(void)
{
	/* toggle pin interval */
	csi_gpio_toggle(&gpio_test, EXAMPLE_GPIO1_OUT_PIN_MASK);
}
ATTRIBUTE_DATA void gpio2_set(csi_gpio_pin_state_t value)
{
	/* Set one or zero to the selected pin mask */
	csi_gpio_write(&gpio_test, EXAMPLE_GPIO2_OUT_PIN_MASK, value);
} 
ATTRIBUTE_DATA void gpio2_toggle(void)
{
	/* toggle pin interval */
	csi_gpio_toggle(&gpio_test, EXAMPLE_GPIO2_OUT_PIN_MASK);
}
ATTRIBUTE_DATA void gpio3_set(csi_gpio_pin_state_t value)
{
	/* Set one or zero to the selected pin mask */
	csi_gpio_write(&gpio_test, EXAMPLE_GPIO3_OUT_PIN_MASK, value);
} 
ATTRIBUTE_DATA void gpio3_toggle(void)
{
	/* toggle pin interval */
	csi_gpio_toggle(&gpio_test, EXAMPLE_GPIO3_OUT_PIN_MASK);
}


ATTRIBUTE_DATA void gpio_pa_set(csi_gpio_pin_state_t value)
{
	/* Set one or zero to the selected pin mask */
	csi_gpio_write(&gpio_output, PA_GPIO_OUT_PIN_MASK, value);
}
/*
 * 将芯片调试口切换成GPIO口
 */
//void app_gpio_change_swd_to_gpio(void)
//{
//    gpio_config_t gpio_config_in = GPIO_CONFIG_INPUT_PULLUP10K;
//    soc_pin_function_config(GPIO19,PIN_FUNCTION_GPIO,0);        // TMS
//    soc_pin_function_config(GPIO20,PIN_FUNCTION_GPIO,0);        // TCK
//    gpio_config(GPIO19,gpio_config_in);
//    gpio_config(GPIO20,gpio_config_in);
//}

/*
 * 将芯片调试口切换成JTAG口
 */
//void app_gpio_change_gpio_to_swd(void)
//{
//    soc_pin_function_config(GPIO19,PIN_FUNCTION_TMS,0);        // TMS
//    soc_pin_function_config(GPIO20,PIN_FUNCTION_TCK,0);        // TCK
//}

