PT26_HAL:相关文件

G:\Git_file\YC3121_PT26\Librarier\core\board_config.h


/*
File Name    : board_config.h
Author       : Yichip
Version      : V1.0
Date         : 2020/07/17
Description  : board I/O config file.
*/

#ifndef __BOARD_CONFIG_H__
#define __BOARD_CONFIG_H__

#include "yc3121.h"
#include "yc_gpio.h"
#include "yc_spi.h"
#include "yc_adc.h"
#include "yc_chrg.h"


//ADC绠¤剼?嶇?
#define ADC_IO_PORT  	GPIOC
#define ADC1_IO_PIN  	GPIO_Pin_6
#define ADC2_IO_PIN  	GPIO_Pin_7
#define ADC3_IO_PIN  	GPIO_Pin_8
#define ADC4_IO_PIN  	GPIO_Pin_9

#define ADC_GAP_PIN	    ADC1_IO_PIN
#define ADC_BM_PIN	    ADC2_IO_PIN
#define ADC_TM_PIN	    ADC3_IO_PIN
#define ADC_BAT_BIN	    ADC4_IO_PIN



#define ADC_CH_GAP		ADC_CHANNEL_1
#define ADC_CH_BM		ADC_CHANNEL_2
#define ADC_CH_TM		ADC_CHANNEL_3
#define ADC_CH_BAT		ADC_CHANNEL_4


//DEBUG涓插彛閰?
#define UARTBAUD            	115200
#define UART0_TX_PORT       	GPIOA
#define UART0_TX_PIN        	GPIO_Pin_1
#define UART0_RX_PORT       	GPIOA
#define UART0_RX_PIN        	GPIO_Pin_0

//TPH SPI IO
#define TPH_SPI				    SPI0
#define TPH_SPI_CLK_PORT		GPIOB
#define TPH_SPI_CLK_PIN		    GPIO_Pin_14

#define TPH_SPI_MOSI_PORT		GPIOB
#define TPH_SPI_MOSI_PIN		GPIO_Pin_13

#define TPH_SPI_CS_PORT		    GPIOB
#define TPH_SPI_CS_PIN		    GPIO_Pin_15

#define TPH_STB1_PORT			GPIOB
#define TPH_STB1_PIN			GPIO_Pin_12    //加热

#define TPH_STB2_PORT			GPIOB	
#define TPH_STB2_PIN			GPIO_Pin_11    //加热

#define TPH_MDEN_PORT			GPIOC
#define TPH_MDEN_PIN			GPIO_Pin_0





//FLASH SPI_FLASH IO
#define FLASH_SPI				SPI1
#define FLASH_SPI_MOSI_PORT		GPIOC
#define FLASH_SPI_MOSI_PIN		GPIO_Pin_3

#define FLASH_SPI_MISO_PORT		GPIOC
#define FLASH_SPI_MISO_PIN		GPIO_Pin_5

#define FLASH_SPI_CLK_PORT		GPIOC
#define FLASH_SPI_CLK_PIN		GPIO_Pin_2

#define FLASH_SPI_CS_PORT		GPIOC
#define FLASH_SPI_CS_PIN		GPIO_Pin_4





#ifdef USE_LCD_IIC_PORT

//LCD I2C IO
#define LCD_IIC_SDA_PORT		GPIOA
#define LCD_IIC_SDA_PIN		       GPIO_Pin_5

#define LCD_IIC_CLK_PORT		GPIOA
#define LCD_IIC_CLK_PIN		       GPIO_Pin_4

#define LCD_RST_PORT			GPIOA
#define LCD_RST_PIN			       GPIO_Pin_3

#define LCD_CS_PORT			GPIOA
#define LCD_CS1_PIN			       GPIO_Pin_2

//#define LCD_PWR_PORT		       GPIOB
//#define LCD_PWR_PIN			GPIO_Pin_0




#else

#define LCD_SDA_PORT		       GPIOA
#define LCD_SDA_PINT			GPIO_Pin_5


#define LCD_CLK_PORT		       GPIOA
#define LCD_CLK_PIN			       GPIO_Pin_4


#define LCD_RST_PORT		       GPIOA
#define LCD_RST_PIN			       GPIO_Pin_3     //

#define LCD_CS_PORT			GPIOA
#define LCD_CS1_PIN			       GPIO_Pin_2     //            (没有用)


//#define LCD_DC_PORT			GPIOA   
//#define LCD_DC_PIN			       GPIO_Pin_15    //rxid -----------rfid


//#define LCD_PWR_PORT		       GPIOB
//#define LCD_PWR_PIN			GPIO_Pin_0     //gap_e3  -------- 

#endif


#define   Head_En_PORT		       GPIOA
#define   Head_En_PIN		       GPIO_Pin_12    //head_en         







//STEP MOTOR


#define STEP_MOTOR_A1_PORT		GPIOC
#define STEP_MOTOR_A1_PIN		GPIO_Pin_1

#define STEP_MOTOR_A2_PORT		GPIOC
#define STEP_MOTOR_A2_PIN		GPIO_Pin_10

#define STEP_MOTOR_B1_PORT		GPIOC
#define STEP_MOTOR_B1_PIN		GPIO_Pin_12

#define STEP_MOTOR_B2_PORT		GPIOC
#define STEP_MOTOR_B2_PIN		GPIO_Pin_11


#define STEP_MOTOR_EN_PORT		GPIOA
#define STEP_MOTOR_EN_PIN		GPIO_Pin_11  

#define TPH_POWER_EN_PORT		GPIOA
#define TPH_POWER_EN_PIN		GPIO_Pin_11


// SERSOR IO	
// 测试纸张位置的传感器
#define gap_e3_port				GPIOB
#define gap_e3_pin				GPIO_Pin_0    //gap_e3

#define gap_e2_port				GPIOB
#define gap_e2_pin				GPIO_Pin_5    //gap_e2

#define BM_E0_PORT				GPIOB
#define BM_E0_PIN				GPIO_Pin_6    //gap_e1

#define BM_E1_PORT				GPIOB
#define BM_E1_PIN				GPIO_Pin_10   //gap_e0


#define KEY_WAKE_PORT    		GPIOA
#define KEY_WAKE_PIN     		GPIO_Pin_13



#define KEY_SET_PORT    		GPIOA
#define KEY_SET_PIN     		GPIO_Pin_7



#define SYS_POWER_EN_PORT		GPIOA			//上电输出高
#define SYS_POWER_EN_PIN		GPIO_Pin_9

//CHARGE-GET
#define   PIN_CHARGE_STATE	    GPIO_Pin_8
#define   PORT_CHARGE_STATE		GPIOA




//#define SysTimerInt			TIMER4_IRQHandler
//#define PrtTimerInt			TIMER3_IRQHandler
//#define LFMotorInt			TIMER2_IRQHandler
#endif













//      api_ui_led.c








/******************************************************************************
版权所有:  深圳市。。科技有限公司 
文件名:    api_ui_led.c
作者:      wangdy
创建日期:  2021/06/2
描述:      led显示控制  
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			  参考样式       
******************************************************************************/

/************************************头文件************************************/

//#include "api_ui_process.h"
//#include "printerConfig.h"
#include "bsp_lcd.h"
#include "api_ui_lcd.h"
#include "LcdMenu.h"
/*
#include "api_ui_main.h"
#include "api_ui_macaddr.h"
#include "api_ui_update.h"
#include "api_ui_language_choice.h"
#include "api_ui_selftest_print.h"
#include "api_ui_auto_poweroff.h"
#include "api_ui_firmware_version.h"
#include "api_ui_poweroff_charge.h"
#include "api_ui_factory_setting.h"
#include "api_ui_carriage_open.h"
#include "api_ui_datatrans.h"
#include "api_ui_paper_type.h"
#include "api_ui_auto_calibrate.h"

#include "api_ui_language.h"
#include "yc_systick.h"
#include "api_font_img.h"
#include <stdio.h>
#include <string.h>
#include "api_keyscan.h"
#include "var_global.h"
#include "printerConfig.h"
#include "api_userpara.h"
#include "api_powerctrl.h"
*/

#define UI_LCD
#ifdef UI_LCD

/*************************************宏定义*************************************/



/*************************************变量*************************************/

ST_UI_HANDLE			Current_Handle;
UICommonStoreTypeDef	UICommonStore = {0};	//存储参数信息 
UICommonTypeDef				UICommon =      //界面通用信息 
{
	.Last_MenuID = 1,	//默认转第一个界面  
};				

/*************************************函数*************************************/

/*******************************************************************************
* 名称:		UI_Menu_ShowChinese_16x16       
* 描述:		显示文本 16*16
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowChinese_16x16(uint8_t x,uint8_t y,uint8_t *chinese)
{
	uint8_t i = 0;
	uint8_t chinese_buf[2];		//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)chinese)/2; i++)
	{
		//取到汉字字模的位置  
		chinese_buf[0] = chinese[i*2 + 0];
		chinese_buf[1] = chinese[i*2 + 1];
		//取到字模信息 
		font_ptr = Get_FontChinese_16x16(chinese_buf);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Chinese_16x16(index,y,font_ptr);
			index += 16;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowAscii_16x16     
* 描述:		显示ascii 8*16
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowAscii_16x16(uint8_t x,uint8_t y,uint8_t *ascii)
{
	uint8_t i = 0;
	uint8_t ascii_index = 0;	//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)ascii); i++)
	{ 
		ascii_index = ascii[i];
		//取到字模信息 
		font_ptr = Get_FontAscii_16x16(ascii_index);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Ascii_16x16(index,y,font_ptr);
			index += 8;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowMenu_16x16     
* 描述:		显示菜单信息(用于区分语言)
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowMenu_16x16(uint8_t x,uint8_t y,uint8_t *menu)
{

	if(LCD.language==ENGLISH)
	{
		UI_Menu_ShowAscii_16x16(x,y,menu);
	}

	if(LCD.language==CHINESE)
	{
		UI_Menu_ShowChinese_16x16(x,y,menu);
	}
}


/*******************************************************************************
* 名称:		UI_Menu_ShowChinese_12x12       
* 描述:		显示文本 12*12
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowChinese_12x12(uint8_t x,uint8_t y,uint8_t *chinese)
{
	uint8_t i = 0;
	uint8_t chinese_buf[2];		//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)chinese)/2; i++)
	{
		//取到汉字字模的位置  
		chinese_buf[0] = chinese[i*2 + 0];
		chinese_buf[1] = chinese[i*2 + 1];
		//取到字模信息 
		font_ptr = Get_FontChinese_12x12(chinese_buf);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Chinese_12x12(index,y,font_ptr);
			index += 12;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowAscii_12x12     
* 描述:		显示ascii 6*12
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowAscii_12x12(uint8_t x,uint8_t y,uint8_t *ascii)
{
	uint8_t i = 0;
	uint8_t ascii_index = 0;	//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)ascii); i++)
	{ 
		ascii_index = ascii[i];
		//取到字模信息 
		font_ptr = Get_FontAscii_12x12(ascii_index);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Ascii_12x12(index,y,font_ptr);
			index += 6;
		}
	}
}


/*******************************************************************************
* 名称:		UI_Menu_ShowMenu_12x12     
* 描述:		显示菜单信息(用于区分语言)
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowMenu_12x12(uint8_t x,uint8_t y,uint8_t *menu)
{
	//if(gUserPara.Language == LANGUAGE_EN)
	if(LCD.language==ENGLISH)
	{
		//UI_Menu_ShowAscii_12x12(x,y,menu);
		UI_Menu_ShowAscii_12x12(0,y,menu);
	}
	//else if(gUserPara.Language == LANGUAGE_CN)
	else if(LCD.language==CHINESE)
	{
		UI_Menu_ShowChinese_12x12(x,y,menu);
	}
}

/*******************************************************************************
* 名称:		UI_Menu_Init       
* 描述:		UI_Menu初始化 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
/*
void UI_Menu_Init(void)
{
	Current_Handle = UIHandle_Main;
	Current_Handle.Init(NULL);			//初始化显示信息 
}
*/
/*******************************************************************************
* 名称:		UI_Menu_OpModeChange       
* 描述:		UI_Menu
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

void UI_Menu_OpModeChange(MenuOPModeTypeDef mode, void *param)
{
	switch(mode)
	{
		case OP_MODE_MAIN:
		{
			Current_Handle = UIHandle_Main;
			Current_Handle.Init(NULL);			//初始化显示信息 
			break;
		}
		case OP_MODE_MACADDR:				//MAC
		{
			Current_Handle = UIHandle_MacAddr;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 7;
			break;
		}
		case OP_MODE_UPDATE:				//升级  
		{
			Current_Handle = UIHandle_Update;
			Current_Handle.Init(NULL);			//初始化显示信息 
			break;
		}
		case OP_MODE_LANGUAGECHOICE:		//语言选择
		{
			Current_Handle = UIHandle_LanguageChoice;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 4;
			break;
		}
		case OP_MODE_SELFTEST_PRINT:		//打印自检  
		{
			Current_Handle = UIHandle_Selftest_Print;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 1;
			break;
		}
		case OP_MODE_AUTO_POWEROFF:			//自动关机 
		{
			Current_Handle = UIHandle_AutoPoweroff;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 5;
			break;
		}
		case OP_MODE_FIRMWARE_VERSION:		//固件版本号 
		{
			Current_Handle = UIHandle_Firmware_Version;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 8;
			break;
		}
		case OP_MODE_FACTORY_SETTING:		//恢复参数 
		{
			Current_Handle = UIHandle_Factory_Setting;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 6;
			break;
		}
		case OP_MODE_PAPER_TYPE:			//纸张类型 
		{
			Current_Handle = UIHandle_PaperType;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 2;
			break;
		}
		case OP_MODE_AUTO_CALIBRATE:		//自动定标 
		{
			Current_Handle = UIHandle_AutoCalibrate;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 3;
			break;
		}
		default:
		{
			break;
		}
	}
}
*/
/*******************************************************************************
* 名称:		UI_StorePara       
* 描述:		UI配置存参 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

static void UI_StorePara(void)
{
	//跳主界面后  开始存参 
	1 -定标参数  
	if(UICommonStore.NeedStoreCaliFlag)
	{
		UICommonStore.NeedStoreCaliFlag = false;
		gCalibratePara.SensorMode = UICommonStore.SensorMode;		//纸张类型存储  
		CalibrateParaWritetoFlash(&gCalibratePara);	//写定标参数  
	}
	//2-用户参数  
	if(UICommonStore.NeedStoreLanguateFlag)
	{
		UICommonStore.NeedStoreLanguateFlag = false;
		UserParaWritetoFlash(&gUserPara);
	}
	//3-存储定时时间信息 
	if(UICommonStore.NeedStorePowerOffTimeFlag)
	{
		UICommonStore.NeedStorePowerOffTimeFlag = false;
		gUserPara.AutoPowerOffTimeEnum = UICommonStore.AutoPowerOffTimeEnum;
		UserParaWritetoFlash(&gUserPara);
	}
}

*/


/*******************************************************************************
* 名称:		UI_Menu_Process       
* 描述:		UI_Menu定时调用 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

void UI_Menu_Process(void)
{
	uint32_t current_count = 0;
	static uint32_t last_count = 0;
	uint32_t backmain_current_count = 0;
	static uint32_t backmain_last_count = 0;
	KeyStateTypeEnum  key_state_power = 0;
	KeyStateTypeEnum  key_state_feed = 0;
	
	//----------------跳转主界面计时信息 10MS判断一次
	backmain_current_count = SysTick_GetMyTick();
	if(backmain_last_count != backmain_current_count)
	{
		backmain_last_count = backmain_current_count;	
		if(GlobalVar.Use_Key_Menu_Flag)
		{
			GlobalVar.UI_ReturnToMain_Count++;	
			if(GlobalVar.UI_ReturnToMain_Count > LCD_RETURN_MAIN_TIMEOUT)
			{
				GlobalVar.UI_ReturnToMain_Count = 0;
				GlobalVar.Use_Key_Menu_Flag = false;
				
				//跳到主界面去 如果当前非主界面  
				if(0 != memcmp(&Current_Handle, &UIHandle_Main, sizeof(ST_UI_HANDLE)))
				{
					UI_Menu_OpModeChange(OP_MODE_MAIN,NULL);		
					UI_StorePara();			//存参 
				}
			}
		}
		else 
		{
			GlobalVar.UI_ReturnToMain_Count = 0;	
		}
	}

	//-------------------按键刷新
	if(false == GlobalVar.Use_Key_Menu_Flag)
	{
		key_state_power = Key_Get_State(KEY_POWER);		//左按键按下后  按键被菜单接管 
		if(key_state_power == KEY_PRESS_SINGLE)
		{
			GlobalVar.Use_Key_Menu_Flag = true;
			GlobalVar.UI_ReturnToMain_Count = 0;		//跳过  计数器清0  
			AutoPowerOffClear();						//清除关机计数 
			
			Current_Handle.KeyEvent(KEY_POWER);			//左键处理 
			AutoPowerOffClear();						//清除关机计数 
			
			MyPrintf("PowerKey Pressed\r\n");
		}
		
		//MyPrintf("PowerKey,Run to Screen\r\n");
	}
	//进入菜单模式   则进行处理 
	else if(true == GlobalVar.Use_Key_Menu_Flag)
	{
		key_state_power = Key_Get_State(KEY_POWER);
		key_state_feed = Key_Get_State(KEY_FEED);
		
		if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_PRESS_SINGLE))
		{
			GlobalVar.UI_ReturnToMain_Count = 0;		//计数清0  
			Current_Handle.KeyEvent(KEY_FEED);			//右键处理 
			AutoPowerOffClear();						//清除关机计数 
		}
		if((key_state_power == KEY_PRESS_SINGLE) && (key_state_feed == KEY_RELEASE))
		{
			GlobalVar.UI_ReturnToMain_Count = 0;		//计数清0  		
			Current_Handle.KeyEvent(KEY_POWER);			//左键处理 
			AutoPowerOffClear();						//清除关机计数 
		}
	}
	
//	//------------------------定时刷新  更新刷新频率  
	current_count = SysTick_GetMyTick();
	if((current_count - last_count) > LCD_REFRESH_TIME)
	{
		last_count = current_count;
		
		if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_RELEASE))
		{
			Current_Handle.KeyEvent(KEY_NULL);			//没按键 则正常做刷新  
		}
	}
}
*/
#endif









































//                hal.c   


/****************************************************************************
 * File Name: hal.c
 *
 * Description:
 *					hal
 *
 * --------------------------------------------------------------------
 * Revision	Author		Date		Comment
 * --------------------------------------------------------------------
 * 1.0          Junrong         2021/11/14		Original
 *
 *****************************************************************************/

#include "hal.h"
#include "yc_trng.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"
#include "prtHead.h"

void hal_Init(void)
{
//    SuppliseAuth_Init();
}
UINT32 RandomNumber(void)
{
//    g_Log.RandomSeed += GetRandomSeed(100) + 1 + rand();
    srand(EXT_DEV.bat_adc + xTaskGetTickCount());
    return GetTRNGData_8bit() + rand();
}






























//                   hal.h


                  

/****************************************************************************
 * File Name: hal.h
 *
 * Description:
 *					hal
 *
 * --------------------------------------------------------------------
 * Revision	Author		Date		Comment
 * --------------------------------------------------------------------
 * 1.0          Junrong         2021/11/14		Original
 *
 *****************************************************************************/
#ifndef __HAL__
#define __HAL__
#include "Types.h"
#include "yc_timer.h"

void hal_Init(void);
UINT32 RandomNumber(void);

#include "hal_SuppliesAuth.h"

#endif



























//                      hal_SuppliesAuth.c



/****************************************************************************
 * File Name: hal_SuppliesAuth.c
 *
 * Description:
 *					hal_SuppliesAuth
 *
 * --------------------------------------------------------------------
 * Revision	Author		Date		Comment
 * --------------------------------------------------------------------
 * 1.0          Junrong         2021/11/14		Original
 *
 *****************************************************************************/
#include "hal.h"
#include "interface.h"
#include "yc_qspi.h"
#include "yc_trng.h"
#include "app.h"

#define UART_SUPPLIES_AUTH  UART1
#define TIMEOUT             10000
#define  SUPPLIES_AUTH_PASSWORD     "Q2043"   //密码
//#define  SUPPLIES_AUTH_PASSWORD     "12345"   //密码
#define  RFID_UART_BAUD			    9600

void portPTAUTH_CommDataWrite(BYTE addr, BYTE value)                 //PT26没有用到
{
//    taskENTER_CRITICAL();
    BYTE buf[2];
    buf[0] = addr & 0x3F;
    buf[1] = value;
    UART_SendData(UART_SUPPLIES_AUTH, buf[0]);
//    for(UINT16 i = 0; i < TIMEOUT; i++)
//    {
//        if(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
//        {
//            buf[0] = UART_ReceiveData(UART_SUPPLIES_AUTH);
//            break;
//        }
//    }
    UART_SendData(UART_SUPPLIES_AUTH, buf[1]);
//   MyPrintf("W:%02X%02X\r\n", addr, buf[1]);
//    taskEXIT_CRITICAL();
}
BYTE portPTAUTH_CommDataRead(BYTE addr)					 //PT26没有引用
{
	volatile uint8_t  recv_byte = 0; 
//    taskENTER_CRITICAL();
    //Clear buffer
	while(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
	{
		recv_byte = UART_ReceiveData(UART_SUPPLIES_AUTH);
	}
    // Send address
    UART_SendData(UART_SUPPLIES_AUTH, addr | 0x80);
    // Receive data
	for(UINT16 i = 0; i < TIMEOUT; i++)
    {
        if(UART_IsRXFIFONotEmpty(UART_SUPPLIES_AUTH))
        {
            recv_byte = UART_ReceiveData(UART_SUPPLIES_AUTH);
       //    MyPrintf("R:%02X%02X\r\n", addr, recv_byte);
            return recv_byte;
        }
	}
//    taskEXIT_CRITICAL();
 //   MyPrintf("RF:%02X%02X\r\n", addr | 0x80, recv_byte);
	return 0x00;
}

void portPTAUTH_CommSetUartBaudrate(UINT32 baudrate)
{
//    taskENTER_CRITICAL();
//    MyPrintf("%u\r\n", baudrate);
    UART_DeInit(UART_SUPPLIES_AUTH);
	UART_InitTypeDef UART_InitStruct;
	UART_InitStruct.BaudRate    = baudrate;			
	UART_InitStruct.DataBits    = Databits_8b;
	UART_InitStruct.StopBits    = StopBits_1;
	UART_InitStruct.Parity      = Parity_None;
	UART_InitStruct.FlowCtrl    = FlowCtrl_None;
	UART_InitStruct.Mode        = Mode_duplex;
	UART_Init(UART_SUPPLIES_AUTH, &UART_InitStruct);
//    taskEXIT_CRITICAL();
}
BYTE portPTAUTH_GenRandomByte(void)									  //PT26没有引用
{
	return RandomNumber();
}
void portPTAUTH_Delay(UINT16 ms)									 //PT26没有引用
{
	delay_ms(ms);
}
#define BLACKLIST_ADDR 0x1078000
void portPTAUTH_BlacklistDataWrite(BYTE *pData, UINT16 length)       //PT26没有引用
{
//    MyPrintf("BLW(%u):", length);
//    for(UINT16 i = 0; i < length; i++)
//    {
//        MyPrintf("%02X", pData[i]);
//    }
//    MyPrintf("\r\n");
    qspi_flash_blockerase32k(BLACKLIST_ADDR);
    qspi_flash_write(BLACKLIST_ADDR, pData, length);
}
void portPTAUTH_BlacklistDataRead(BYTE *pData, UINT16 length)        //PT26没有引用
{
//    MyPrintf("BLR(%u):", length);
//    for(UINT16 i = 0; i < length; i++)
//    {
//        MyPrintf("%02X", pData[i]);
//    }
//    MyPrintf("\r\n");
    qspi_flash_read(BLACKLIST_ADDR, pData, length);
}

void portPTAUTH_RecordDataWrite(BYTE *pData, UINT16 length)          //PT26没有引用
{
	SPI_Erase_Sector(LogAddr);
	SPI_Write_nBytes(LogAddr, pData, length);
}
void portPTAUTH_RecordDataRead(BYTE *pData, UINT16 length)           //PT26没有引用
{
	SPI_Read_nBytes(LogAddr, pData, length);
}

void portPTAUTH_DBG(char *pMsg)
{
	MyPrintf(pMsg);
}


#define  RFID_RESET_LOW          	(GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET))
#define  RFID_RESET_HIGH        	(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET))

#define  PIN_RFID_RESET				GPIO_Pin_6
#define  PORT_RFID_RESET			GPIOA
#define  PIN_UART1_TX				GPIO_Pin_15
#define  PORT_UART1_TX				GPIOA
#define  PIN_UART1_RX				GPIO_Pin_14
#define  PORT_UART1_RX				GPIOA

void SuppliseAuth_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = PIN_RFID_RESET;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(PORT_RFID_RESET, &GPIO_InitStruct);
	GPIO_Config(PORT_RFID_RESET, PIN_RFID_RESET, OUTPUT_HIGH); 

	//复位  
	(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
	delay_ms(50);
	(GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET));
	delay_ms(50);
	(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
	delay_ms(50);

	/* Configure serial ports 0 RX and TX for IO. */
	GPIO_Config(PORT_UART1_TX, PIN_UART1_TX, UART1_TXD);
	GPIO_Config(PORT_UART1_RX, PIN_UART1_RX, UART1_RXD);

	UART_InitTypeDef UART_InitStruct;
	UART_InitStruct.BaudRate    = RFID_UART_BAUD;			
	UART_InitStruct.DataBits    = Databits_8b;
	UART_InitStruct.StopBits    = StopBits_1;
	UART_InitStruct.Parity      = Parity_None;
	UART_InitStruct.FlowCtrl    = FlowCtrl_None;
	UART_InitStruct.Mode        = Mode_duplex;
	UART_Init(UART_SUPPLIES_AUTH, &UART_InitStruct);
	TRNG_Init();
	PTAuth_Init(SUPPLIES_AUTH_PASSWORD);
//    portPTAUTH_CommSetUartBaudrate(9600);
}
BOOL SuppliseAuth_Reset(void)
{
//	(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
//	vTaskDelay(50);
//	(GPIO_ResetBits(PORT_RFID_RESET, PIN_RFID_RESET));
//	vTaskDelay(50);
//	(GPIO_SetBits(PORT_RFID_RESET, PIN_RFID_RESET));
//	vTaskDelay(50);
//    PTAuth_Init(SUPPLIES_AUTH_PASSWORD);
}
BOOL SuppliseAuth_Check(UINT32 decLen, UINT32 *pLastLen)
{
    ENUM_PTAUTH_ERROR_CODE status;
    ENUM_SUPPLIES_TYPE supType = 0;
  //  for(BYTE i = 0; i < MAX(1, 3); i++)
    {
        status = PTAuth_Check(decLen, pLastLen, &supType);
//        if(status == PTAUTH_NO_ERROR)
//        {
//            break;
//        }
    }
    
//    MyPrintf("S:%02X,%02X\r\n", status, *pType);
    if(status != PTAUTH_NO_ERROR)
    {
        return 0;
    }
    if((supType != SUPPLIES_PT20_SUPPLIES) && (supType != SUPPLIES_PT26_SUPPLIES) && (supType != 9))
    {
        return 0;               
    }
    return 1;
}
///*******************************************************************************
//* 名称:		RFID_Test       
//* 描述:		RFID 测试 
//* 输入参数:	无  
//* 输出参数:	无   
//* 其它:		//400-500byte 
//*******************************************************************************/
//void RFID_Test()
//{
//	uint32_t curr_count = 0;
//	static uint32_t last_count = 0;
//	
//	#if USE_RFID
//		curr_count = SysTick_GetMyTick();
//		if(curr_count - last_count > 100)
//		{
//			last_count = curr_count;
//			
//			uint32_t temp_len = 0;
//			ENUM_PTAUTH_ERROR_CODE   errcode = 0;
//			ENUM_SUPPLIES_TYPE		 rfid_type = 0;
//		
//			errcode = PTAuth_Check(0,&temp_len,&rfid_type);		//长度信息 
//			//MyPrintf("type:%d,errcode:%d,len:%d\r\n",rfid_type,errcode,temp_len);
//		}
//	#endif
//}


























//                  hal_SuppliesAuth.h



/****************************************************************************
 * File Name: hal_SuppliesAuth.h
 *
 * Description:
 *					hal_SuppliesAuth
 *
 * --------------------------------------------------------------------
 * Revision	Author		Date		Comment
 * --------------------------------------------------------------------
 * 1.0          Junrong         2021/11/14		Original
 *
 *****************************************************************************/
#ifndef __HAL_SUPPLIES_AUTH_H__
#define __HAL_SUPPLIES_AUTH_H__

#include "hal.h"
#include "libPTAuthHF.h"



void SuppliseAuth_Init(void);
BOOL SuppliseAuth_Check(UINT32 decLen, UINT32 *pLastLen);
BOOL SuppliseAuth_Reset(void);

#endif




























//                       Types.h

/****************************************************************************
 * File Name: Types.h
 *
 * Description:
 *					Type defines
 *
 * --------------------------------------------------------------------
 * Revision	Author		Date		Comment
 * --------------------------------------------------------------------
 * 1.0          Junrong         2016/02/29		Original
 *
 *****************************************************************************/
#ifndef __TYPES_H__
#define __TYPES_H__

#include "stdint.h"
typedef uint8_t 	UINT8, BYTE;
typedef uint16_t 	UINT16;
typedef uint32_t 	UINT32;
typedef uint64_t 	UINT64;
typedef int8_t 		INT8;
typedef int16_t 	INT16;
typedef int32_t 	INT32;
typedef int64_t 	INT64;

typedef BYTE BOOL;
//#define NULL ((void *)0)
typedef void *HANDLE;

//#define TRUE 	1
//#define FALSE	0

#define MIN(a, b)  ((((int)a) < ((int)b)) ? (a) : (b))
#define MAX(a, b)  ((((int)a) > ((int)b)) ? (a) : (b))
#define ABS(a)     (((a) > 0  ) ? (a) : (-a))


#endif






























//             C:\Users\Administrator\Desktop\PT26_Project\Librarier\core\type.h



/*
File Name    : type.h
Author       : Yichip
Version      : V1.0
Date         : 2018/05/25
Description  : Data type definition.
*/

#ifndef __TYPE_H__
#define __TYPE_H__

typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;
typedef unsigned char      byte;
typedef unsigned short     word;

typedef signed char       int8_t;
typedef signed short      int16_t;
typedef signed int        int32_t;
typedef signed long long  int64_t;

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;

#define STATIC 	static
#define DWORD 	uint32_t
#define WORD		uint32_t
#define BYTE 		uint8_t
#define VOID		void
#define INT		int32_t
#define UINT		uint32_t

#define FLOAT		float
#define SHORT		int16_t

#define CONST		const


typedef struct BitChar {
	unsigned B0:1;//固定为1
	unsigned B1:1;//固定为0
	unsigned B2:1;//正在执行打印
	unsigned B3:1;//打印完毕
	unsigned B4:1;//打印机有错误(包括:缺纸、上盖、机头过热、写RFID出错);
	unsigned B5:1;//暂停状态
	unsigned B6:1;//打印内容被取消
	unsigned B7:1;//保留
} SBitChar;


typedef struct Bitshort {
	unsigned B0: 1;//固定为1
	unsigned B1: 1;//固定为0
	unsigned B2: 1;//缺纸
	unsigned B3: 1;//上盖打开
	unsigned B4: 1;//机芯异常
	unsigned B5: 1;//打印头过热
	unsigned B6: 1;//插入碳带不可识别
	unsigned B7: 1;//碳带用尽

	unsigned B8: 1;//写RFID出错
	unsigned B9: 1;//剪切出错
	unsigned B10:1;//打印异常(堵转)
	unsigned B11:1;//电池电量过低
	unsigned B12:1;//未检测到标签
	unsigned B13:1;
	unsigned B14:1;
	unsigned B15:1;
} SBitshort;


typedef union  CharField{
	unsigned char	byte;
	SBitChar	field;
} UCharField;

typedef union  shortField{
	unsigned char	byte[2];
	SBitshort	field;
} UshortField;


#define RCV_TYPE_BLE	0

#define RCV_TYPE_SPP	1

#define RCV_TYPE_USB	2
	
#define RCV_TYPE_UART	3

#define NO_PAPER			0
#define FULL_PAPER 			1
#define GAP_PAPER 			2
#define FULL_TO_FULL_PAPER 	0x11
#define FULL_TO_GAP_PAPER 	0x12
#define GAP_TO_FULL_PAPER 	0x21
#define GAP_TO_GAP_PAPER 	0x22
#define GAP_ADJ_COUNT_MAX	4

#define POWER_OFF_DELAY	60000
//#define USE_NO_PAPER_DET
#define USE_BLE
#define USE_BAT_DET
//#define USE_PAUSE_KEY
#define USE_LCD
#define USE_PWM_BEEP
#define USE_LCD_IIC_PORT

#ifndef Boolean
typedef enum {FALSE = 0, TRUE = 1} Boolean;
#define IS_BOOLEAN(bool) ((bool == FALSE) || (bool == TRUE))
#endif

#ifndef FunctionalState
typedef enum {DISABLE = 0, ENABLE = 1} FunctionalState;
#define IS_FUNCTIONAL_STATE(state) ((state== DISABLE) || (state == ENABLE))
#endif

#ifndef FunctionalState
typedef enum {ERROR = 0, SUCCESS = 1} ErrorStatus;
#define IS_ERROR_STATE(status) ((status== ERROR) || (status == SUCCESS))
#endif

#ifndef FlagStatus
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
#endif

#endif /*__TYPE_H__*/



























//    PT26_Project\Librarier\sdk\     yc_ipc.c


#include "yc_ipc.h"

//#define	IPC_DEBUG

IPC_TypeDef *IpcRx = (IPC_TypeDef *)(IPC_RX_START_ADDR);
IPC_TypeDef *IpcTx = (IPC_TypeDef *)(IPC_TX_START_ADDR);

uint8_t ipcrecbuf[IPCREVSIZE] = {0};
uint8_t bt_lpm_mode=0;

Boolean IPC_have_data()
{
    return HR_REG_16BIT(&IpcRx->ReadPtr) != HR_REG_16BIT(&IpcRx->WrtiePtr) ? TRUE : FALSE;
}

uint16_t IPC_get_available_size()
{
	uint16_t retLen=0;
    if(bt_lpm_mode==1)
    {
        WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
        IPC_HOLD_BT  = 1;
        delay_ms(10);
    }
    uint16_t readtx = HR_REG_16BIT(&IpcTx->ReadPtr);
    uint16_t wrtptr = HR_REG_16BIT(&IpcTx->WrtiePtr);
    uint16_t ipcendaddr = HR_REG_16BIT(&IpcTx->IpcEndAddr);
    uint16_t ipcstartaddr = HR_REG_16BIT(&IpcTx->IpcStartAddr);

    if (readtx > wrtptr)
    {
        retLen = readtx - wrtptr;
    }
    else
    {
        retLen = ((ipcendaddr - ipcstartaddr + 1) - (readtx - wrtptr));
    }
    if(bt_lpm_mode==1)
    {
        IPC_HOLD_BT = 0;
        WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
    }
    return retLen;
}

void IPC_TxData(HCI_TypeDef *IpcData)
{
	#ifdef IPC_DEBUG
	PrintHCIPack(IpcData,"tx");
	#endif
    if(bt_lpm_mode==1)
    {
        WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
        IPC_HOLD_BT  = 1;
        delay_ms(10);
    }
    uint16_t Wptr  = HR_REG_16BIT(&IpcTx->WrtiePtr);
    uint16_t Len   = IpcData->DataLen + 3;
    uint8_t *Rptr = (uint8_t *)IpcData;
    while (Len--)
    {
        HW_IPC_REG_8BIT(Wptr, *Rptr++);
        RB_UPDATE_PTR(Wptr, HR_REG_16BIT(&IpcTx->IpcStartAddr),  HR_REG_16BIT(&IpcTx->IpcEndAddr));
        if (Len == IpcData->DataLen)
        Rptr = IpcData->p_data;
    }

    HW_REG_16BIT(&IpcTx->WrtiePtr, (uint32_t)Wptr);
    if(bt_lpm_mode==1)
    {
        IPC_HOLD_BT = 0;
        WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
    }
}

Boolean IPC_PutBtData(const void *buf, uint32_t size)
{
    if (size == 0 || size > 258)
    {
        return FALSE;
    }
    if(bt_lpm_mode==1)
    {
        WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
        IPC_HOLD_BT  = 1;
        delay_ms(10);
    }
    uint16_t Wptr  = HR_REG_16BIT(&IpcTx->WrtiePtr);
    uint8_t *Rptr = (uint8_t *)buf;
    while (size--)
    {
        HW_IPC_REG_8BIT(Wptr, *Rptr++);
        RB_UPDATE_PTR(Wptr, HR_REG_16BIT(&IpcTx->IpcStartAddr),  HR_REG_16BIT(&IpcTx->IpcEndAddr));
    }

    HW_REG_16BIT(&IpcTx->WrtiePtr, (uint32_t)Wptr);
    if(bt_lpm_mode==1)
    {
        IPC_HOLD_BT = 0;
        WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
    }
    return TRUE;
}

Boolean IPC_ReadBtData(HCI_TypeDef *IpcData)
{
    if (HR_REG_16BIT(&IpcRx->ReadPtr) != HR_REG_16BIT(&IpcRx->WrtiePtr))
    {
        uint16_t Rptr = HR_REG_16BIT(&IpcRx->ReadPtr);
        IpcData->type = HR_IPC_REG_8BIT(Rptr);
        RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
        IpcData->opcode = HR_IPC_REG_8BIT(Rptr);
        RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
        IpcData->DataLen = HR_IPC_REG_8BIT(Rptr);
        RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
        for (uint8_t i = 0; i < IpcData->DataLen; i++)
        {
            IpcData->p_data[i] = HR_IPC_REG_8BIT(Rptr);
            RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
        }
        HW_REG_16BIT(&IpcRx->ReadPtr, (uint32_t)Rptr);
		#ifdef IPC_DEBUG
		PrintHCIPack(IpcData,"rx");
		#endif
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

Boolean IPC_GetBtData(void *buf, uint32_t *size)
{
    uint32_t i = 0;
    uint16_t Rptr = HR_REG_16BIT(&IpcRx->ReadPtr);
    if (*size == 0)
    {
        *size = 0;
        return FALSE;
    }
    if (TRUE == IPC_have_data())
    {
        while (Rptr != HR_REG_16BIT(&IpcRx->WrtiePtr) && i < (*size))
        {
            ((uint8_t *)buf)[i++] = HR_IPC_REG_8BIT(Rptr);
            RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
        }
        HW_REG_16BIT(&IpcRx->ReadPtr, (uint32_t)Rptr);
        *size = i;
        return TRUE;
    }
    else
    {
        *size = 0;
        return FALSE;
    }
}

static void noinline _dma_start(int ch, const void *src, int srclen, void *dest, int dstlen)
{
    DMA_SRC_ADDR(ch)  = (int)src;
    DMA_DEST_ADDR(ch) = (int)dest;
    DMA_LEN(ch)       = srclen << 16 | dstlen;
    DMA_START(ch)     = 0x80;
}

void noinline _dma_wait(int ch)
{
    while (!(DMA_STATUS(ch) & 1));
}

void _dmacopy(void *dest, void *src, int len)
{
    _dma_start(DMACH_MEMCP, src, len, dest, len);
    _dma_wait(DMACH_MEMCP);
}

void _download_btcode(const byte *btcode)
{
    int addr, len;
    btcode += 2;
    if (GETWORD(btcode) != 0x55aa)
        return;
    btcode += 2;
    enable_clock(CLKCLS_BT);
    len = GETWORD(btcode);
    btcode += 2;
    BT_UCODE_LO   = 0;
    BT_UCODE_HI   = 0;
    BT_UCODE_CTRL = 0x80;
    DMA_CONFIG(DMACH_MEMCP) = 8;
    _dmacopy((byte *)&BT_UCODE_DATA, (byte *)btcode, len);
    BT_UCODE_CTRL = 0;
    btcode       += len;
    DMA_CONFIG(DMACH_MEMCP) = 0;

    while (GETWORD(btcode) == 0x55aa)
    {
        btcode += 2;
        len  = GETWORD(btcode);
        btcode += 2;
        addr = GETWORD(btcode) | 0xc0000;
        btcode += 2;
        if(addr==MEM_SPP_FLOWCTRL_FLAG_ADDR && len==0x0004)
        {
            byte mem_spp_flowctrl_buf[4];
            mem_spp_flowctrl_buf[0]=MEM_SPP_FLOWCTRL_FLAG_VALUE;
            memcpy((byte*)&mem_spp_flowctrl_buf[1],btcode+1,3);
            _dmacopy((byte *)addr, mem_spp_flowctrl_buf, len);
        }
        else if(addr==MEM_RFCOMM_LMP_DIS_FLAG_ADDR && len==0x0001)
        {
            byte mem_rfcomm_lmp_dis_flag;
            mem_rfcomm_lmp_dis_flag=MEM_RFCOMM_LMP_DIS_FLAG_VALUE;
            _dmacopy((byte *)addr, (byte *)&mem_rfcomm_lmp_dis_flag, len);
        }
        else
        {
          _dmacopy((byte *)addr, (byte *)btcode, len);
        }
        btcode += len;
    }
}

//extern uint8_t BT_Wake;
extern const unsigned char bt_code[];

void erase_memory(void)
{
    for (uint32_t i = 0; i < 0x1000; i++)
    {
        *(volatile uint8_t *)(0xc0000 + i) = 0;
        delay_us(1);
        *(volatile uint8_t *)(0xc4000 + i) = 0;
        delay_us(1);
    }
}
#if (VERSIONS == NO_BT)
static uint16_t get_dpll_status(void)
{
    uint16_t addr = 0;
    addr  = (*(uint8_t *)(0xc800e));
    delay_us(1100);
    addr += (*(uint8_t *)(0xc800f)) << 8;
    delay_us(1100);
    return addr;
}

static Boolean is_dpll_opend(void)
{
    uint16_t addr =  get_dpll_status();

    Boolean ret = FALSE;

    if ((0x4c77 == addr) || (0x4c78 == addr) || (0x4c79 == addr))
    {
        ret = TRUE;
    }
    else
    {
        ret = FALSE;
    }
    MyPrintf("is_dpll_opend=%x-%x", addr, ret);
    return ret;
}
#endif

Boolean ipc_inited = FALSE;
void IpcInit(void)
{
#if (VERSIONS == EXIST_BT)
    if (ipc_inited == FALSE)
    {
        disable_intr(INTR_BT);
        ipc_inited = TRUE;
        SYSCTRL_ROM_SWITCH = 0x94;
        //delay(10000);   //wait rom switch ok
        delay_ms(10);
        BT_RESET = 1;
        //delay(10000);   //wait for reset ok
        delay_ms(1);
        while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
        BT_CONFIG &= (~(1 << BT_INIT_FLAG));
        lpm_bt_write(1, lpm_bt_read(1)|0xd00000);
        lpm_bt_write(0, 0x3084cf0f);
        erase_memory();
        _download_btcode(bt_code);
        WAKEUP_BT = 0x9c;
        delay_ms(100);
    }
#elif (VERSIONS == NO_BT)
    if (ipc_inited == FALSE || is_dpll_opend() == FALSE)
    {
        disable_intr(INTR_BT);
        ipc_inited = TRUE;

        SYSCTRL_ROM_SWITCH = 0x94;
        //delay(10000);   //wait rom switch ok
        delay_ms(10);

        lpm_bt_write(1, 0xd00000);
        //delay_us(1000);
        delay_ms(1);

        BT_RESET = 1;
        //delay(10000);   //wait for reset ok
        delay_ms(1);
        while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
        BT_CONFIG &= (~(1 << BT_INIT_FLAG));
		lpm_bt_write(1, 0xd00000);
        lpm_bt_write(0, 0x3084cf0f);
        erase_memory();
        *(volatile uint8_t *)0xC4176 = 0x0f;
        *(volatile uint8_t *)0xC4177 = 0x84;
        *(volatile uint8_t *)0xC4178 = 0x30;
        *(volatile uint8_t *)0xC4179 = 0x0a;
        *(volatile uint8_t *)0xC40c3 = 0x00;
        *(volatile uint8_t *)0xC40c4 = 0x4f;
        *(volatile uint8_t *)0xC4f00 = 0xff;
        delay_ms(60);
        *(volatile uint8_t *)0xC8042 = 0x06;
    }
#elif (VERSIONS == NO_XTAL)
    if (ipc_inited == FALSE)
    {
        disable_intr(INTR_BT);
        ipc_inited = TRUE;

        SYSCTRL_ROM_SWITCH = 0x94;
        delay_ms(10); //wait rom switch ok

        lpm_bt_write(1, 0xd00000);
        delay_ms(1);

        BT_RESET = 1;
        delay_ms(1); //wait for reset ok
        while (!(BT_CONFIG & (1 << BT_INIT_FLAG)));
        BT_CONFIG &= (~(1 << BT_INIT_FLAG));
		lpm_bt_write(1, 0xd00000);
        lpm_bt_write(0, 0x3084cf0f);
    }
#endif
}

//打印HCI数据包
void PrintHCIPack(HCI_TypeDef *msg, const char *str)
{
    MyPrintf("M0 %s:\n", str);
    MyPrintf("%s Type:%02x\n", str, msg->type);
    MyPrintf("%s OPCode: %02x\n", str, msg->opcode);
    MyPrintf("%s Length: %02x\n", str, msg->DataLen);
    MyPrintf("%s Data:\n", str);
	if(msg->DataLen!=0xb8&&msg->DataLen!=0xff)
	{
		for (uint8_t cnt = 0; cnt < msg->DataLen; cnt++)
		{
			MyPrintf("%02x ", msg->p_data[cnt]);
			if ((cnt % 16) == 0&&cnt!=0)
				MyPrintf("\n");
		}

	
	}

    MyPrintf("\n");
}






























//            C:\Users\Administrator\Desktop\PT26_Project\Librarier\sdk\yc_sysctrl.c


#include "yc_sysctrl.h"

void SYSCTRL_AHBPeriphClockCmd(uint32_t SYSCTRL_AHBPeriph, FunctionalState NewState)
{
    _ASSERT(IS_SYSCTRL_AHB_PERIPH(SYSCTRL_AHBPeriph));
    if (NewState == DISABLE)
    {
        SYSCTRL_CLK_CLS |= SYSCTRL_AHBPeriph;
    }
    else
    {
        SYSCTRL_CLK_CLS &= ~SYSCTRL_AHBPeriph;
    }
}

void SYSCTRL_EnterSleep(SleepMode_TypeDef SleepMode)
{
    _ASSERT(IS_ALL_SLEEP_MODE(SleepMode));
    *LPM_SLEEP = 0x5a;
}

void noinline HCLKConfig_Div_None(uint32_t HCLK_Div)
{
    QSPI_CTRL  |= (0x80);
    int temp = (SYSCTRL_HCLK_CON & (~SYSCTRL_HCLK_COFG_REGBIT)) | HCLK_Div;
    SYSCTRL_HCLK_CON =  temp;
}

void SYSCTRL_HCLKConfig(uint32_t HCLK_Div)
{
    _ASSERT(IS_GET_SYSCTRL_HCLK_DIV(HCLK_Div));
    __asm("CPSID i");
    if (HCLK_Div == SYSCTRL_HCLK_Div_None)
    {
        uint32_t HCLKConfig_Div_None_addr = (uint32_t)HCLKConfig_Div_None;
        ((void(*)(void *, void *))FUNC_PREFETCH)(((uint32_t *)HCLKConfig_Div_None_addr), ((uint32_t *)(HCLKConfig_Div_None_addr + 64)));
        HCLKConfig_Div_None(HCLK_Div);
    }
    else
    {
        int temp = (SYSCTRL_HCLK_CON & (~SYSCTRL_HCLK_COFG_REGBIT)) | HCLK_Div;
        SYSCTRL_HCLK_CON =  temp;
    }
    __asm("CPSIE i");
}

void SYSCTRL_GetClocksFreq(SYSCTRL_ClocksTypeDef *SYSCTRL_Clocks)
{
    SYSCTRL_Clocks->HCLK_Frequency = CPU_MHZ;
}

void SYSCTRL_EnableDpllClk(void)
{
    enable_clock(CLKCLS_BT);
    SYSCTRL_ROM_SWITCH = 0x94;
    delay(500);

    *(volatile byte *)0xc4ab1 = 0x7f;
    *(volatile byte *)0xc4ab2 = 0xff;
    *(volatile byte *)0xc4ab3 = 0xff;

    *(volatile byte *)0xc40c3 = 0xb1;
    *(volatile byte *)0xc40c4 = 0x4a;

    BT_CLKPLL_EN = 0xff;
}



























//     G:\Git_file\YC3121_PT26\Librarier\sdk\yc_bt.c



#include "yc_bt.h"
#include "yc_systick.h"
#include "yc_timer.h"
#include "yc_ipc.h"

#define BT_LOG  0
#define     BT_ERROR_LOG



static tick StartTick;
static uint32_t HCI_CMD_BIT_FLAG[2] = {0};
#define BTTIMEOUT 500
//#define BT_BUFSIZE 2048
#define BT_BUFSIZE 0x1000

uint8_t rcvbuf[BT_BUFSIZE] = {0};
extern uint8_t ipcrecbuf[IPCREVSIZE];

//static BT_BufTypeDef BluetoothBuf;
 BT_BufTypeDef BluetoothBuf;

static uint8_t CmdRepData[5];
static int PacketNum = 0;

extern IPC_TypeDef *IpcTx;
extern IPC_TypeDef *IpcRx;
extern uint8_t bt_lpm_mode;

HCI_TypeDef hci_bt;

void BT_BIT_SET(uint32_t *a, int b)
{
    if (b < 32)
    {
        a[0] |= (1 << b);
    }
    else
    {
        a[1] |= (1 << (b - 32));
    }
}

void BT_BIT_CLEAR(uint32_t *a, int b)
{
    if (b < 32)
    {
        a[0] &= ~(1 << b);
    }
    else
    {
        a[1] &= ~(1 << (b - 32));
    }
}

Boolean BT_BIT_GET(uint32_t *a, int b)
{
    if (b < 32)
    {
        return (Boolean)((a[0] & (1 << b)) >> b);
    }
    else
    {
        return (Boolean)((a[1] & (1 << (b - 32))) >> (b - 32));
    }
}

static void SkipData(int Num)
{
    BluetoothBuf.ReadIndex += Num;
    if (BluetoothBuf.ReadIndex >= BluetoothBuf.BufSize)    BluetoothBuf.ReadIndex -= BluetoothBuf.BufSize;
    NVIC_DisableIRQ(BT_IRQn);
    BluetoothBuf.count -= Num;
    NVIC_EnableIRQ(BT_IRQn);
}

static void SaveData(uint8_t *data, int len)
{
    int i;
    if (BluetoothBuf.count + len > BluetoothBuf.BufSize)
    {
#ifdef BT_ERROR_LOG
        MyPrintf("BluetoothBuf full\r\n");
#endif
        return;
    }
    for (i = 0; i < len; i++)
    {
        BluetoothBuf.pBuf[BluetoothBuf.WriteIndex] = data[i];
        BluetoothBuf.count++;
        BluetoothBuf.WriteIndex++;
        if (BluetoothBuf.WriteIndex >= BluetoothBuf.BufSize)   BluetoothBuf.WriteIndex = 0;
    }
}

//#define PrintLog
#define DOMAIN_MAX_LEN  62
Boolean BNEP_DomainConvert(unsigned char *domainString, unsigned char domainStringLen, unsigned char *newDomainString, int *newDomainStringIndex)
{
#ifdef PrintLog
    MyPrintf("input domain:%s \n", domainString);
#endif
    unsigned char domainCount = 0;
    *newDomainStringIndex = 1;
    int newDomainDelimiterIndex = 0;
#ifdef PrintLog
    MyPrintf("domain hex:\n");
    for (int i = 0; i < domainStringLen; i++)
    {
        MyPrintf("%02X ", domainString[i]);
    }
    MyPrintf("\n");
#endif
    while (domainStringLen--)
    {
        domainCount++;
        if (*domainString == '.')
        {
            newDomainString[newDomainDelimiterIndex] = domainCount - 1;
            newDomainDelimiterIndex = *newDomainStringIndex;
            (*newDomainStringIndex)++;
            if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
            domainCount = 0;
        }
        else
        {
            newDomainString[(*newDomainStringIndex)++] = *domainString;
            if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
        }
        domainString++;
    }
    newDomainString[newDomainDelimiterIndex] = domainCount;
    newDomainString[(*newDomainStringIndex)++] = 00;
    if ((*newDomainStringIndex) >= DOMAIN_MAX_LEN) return FALSE;
#ifdef PrintLog
    MyPrintf("format Domain:\n");
    for (int  i = 0; i < *newDomainStringIndex; i++)
    {
        MyPrintf("%02X ", newDomainString[i]);
    }
    MyPrintf("\n");
#endif
    return TRUE;
}

Boolean BT_Init()
{
	
    BluetoothBuf.BufSize =  BT_BUFSIZE;
    BluetoothBuf.pBuf = rcvbuf;
    BluetoothBuf.count = 0;
    BluetoothBuf.ReadIndex = 0;
    BluetoothBuf.WriteIndex = 0;
    HCI_CMD_BIT_FLAG[0] = 0; //全局变量问题优化
    HCI_CMD_BIT_FLAG[1] = 0;
    StartTick = 0;
    PacketNum = 0;
    int i;
    for (i = 0; i < 5; i++)    CmdRepData[i] = 0;
    for (i = 0; i < BT_BUFSIZE; i++)   rcvbuf[i] = 0;
    hci_bt.p_data =  ipcrecbuf;
    IpcInit();
#ifdef BT_ERROR_LOG
    MyPrintf("BT_Init end\n");
#endif
    return TRUE;
}

Boolean BT_WakeupInit()
{
    BluetoothBuf.BufSize =  BT_BUFSIZE;
    BluetoothBuf.pBuf = rcvbuf;
    BluetoothBuf.count = 0;
    BluetoothBuf.ReadIndex = 0;
    BluetoothBuf.WriteIndex = 0;
    hci_bt.p_data =  ipcrecbuf;
    enable_intr(INTR_BT);
    bt_lpm_mode = 1;
    BT_SetLpmMode(0x00);
#ifdef BT_ERROR_LOG
    MyPrintf("BT_Wakeup Init end\n");
#endif
    return TRUE;
}

static uint8_t GetData(Boolean UpdataAnalyzeIndex)
{
    uint8_t TempData;
    TempData = BluetoothBuf.pBuf[BluetoothBuf.ReadIndex];
    if (UpdataAnalyzeIndex)
    {
        NVIC_DisableIRQ(BT_IRQn);
        BluetoothBuf.count--;
        NVIC_EnableIRQ(BT_IRQn);
        BluetoothBuf.ReadIndex++;
        if (BluetoothBuf.ReadIndex >= BluetoothBuf.BufSize)    BluetoothBuf.ReadIndex = 0;
    }
    return TempData;
}


static Boolean  SendCMD(HCI_TypeDef *msg)
{
    if ((msg->DataLen + 3) > IPC_get_available_size())
    {
#ifdef BT_ERROR_LOG
        MyPrintf("IPC BT Tx FULL\n");
#endif
        return FALSE;
    }
    msg->type = HCI_CMD;
#if BT_LOG
    MyPrintf("Print Send Data Pack:\n");
    PrintHCIPack(msg, "Send");//打印发送包
#endif
    IPC_TxData(msg);
    return TRUE;
}
Boolean BT_SetBtAddr(uint8_t *bt_addr)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_BT_ADDR;
    msg.DataLen = 6;
    msg.p_data = bt_addr;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}


Boolean BT_SetBleAddr(uint8_t *bt_addr)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_BLE_ADDR;
    msg.DataLen = 6;
    msg.p_data = bt_addr;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

Boolean BT_SetVisibility(Boolean bt_discoverable, Boolean bt_connectability, Boolean ble_discoverable)
{
    HCI_TypeDef msg;
    uint8_t visibility_data = 0;
    if (bt_discoverable == 1)
        visibility_data = visibility_data | 0x01;
    if (bt_connectability == 1)
        visibility_data = visibility_data | 0x02;
    if (ble_discoverable == 1)
        visibility_data = visibility_data | 0x04;

    msg.opcode = HCI_CMD_SET_VISIBILITY;
    msg.DataLen = 0x01;
    msg.p_data = &visibility_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetBtName(uint8_t *bt_name, uint16_t name_len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_BT_NAME;
    msg.DataLen = name_len;
    msg.p_data  = bt_name;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}


Boolean BT_SetBleName(uint8_t *ble_name, uint16_t name_len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_BLE_NAME;
    msg.DataLen = name_len;
    msg.p_data  = ble_name;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}


Boolean BT_SendSppData(uint8_t *spp_data, uint16_t DataLen)
{
    if (DataLen == 0 || DataLen > MAX_BLUETOOTH_DATA_LEN)  return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SEND_SPP_DATA;
    msg.DataLen = DataLen;
    msg.p_data = spp_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA))
        {
            //MyPrintf("bt send is successed\n");
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
	MyPrintf("bt send is failed\n");
    return FALSE;
}

Boolean BT_SendBleData(uint8_t *ble_data, uint16_t DataLen)
{
    if (DataLen < 2 || DataLen > MAX_BLUETOOTH_DATA_LEN)   return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SEND_BLE_DATA;
    msg.DataLen = DataLen;

    msg.p_data = ble_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA))
        {

			//MyPrintf("send is successed\n");
            return TRUE;
			
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
	MyPrintf("send is failed\n");
    return FALSE;
}


uint8_t Bt_GetBtStatus(void)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_STATUS_REQUEST;
    msg.DataLen = 0;
    msg.p_data = NULL;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST))
        {
            return CmdRepData[0];
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
	//

	return 0x80;
}

Boolean BT_SetParingMode(uint8_t mode)
{
    uint8_t tmode = mode ;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_PAIRING_MODE;
    msg.DataLen = 1;
    msg.p_data = &tmode;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetPincode(uint8_t *Pincode, uint8_t DataLen)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_PINCODE;
    msg.DataLen = DataLen;
    msg.p_data = Pincode;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}



Boolean BT_BtDisconnect(void)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_BT_DISCONNECT;
    msg.DataLen = 0;
    msg.p_data = NULL;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

uint32_t BT_GetVersion(void)
{
    HCI_TypeDef msg;
    uint32_t TempVersion = 0;
    msg.opcode = HCI_CMD_VERSION_REQUEST;
    msg.DataLen = 0;
    msg.p_data = NULL;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_GET_VERSION);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_GET_VERSION))
        {
            TempVersion = (CmdRepData[0] << 8) | (CmdRepData[1]);
            return TempVersion;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return 0;
}


Boolean BT_BleDisconnect(void)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_BLE_DISCONNECT;
    msg.DataLen = 0;
    msg.p_data = NULL;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}


Boolean BT_SetNVRAM(uint8_t *NvData, int len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_NVRAM;
    msg.DataLen = len;
    msg.p_data = NvData;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}


Boolean BT_EnterSleepMode(void)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_ENTER_SLEEP_MODE;
    msg.DataLen = 0;
    msg.p_data = NULL;
    SendCMD(&msg);
    return TRUE;
}

Boolean BT_SetLpmMode(uint8_t mode)
{
    HCI_TypeDef msg;
    uint8_t temp_mode = mode;
    msg.opcode = HCI_CMD_SET_LPM_MODE;
    msg.DataLen = 1;
    msg.p_data = &temp_mode;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE))
        {
            bt_lpm_mode = mode;
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}


Boolean BT_ConfirmGkey(uint8_t isMatching)
{
    HCI_TypeDef msg;
    uint8_t tmismatching = isMatching;
    msg.opcode = HCI_CMD_CONFIRM_GKEY;
    msg.DataLen = 1;
    msg.p_data = &tmismatching;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetSppFlowcontrol(uint8_t packetNum)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_GET_CREADIT_GIVEN;
    msg.DataLen = 1;
    uint8_t temp_packetNum = packetNum;
    msg.p_data = &temp_packetNum;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_GET_CREADIT_GIVEN);
    SendCMD(&msg);
    return TRUE;//no event responce
}


Boolean BT_PasskeyEntry(uint8_t *key_data)
{
#define PKLEN 0x04
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_PASSKEY_ENTRY;
    msg.DataLen = PKLEN;
    msg.p_data = key_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetLEParing(uint8_t mode)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SET_PAIRING;
    msg.DataLen = 1;
    uint8_t temp_mode = mode;
    msg.p_data = &temp_mode;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetLEAdvData(uint8_t *adv_data, int DataLen)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SET_ADV_DATA;
    msg.DataLen = DataLen;
    msg.p_data = adv_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetLEScanData(uint8_t *scan_data, int DataLen)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SET_SCAN_DATA;
    msg.DataLen = DataLen;
    msg.p_data = scan_data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetLESendConnUpdate(uint8_t *data, int len)
{
    if (0x08 != len)
        return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SEND_CONN_UPDATE_REQ;
    msg.DataLen = len;
    msg.p_data = data;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetLEAdvInterval(uint16_t ble_adv_interval)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SET_ADV_PARM;
    msg.DataLen = 2;
    uint8_t ble_adv_interval_buf[2];
    ble_adv_interval_buf[0] = (ble_adv_interval & 0xff);
    ble_adv_interval_buf[1] = ((ble_adv_interval >> 8) & 0xff);
    msg.p_data = ble_adv_interval_buf;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}



Boolean BT_RejectJustWork(uint8_t justwork)
{
    uint8_t td = justwork;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_REJECT_JUSTWORK;
    msg.DataLen = 0x01;
    msg.p_data = &td;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetTxPower(uint8_t power)
{
    uint8_t tpower = power;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_TX_POWER;
    msg.DataLen = 0x01;
    msg.p_data = &tpower;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_Set_FixedPasskey(uint8_t *key)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_LE_SET_FIXED_PASSKEY;
    msg.DataLen = 0x05;
    msg.p_data = key;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

Boolean BT_SetCOD(uint8_t *bt_cod)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SET_COD;
    msg.DataLen = 3;
    msg.p_data = bt_cod;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_SET_COD);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_SET_COD))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}


Boolean BT_DeleteService(void)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_DELETE_CUSTOMIZE_SERVICE;
    msg.DataLen = 0;
    msg.p_data = NULL;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return FALSE;
}

uint16_t BT_AddBleService(uint8_t *ble_service_uuid, uint16_t service_uuid_len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_ADD_SERVICE_UUID;
    msg.DataLen = service_uuid_len;
    msg.p_data  = ble_service_uuid;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID))
        {
            return (uint16_t)(CmdRepData[0] | (CmdRepData[1] << 8));
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return 0x00;
}




uint16_t BT_AddBleCharacteristic(uint8_t *ble_Characteristic_uuid, uint16_t service_Characteristic_payload_len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_ADD_CHARACTERISTIC_UUID;
    msg.DataLen = service_Characteristic_payload_len;
    msg.p_data  = ble_Characteristic_uuid;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID))
        {
            return (uint16_t)(CmdRepData[0] | (CmdRepData[1] << 8));
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
    return 0x00;
}

Boolean BT_DnsReq(uint8_t *dns_data, int len)
{
    uint8_t format_dns[DOMAIN_MAX_LEN];
    int format_dns_len;
    if (TRUE != BNEP_DomainConvert(dns_data, len, format_dns, &format_dns_len))
    {
        return FALSE;
    }
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_DNS_REQ;
    msg.DataLen = format_dns_len;
    msg.p_data = format_dns;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DNS_REQ);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DNS_REQ))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

Boolean BT_ConnectBnep(uint8_t *phone_mac_addr, int len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_CONNECT_BNEP;
    msg.DataLen = len;
    msg.p_data = phone_mac_addr;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

Boolean BT_disconnectBnep()
{
    return BT_BtDisconnect();
}

Boolean BT_ConnectTcp(uint8_t *tcp_ip_addr, int len)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_CONNECT_TCP;
    msg.DataLen = len;
    msg.p_data = tcp_ip_addr;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}



Boolean BT_BnepSendTcpData(uint8_t *tcpdata, int len)
{
    if ((len - 1) > MAX_TCP_DATA_LEN)    return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_BNEP_SEND_TCP_DATA;
    msg.DataLen = len;
    msg.p_data = tcpdata;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

#define BIG_DATA_HEAD_LEN   5
Boolean BT_BnepSendTcpBigData(uint8_t *tcpdata, int len)
{
    if ((len - 1) > MAX_BIG_DATA_LEN)    return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SEND_BIG_DATA;
    int sendedLen = 0;
    int packetLen;
    uint8_t firstPacketData[MAX_BLUETOOTH_DATA_LEN];
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
    while (sendedLen < (len - 1))
    {
        if (sendedLen == 0)
        {
            packetLen = (len - 1) > (MAX_BLUETOOTH_DATA_LEN - BIG_DATA_HEAD_LEN) ? (MAX_BLUETOOTH_DATA_LEN - BIG_DATA_HEAD_LEN) : (len - 1);
            msg.DataLen = packetLen + BIG_DATA_HEAD_LEN;
            firstPacketData[0] = tcpdata[0]; //handle

            firstPacketData[1] = ((len - 1) & 0xff);
            firstPacketData[2] = (((len - 1) >> 8) & 0xff); //big packet len

            firstPacketData[3] = 0;
            firstPacketData[4] = 0; //reserved
            memcpy((uint8_t *)&firstPacketData[5], (uint8_t *)&tcpdata[1], packetLen);
            msg.p_data = firstPacketData;
        }
        else
        {
            packetLen = ((len - 1) - sendedLen) > MAX_BLUETOOTH_DATA_LEN ? MAX_BLUETOOTH_DATA_LEN : ((len - 1) - sendedLen);
            msg.DataLen = packetLen;
            msg.p_data = (uint8_t *)&tcpdata[sendedLen + 1];
        }

        BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA);
        SendCMD(&msg);
        StartTick = SysTick_GetTick();
        while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA))
        {
            if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
            {
                return FALSE;
            }
        }
        sendedLen += packetLen;
    }
    //wait big data finish
    StartTick = SysTick_GetTick();
    while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH))
    {
        if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
        {
            return FALSE;
        }
    }
    //wait big data status
    StartTick = SysTick_GetTick();
    while (!BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS))
    {
        if (SysTick_IsTimeOut(StartTick, BTTIMEOUT))
        {
            return FALSE;
        }
    }
    return TRUE;
}


Boolean BT_BnepSendUdpData(uint8_t *udpdata, int len)
{
    if (len < 8 || len > MAX_BLUETOOTH_DATA_LEN)   return FALSE;
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_SEND_UDP_DATA;
    msg.DataLen = len;
    msg.p_data = udpdata;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

Boolean BT_DisconnectTcp(uint8_t tcp_handle)
{
    HCI_TypeDef msg;
    msg.opcode = HCI_CMD_DISCONNECT_TCP;
    msg.DataLen = 1;
    uint8_t temp_tcp_handle = tcp_handle;
    msg.p_data = &temp_tcp_handle;
    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP);
    SendCMD(&msg);
    StartTick = SysTick_GetTick();
    do
    {
        if (BT_BIT_GET(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP))
        {
            return TRUE;
        }
    }
    while (!SysTick_IsTimeOut(StartTick, BTTIMEOUT)); //ms
    return FALSE;
}

void BT_ParseBTData()
{
    //此判断用于防止接收包buf满
    if (BluetoothBuf.BufSize - BluetoothBuf.count < 258)
    {
#if 1
//        MyPrintf("BluetoothBuf full2");
//        MyPrintf("BluetoothBuf.BufSize: %d,BluetoothBuf.count: %d\n", BluetoothBuf.BufSize, BluetoothBuf.count);
		

#endif
        return;
    }

    if (TRUE == IPC_ReadBtData(&hci_bt)) //The packet header has been receive
    {
#if 0
		  MyPrintf("BluetoothBuf.BufSize: %d,BluetoothBuf.count: %d\n", BluetoothBuf.BufSize, BluetoothBuf.count);
          PrintHCIPack(&hci_bt, "Receive");
    
		  //MyPrintf("PacketNum: %d\n",PacketNum);
#endif

	

        if (hci_bt.type == HCI_EVENT)
        {

            StartTick = SysTick_GetTick(); //处理tx被rx阻塞时的timeout
            switch (hci_bt.opcode)
            {
            case HCI_EVENT_SPP_DATA_RECEIVED:
//                  SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
                SaveData((uint8_t *)&hci_bt, 3);
                SaveData(hci_bt.p_data, hci_bt.DataLen);
                PacketNum++;
				//MyPrintf("hci_bt.opcode: %d\n",hci_bt.opcode);
                break;

            case HCI_EVENT_BLE_DATA_RECEIVED:
//                  SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
                SaveData((uint8_t *)&hci_bt, 3);
                SaveData(hci_bt.p_data, hci_bt.DataLen);
                PacketNum++;
                break;

            case HCI_EVENT_BNEP_RECEIVE_TCP_DATA:
//                  SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
                SaveData((uint8_t *)&hci_bt, 3);
                SaveData(hci_bt.p_data, hci_bt.DataLen);
                PacketNum++;
                break;

            case HCI_EVENT_BNEP_RECEIVE_UDP_DATA:
//                  SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
                SaveData((uint8_t *)&hci_bt, 3);
                SaveData(hci_bt.p_data, hci_bt.DataLen);
                PacketNum++;
                break;

            case HCI_EVENT_BT_CONNECTED:
            case HCI_EVENT_BLE_CONNECTED:
            case HCI_EVENT_GKEY:
            case HCI_EVENT_BT_DISCONNECTED:
            case HCI_EVENT_BLE_DISCONNECTED:
            case HCI_EVENT_NVRAM_CHANGED:
            case HCI_EVENT_GET_PASSKEY:
            case HCI_EVENT_PAIRING_COMPLETED:
            //case HCI_EVENT_LE_PAIRING_STATE:
            case HCI_EVENT_BNEP_CONNECT:
            case HCI_EVENT_BNEP_DISCONNECT:
            case HCI_EVENT_BNEP_CONNECT_FAIL:
            case HCI_EVENT_TCP_CONNECT:
            case HCI_EVENT_TCP_DISCONNECT:
            case HCI_EVNET_TCP_FAIL:
            case HCI_EVENT_TCP_CONNECT_LOG:
            case HCI_EVENT_BNEP_CHIP_ERROR:
            case HCI_EVENT_DNS_RSP:
            case HCI_EVENT_BB_DISCONNECT:
            case HCI_EVENT_BT_NAME:
            case HCI_EVENT_UDP_INFO:


                //      SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
                SaveData((uint8_t *)&hci_bt, 3);
                SaveData(hci_bt.p_data, hci_bt.DataLen);
                PacketNum++;
                break;

            case HCI_EVENT_CMD_COMPLETE:

                switch (hci_bt.p_data[0])
                {
                case HCI_CMD_SET_BT_ADDR:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BT_ADDR);
                    }
                    break;

                case HCI_CMD_SET_BLE_ADDR:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_ADDR);
                    }
                    break;

                case HCI_CMD_SET_VISIBILITY:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_VISIBILITY);
                    }
                    break;

                case HCI_CMD_SET_BT_NAME:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BT_NAME);
                    }
                    break;
                case HCI_CMD_SET_BLE_NAME:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_BLE_NAME);
                    }
                    break;

                case HCI_CMD_SEND_SPP_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SEND_SPP_DATA);
                    }
                    break;

                case HCI_CMD_SEND_BLE_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SEND_BLE_DATA);
                    }
                    break;

                case HCI_CMD_SET_PAIRING_MODE:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_PAIRING_MODE);
                    }
                    break;

                case HCI_CMD_SET_PINCODE:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_PINCODE);
                    }
                    break;

                case HCI_CMD_VERSION_REQUEST:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_GET_VERSION);
                        CmdRepData[0] = hci_bt.p_data[2];
                        CmdRepData[1] = hci_bt.p_data[3];
                    }
                    break;

                case HCI_CMD_LE_SET_PAIRING:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_PARING);
                    }
                    break;

                case HCI_CMD_BT_DISCONNECT:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BT_DISCONNECT);
                    }
                    break;

                case HCI_CMD_BLE_DISCONNECT:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BLE_DISCONNECT);
                    }
                    break;
                case HCI_CMD_SET_NVRAM:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_NVRAM);
                    }
                    break;

                case HCI_CMD_CONFIRM_GKEY:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONFIRM_GKEY);
                    }
                    break;

                case HCI_CMD_SET_LPM_MODE:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_LPM_MODE);
                    }
                    break;

                case HCI_CMD_PASSKEY_ENTRY:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_PASSKEY_ENTRY);
                    }
                    break;

                case HCI_CMD_LE_SET_ADV_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_DATA);
                    }
                    break;

                case HCI_CMD_LE_SET_SCAN_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_SCAN_DATA);
                    }
                    break;

                case HCI_CMD_LE_SEND_CONN_UPDATE_REQ:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SEND_CONN_UPDATE);
                    }
                    break;
                case HCI_CMD_LE_SET_ADV_PARM:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_ADV_PARM);
                    }
                    break;

                case HCI_CMD_SET_TX_POWER:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_TXPOWER);
                    }
                    break;

                case HCI_CMD_REJECT_JUSTWORK:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_REJECT_JUSTWORK);
                    }
                    break;

                case HCI_CMD_SET_COD:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_SET_COD);
                    }
                    break;

                case HCI_CMD_DELETE_CUSTOMIZE_SERVICE:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DELETE_SERVICE);
                    }
                    break;

                case HCI_CMD_LE_SET_FIXED_PASSKEY:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_LE_SET_FIXED_PASSKEY);
                    }
                    break;

                case HCI_CMD_CONNECT_BNEP:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONNECT_BNEP);
                    }
                    break;

                case HCI_CMD_CONNECT_TCP:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_CONNECT_TCP);
                    }
                    break;

                case HCI_CMD_DISCONNECT_TCP:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DISCONNECT_TCP);
                    }
                    break;

                case HCI_CMD_BNEP_SEND_TCP_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_DATA);
                    }
                    break;

                case HCI_CMD_SEND_UDP_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_UDP_DATA);
                    }
                    break;

                case HCI_CMD_SEND_BIG_DATA:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA);
                    }
                    break;

                case HCI_CMD_DNS_REQ:
                    if (!hci_bt.p_data[1])
                    {
                        BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_DNS_REQ);
                    }
                    break;

                default:
#ifdef BT_ERROR_LOG
                    MyPrintf("bt 06 cmd err\n");
#endif
                    break;
                }
                break;

            case HCI_EVENT_I_AM_READY:
                BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_MODULE_READY);
                break;

            case HCI_EVENT_STAUS_RESPONSE:
                BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_STATUS_REQUEST);
                CmdRepData[0] = hci_bt.p_data[0];
                break;

            case HCI_EVENT_UUID_HANDLE:
                BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_ADD_UUID);
                CmdRepData[0] = hci_bt.p_data[0];
                CmdRepData[1] = hci_bt.p_data[1];
                break;

            case HCI_EVENT_BIG_DATA_FINISH:
                if (hci_bt.p_data[0] == 0x00)
                {
                    BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
                }
                break;

            case HCI_EVENT_BIG_DATA_STATUS:
                if (hci_bt.p_data[0] == 0x03 || hci_bt.p_data[0] == 0x04)
                {
                    BT_BIT_SET(HCI_CMD_BIT_FLAG, BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
                }
                break;

            default:
#ifdef BT_ERROR_LOG
                MyPrintf("bt event err");
#endif
                break;
            }
            IPC_HOLD_BT = 0;
            WAKEUP_BT &= ~(1 << WAKEUP_BT_FLAG);
        }
        else
        {
#ifdef BT_ERROR_LOG
            MyPrintf("bt 02 err");
#endif
        }
    }
    else
    {
#ifdef BT_ERROR_LOG
        MyPrintf("receive bt data err");
#endif
    }
}

int BT_GetEventOpcode()
{
    if (PacketNum <= 0)    return -1;
    uint8_t TempOpcode;
    int TempIndex = BluetoothBuf.ReadIndex + 1;
    if (TempIndex == BluetoothBuf.BufSize) TempIndex = 0;
    TempOpcode = BluetoothBuf.pBuf[TempIndex];

    /*这几个事件用户不用取数据,所以跳过数据包,维护读指针,
    其他需要用户获取数据的事件则在BT_ReadBTData中维护指针*/
    if (TempOpcode == BT_CONNECTED || \
            TempOpcode == BLE_CONNECTED || \
            TempOpcode == BT_DISCONNECTED || \
            TempOpcode == BLE_DISCONNECTED || \
            TempOpcode == BNEP_CONNECT || \
            TempOpcode == BNEP_DISCONNECT || \
            TempOpcode == BNEP_CHIP_ERROR || \
            TempOpcode == HCI_EVENT_BB_DISCONNECT || \
            TempOpcode == PASSKEY)
    {
        SkipData(3);
    }
    NVIC_DisableIRQ(BT_IRQn);
	//MyPrintf("PacketNum11: %d\n",PacketNum);
    PacketNum--;
    NVIC_EnableIRQ(BT_IRQn);
    return TempOpcode;
}



int BT_ReadBTData(uint8_t *pbuf)
{
    uint8_t OpCode;
    int len = 0;
    int i = 0;
    if (BluetoothBuf.count < 3)    return 0;
    SkipData(1);
    OpCode = GetData(TRUE);
    len = GetData(TRUE);
    if (OpCode == BLE_DATA)
    {
      len-=2;//ble handle 处理
      SkipData(2);
    }
    for (i = 0; i < len; i++)
    {
        pbuf[i] = GetData(TRUE);
    }
    return len;
}





























//      G:\Git_file\YC3121_PT26\Librarier\sdk\yc_bt.h


/**
  ******************************************************************************
  * @file    yc_bt.h
  * @author  Yichip
  * @version V1.1
  * @date    28-May-2020
  * @brief   Yichip bluetooth encapsulation.The HCI protocol refers to YC Dual mode module spec-v4.15
*
  ******************************************************************************
  */


#ifndef __YC_BT_H__
#define __YC_BT_H__

#include "yc_uart.h"
#include "yc_ipc.h"


#define HCI_CMD                           0x01
#define HCI_EVENT                         0x02
#define MAX_BLUETOOTH_DATA_LEN            255
#define MAX_TCP_DATA_LEN                  235
#define MAX_BIG_DATA_LEN                  1360



/*BIT judge*/
#define BIT_SET_BT_ADDR                   0
#define BIT_SET_BLE_ADDR                  1
#define BIT_SET_VISIBILITY                2
#define BIT_SET_BT_NAME                   3
#define BIT_SET_BLE_NAME                  4
#define BIT_SEND_SPP_DATA                 5
#define BIT_SEND_BLE_DATA                 6
#define BIT_STATUS_REQUEST                7
#define BIT_SET_PAIRING_MODE              8
#define BIT_SET_PINCODE                   9
#define BIT_GET_VERSION                   10
#define BIT_BT_DISCONNECT                 11
#define BIT_BLE_DISCONNECT                12
#define BIT_SET_NVRAM                     13
#define BIT_SET_TXPOWER                   14
#define BIT_ENTER_SLEEP_MODE              15
#define BIT_CONFIRM_GKEY                  16
#define BIT_POWER_SET                     17
#define BIT_GET_CREADIT_GIVEN             18
#define BIT_PASSKEY_ENTRY                 19
#define BIT_LE_SET_PARING                 20
#define BIT_LE_SET_ADV_DATA               21
#define BIT_LE_SET_SCAN_DATA              22
#define BIT_LE_SEND_CONN_UPDATE           23
#define BIT_LE_SET_ADV_PARM               24
#define BIT_REJECT_JUSTWORK               25
#define BIT_LE_SET_FIXED_PASSKEY          26
#define BIT_SET_PSCAN_INTERVAL            27
#define BIT_MODULE_READY                  28
#define	BIT_SET_COD                       29
#define BIT_SET_CREDIT                    30
#define BIT_DELETE_SERVICE                31
#define BIT_ADD_UUID                      32
#define BIT_DNS_REQ                       33
#define BIT_CONNECT_BNEP                  34
#define BIT_CONNECT_TCP                   35
#define BIT_BNEP_SEND_TCP_DATA            36
#define BIT_DISCONNECT_TCP                37
#define BIT_BNEP_SEND_UDP_DATA            38
#define BIT_BNEP_SEND_TCP_BIG_DATA        39
#define BIT_BNEP_SEND_TCP_BIG_DATA_FINISH 40
#define BIT_BNEP_SEND_TCP_BIG_DATA_STATUS 41
#define BIT_SET_LPM_MODE                  42
/*CMD*/
#define HCI_CMD_SET_BT_ADDR               0x00  //设置 BT3.0 地址
#define HCI_CMD_SET_BLE_ADDR              0x01  //设置 BLE 地址
#define HCI_CMD_SET_VISIBILITY            0x02  //设置可发现和广播
#define HCI_CMD_SET_BT_NAME               0x03  //设置 BT3.0 名称
#define HCI_CMD_SET_BLE_NAME              0x04  //设置 BLE 名称
#define HCI_CMD_SEND_SPP_DATA             0x05  //发送 BT3.0(SPP)数据
#define HCI_CMD_SEND_BLE_DATA             0x09  //发送 BLE 数据
#define HCI_CMD_STATUS_REQUEST            0x0B  //请求蓝牙状态
#define HCI_CMD_SET_PAIRING_MODE          0x0C  //设置配对模式
#define HCI_CMD_SET_PINCODE               0x0D  //设置配对码
#define HCI_CMD_VERSION_REQUEST           0x10  //查询模块固件版本
#define HCI_CMD_BT_DISCONNECT             0x11  //断开 BT3.0 连接
#define HCI_CMD_BLE_DISCONNECT            0x12  //断开 BLE 连接
#define HCI_CMD_SET_NVRAM                 0x26  //下发 NV 数据
#define HCI_CMD_ENTER_SLEEP_MODE          0x27  //进入睡眠模式
#define HCI_CMD_CONFIRM_GKEY              0x28  //Numeric Comparison 配对方式中对密钥的比较(见HCI_EVENT_GKEY注释)
#define HCI_CMD_GET_CREADIT_GIVEN         0x29
#define HCI_CMD_PASSKEY_ENTRY             0x30  //passkey配对方式中对密钥的比较
#define HCI_CMD_LE_SET_PAIRING            0x33
#define HCI_CMD_LE_SET_ADV_DATA           0x34
#define HCI_CMD_LE_SET_SCAN_DATA          0x35
#define HCI_CMD_LE_SEND_CONN_UPDATE_REQ   0x36
#define HCI_CMD_LE_SET_ADV_PARM           0x37
#define HCI_CMD_SET_TX_POWER              0x42
#define HCI_CMD_REJECT_JUSTWORK           0x49
#define HCI_CMD_LE_SET_FIXED_PASSKEY      0x61
#define	HCI_CMD_DELETE_CUSTOMIZE_SERVICE  0x76
#define	HCI_CMD_ADD_SERVICE_UUID          0x77
#define	HCI_CMD_ADD_CHARACTERISTIC_UUID   0x78
#define	HCI_CMD_SET_COD                   0x15  //设置 COD
#define HCI_CMD_CONNECT_BNEP              0x7e //建立BNEP连接
#define HCI_CMD_CONNECT_TCP               0x7f //建立TCP连接
#define HCI_CMD_DISCONNECT_TCP            0x80 //断开TCP连接
#define HCI_CMD_BNEP_SEND_TCP_DATA        0x81 //发送TCP数据
#define HCI_CMD_DNS_REQ                   0x82 //域名解析指令
#define HCI_CMD_SEND_UDP_DATA             0x84 //发送UDP数据
#define HCI_CMD_SEND_BIG_DATA             0x85 //发送TCP大包数据
#define HCI_CMD_SET_LPM_MODE              0xff //开关低功耗


/*EVENT*/
#define HCI_EVENT_BT_CONNECTED            0x00  /**BT3.0 连接建立*/
#define HCI_EVENT_BLE_CONNECTED           0x02  /**BLE 连接建立*/
#define HCI_EVENT_BT_DISCONNECTED         0x03  /**BT3.0 连接断开*/
#define HCI_EVENT_BLE_DISCONNECTED        0x05  /**BLE 连接断开*/
#define HCI_EVENT_CMD_COMPLETE            0x06  /**命令已完成*/
#define HCI_EVENT_SPP_DATA_RECEIVED       0x07  /**接收到 BT3.0 数据(SPP)*/
#define HCI_EVENT_BLE_DATA_RECEIVED       0x08  /**接收到 BLE 数据*/
#define HCI_EVENT_I_AM_READY              0x09  /**模块准备好*/
#define HCI_EVENT_STAUS_RESPONSE          0x0A  /**状态回复*/
#define HCI_EVENT_NVRAM_CHANGED           0x0D  /**上传 NVRAM 数据*/
#define HCI_EVENT_GKEY                    0x0E  /**HCI 包格式错误*/
#define HCI_EVENT_UART_EXCEPTION          0x0F  /*cmd format error*/
#define HCI_EVENT_GET_PASSKEY             0x10  /**PASSKEY 配对方式中通知MCU 返回密钥,MCU收到此事件后需发送HCI_CMD_PASSKEY_ENTRY指令回复蓝牙模块*/
#define HCI_EVENT_PAIRING_COMPLETED       0x11  /**配对完成的事件,通知 MCU配对完成*/
#define HCI_EVENT_LE_PAIRING_STATE        0x14  /**上报配对状态*/
#define	HCI_EVENT_UUID_HANDLE             0x29
#define HCI_EVENT_BNEP_CONNECT            0x2c  /**通知MCU BNEP连接成功*/
#define HCI_EVENT_BNEP_DISCONNECT         0x2d  /**通知MCU BNEP断开连接*/
#define HCI_EVENT_BNEP_CONNECT_FAIL       0x2e  /**通知MCU BNEP连接失败原因*/
#define HCI_EVENT_TCP_CONNECT             0x2f /**通知MCU TCP连接成功*/
#define HCI_EVENT_TCP_DISCONNECT          0x30 /**通知MCU TCP断开连接*/
#define HCI_EVENT_BNEP_RECEIVE_TCP_DATA   0x31  /*接收到TCP数据*/
#define HCI_EVNET_TCP_FAIL                0x32  /*TCP连接或者断开失败*/
#define HCI_EVENT_TCP_CONNECT_LOG         0x33  /*TCP连接LOG*/
#define HCI_EVENT_BNEP_CHIP_ERROR         0x34  /*芯片不支持BNEP*/
#define HCI_EVENT_DNS_RSP                 0x35  /*DNS返回的ip地址*/
#define HCI_EVENT_BB_DISCONNECT           0x36  /*经典蓝牙baseband断开后返回的事件*/
#define HCI_EVENT_BT_NAME                 0x37  /*BT master name*/
#define HCI_EVENT_UDP_INFO                0x38  /*UDP信息头,包含远端IP、本地IP、远端端口、本地端口,后面会紧随一包UDP数据*/
#define HCI_EVENT_BNEP_RECEIVE_UDP_DATA   0x39  /*接收到UDP数据*/
#define HCI_EVENT_BIG_DATA_FINISH         0x3a  /*大数据分包发送完成事件*/
#define HCI_EVENT_BIG_DATA_STATUS         0x3b  /*大数据分包发送状态*/


/**
  * @brief  event code enum definition
  */
typedef enum
{
	BT_CONNECTED        		=HCI_EVENT_BT_CONNECTED,
	BLE_CONNECTED       		=HCI_EVENT_BLE_CONNECTED,
	BT_DISCONNECTED     		=HCI_EVENT_BT_DISCONNECTED,
	BLE_DISCONNECTED    		=HCI_EVENT_BLE_DISCONNECTED,
	BT_DATA             		=HCI_EVENT_SPP_DATA_RECEIVED,
	BLE_DATA            		=HCI_EVENT_BLE_DATA_RECEIVED,
	NVRAM_DATA          		=HCI_EVENT_NVRAM_CHANGED,
	CONFIRM_GKEY        		=HCI_EVENT_GKEY,
	PASSKEY             		=HCI_EVENT_GET_PASSKEY,
	PAIRING_COMPLETED   		=HCI_EVENT_PAIRING_COMPLETED,
	PAIRING_STATE        		=HCI_EVENT_LE_PAIRING_STATE,
	BNEP_CONNECT        		=HCI_EVENT_BNEP_CONNECT,
	TCP_CONNECT         		=HCI_EVENT_TCP_CONNECT,
	BNEP_RECEIVE_TCP_DATA		=HCI_EVENT_BNEP_RECEIVE_TCP_DATA,
	TCP_DISCONNECT       		=HCI_EVENT_TCP_DISCONNECT,
	BNEP_DISCONNECT      		=HCI_EVENT_BNEP_DISCONNECT,
	BNEP_CONNECT_FAIL    		=HCI_EVENT_BNEP_CONNECT_FAIL,
	TCP_FAIL             		=HCI_EVNET_TCP_FAIL,
	TCP_CONNECT_LOG      		=HCI_EVENT_TCP_CONNECT_LOG,
	BNEP_CHIP_ERROR      		=HCI_EVENT_BNEP_CHIP_ERROR,
	DNS_RSP              		=HCI_EVENT_DNS_RSP,
	BB_DISCONNECT        		=HCI_EVENT_BB_DISCONNECT,
	BT_NAME              		=HCI_EVENT_BT_NAME,
	UDP_INFO             		=HCI_EVENT_UDP_INFO,
	BNEP_RECEIVE_UDP_DATA		=HCI_EVENT_BNEP_RECEIVE_UDP_DATA

}BT_EventCodeEnum;



typedef struct
{
	uint8_t* pBuf;
    	int BufSize;
    	int count;		 /*!< count of valid data */
    	int ReadIndex;
    	int WriteIndex;
} BT_BufTypeDef;
extern BT_BufTypeDef BluetoothBuf;

/**
  * @brief   Set the address of the bluetooth 3.0 device
  * @param  bt_addr: pointer to  address(6 bytes)
  * @retval TRUE:set addr success.
  *         FALSE:set addr failed
  */
Boolean BT_SetBtAddr(uint8_t * bt_addr);


/**
  * @brief  Set the address of the bluetooth 4.0 device
  * @param  bt_addr: pointer to  address(6 bytes)
  * @retval TRUE:set addr success.
  *         FALSE:set addr failed
  */
Boolean BT_SetBleAddr(uint8_t * bt_addr);


/**
  * @brief   Set the name of the bluetooth 3.0 device
  * @param  bt_addr: pointer to  address information.
  *         name_len: name length,not include '\0'
  * @retval TRUE:set name success.
  *         FALSE:set name failed
  */
Boolean BT_SetBtName(uint8_t * bt_name, uint16_t name_len);


/**
  * @brief   Set the name of the bluetooth 4.0 device
  * @param  ble_name: pointer to  name information.
  *         name_len: name length,not include '\0'
  * @retval TRUE:set name success.
  *         FALSE:set name failed
  */
Boolean BT_SetBleName(uint8_t* ble_name, uint16_t name_len);


/**
  * @brief  Set visibility mode.
  * @param  bt_discoverable: 0--bt_discoverable OFF;1--bt_discoverable ON.
  *         bt_connectability:0--bt_connectability OFF;1--bt_connectability ON.
  *         ble_discoverable:0--ble_discoverable OFF;1--ble_discoverable ON.
  * @retval TRUE:set visibility success.
  *         FALSE:set visibility failed
  */
Boolean BT_SetVisibility(Boolean bt_discoverable, Boolean bt_connectability, Boolean ble_discoverable);


/**
  * @brief  Bt send spp(bt3.0) data
  * @param  spp_data: pointer to  spp data
  *         len: spp data length(max len is 255)
  * @retval TRUE:send spp data success.
  *         FALSE:send spp data failed
  */
Boolean BT_SendSppData(uint8_t * spp_data, uint16_t len);


/**
  * @brief  Send ble data
  * @param  ble_data: pointer to  ble data ,includes two bytes handle(byte0-byte1 is ble handle).
  *         len: data length(max len is 255)
  * @retval TRUE:send ble data success.
  *         FALSE:send ble data failed
  */
  Boolean BT_SendBleData(uint8_t * ble_data, uint16_t len);


/**
  * @brief  get bluetooth connect status
  * @param  None
  * @retval bit0:BT 3.0 Can be discover
  *         bit1:BT 3.0 Can be connected
  *         bit2:BT 4.0 Can be discover and connected
  *         bit4:BT 3.0 connected
  *         bit5:BT 4.0 connected
  *         bit7:get status timer out
  */
uint8_t Bt_GetBtStatus(void);



/**
  * @brief  set classic bluetooth paring mode
  * @param  mode:the paramater can be one of the following value
                0x00:pincode
                0x01:just work
                0x02:passkey
                0x03:confirm
  * @retval	   ture or FALSE
  */
  Boolean BT_SetParingMode(uint8_t mode);



/**
  * @brief  set classic bluetooth paring PIN code
  * @param  Pincode:the pointer ponint to pincode data
            len: normally the value can be 0x01~0x10,
  * @retval	   ture or FALSE
  */
Boolean BT_SetPincode(uint8_t* Pincode,uint8_t len);



/**
  * @brief  get the bluetooth module firmware version number
  * @param  none
  * @retval firmware version number(the value is 1~65535),0 is fail
  *
  */
uint32_t BT_GetVersion(void);


/**
  * @brief  bt disconnect
  * @param  none
  * @retval TRUE:bt disconnected success.
  *         FALSE:bt disconnected failed
  */
Boolean BT_BtDisconnect(void);

/**
  * @brief  Set NVRAM
  * @param  NvData:the pointer point to NVRAMData
	* 				len:bnep is 34(one group),other is 170(5*34=170 five group).
  * @retval TRUE:bt disconnected success.
  *         FALSE:bt disconnected failed
  */
Boolean BT_SetNVRAM(uint8_t * NvData,int len);


/**
  * @brief  Bt Enter Sleep mode(enter_hibernate)
  * @param  none
  * @retval TRUE:enter sleep mode success
  *
  */
Boolean BT_EnterSleepMode(void);


/**
  * @brief  Bt set LPM mode
  * @param  mode:0x00-close LPM mode; 0x01-open LPM mode
  * @retval TRUE or FALSE
  *
  */
Boolean BT_SetLpmMode(uint8_t mode);



/**
  * @brief  Numeric Comparison key matching in paring mode
  * @param  mismatching:the paramater can be the follwing value
                        0x00: key match
                        0x01: key mismatch
  * @retval TRUE:set ConfirmGkey success
  *         FALSE:set ConfirmGkey failed
 */
Boolean BT_ConfirmGkey(uint8_t isMatching);


/**
  * @brief  set spp flow control
  * @param  packetNum:the flow control packet number
  * @retval TRUE:success
  *         FALSE:failed
 */
Boolean BT_SetSppFlowcontrol(uint8_t packetNum);


/**
  * @brief  Comparison of keys in  PASSKEY paring
  * @param  key_data: point to key data,length is 4 bytes,(data in hexadecimal form,
  *                   starting with high bytes;for example ,218372(10) = 0x35504 ->key_data[]={0x00,0x03,0x55,0x04})
  * @retval TRUE:set passkey success
  *         FALSE:set passkey  failed
  */
Boolean BT_PasskeyEntry(uint8_t *key_data);

/**
  * @brief  Set ble paring mode
  * @param  mode: the paramater can be the follwing value
  *               0x00:none
  *               0x01:just work
  *               0x02:pass key
  *               0x81:secure connect just work
  *               0x82:secure connect numeric
  *               0x83:secure connect pass key
  * @retval TRUE:set ble paring success
  *         FALSE:set ble paring  failed
  */
Boolean BT_SetLEParing(uint8_t mode);

/**
  * @brief    Send ble adv data
  * @param    adv_data: pointer to adv data.
	*  					DataLen: data length(must be 0x1f)
  * @retval	  TRUE:set ble adv  data success.
  *           FALSE:set ble adv data failed
  */
Boolean BT_SetLEAdvData(uint8_t*  adv_data, int DataLen);


/**
  * @brief  set ble scan data
  * @param  scan_data: pointer to  scan data.
  *         DataLen: data length(length < 0x20)
  * @retval TRUE:set ble scan  data success.
  *         FALSE:set ble scan data failed
  */
Boolean BT_SetLEScanData(uint8_t* scan_data, int DataLen);

/**
  * @brief  ble send update ble connect parameter data
  * @param  data:
  *             byte0-byte1:min connect interval
  *             byte2-byte3:max connect interval
  *             byte4-byte5:Slave  latency
  *             byte6-byte7:Connection Supervision Timeout
  *         len:len must be 8
  * @retval TRUE:success.
  *         FALSE:failed
  */
Boolean BT_SetLESendConnUpdate(uint8_t *data,int len);


/**
  * @brief  Set ble adv interval
  * @param  ble_adv_interval: ble adv interval is ble_adv_interval*0.625ms
  * @retval TRUE:set ble adv parm success.
  *         FALSE:set ble adv parm failed
  */
Boolean BT_SetLEAdvInterval(uint16_t ble_adv_interval);

/**
  * @brief  Set reject just work
  * @param  justwork:
  *                 0:turn off reject just work
  *                 1:turn on reject just work
  * @retval TRUE:set ble scan  data success.
  *         FALSE:set ble scan data failed
  */
Boolean BT_RejectJustWork(uint8_t justwork);


/**
  * @brief  Set fixed passkey
  * @param  key: pointer to key data ,key length is 5 bytes
  * @retval TRUE:set fixed passkey  success.
  *         FALSE:set ble fixed passkey failed
  */
Boolean BT_Set_FixedPasskey(uint8_t* key);


/**
  * @brief  ble disconnect
  * @param  none
  * @retval TRUE:ble disconnected success.
  *         FALSE:ble disconnected failed
  */
Boolean BT_BleDisconnect(void);


/**
  * @brief  Set spp(bt3.0) class of device
  * @param  bt_cod:cod buf(must be 3 byte)
  * @retval TRUE:success.
  *         FALSE:failed
  */
Boolean BT_SetCOD(uint8_t* bt_cod);




/**
  * @brief  Set RF tx power
  * @param  power: 0:0db
  *                1:3db
  *                2:5db
  *                3:-3db
  *                4:-5db
  * @retval TRUE:set SetTxPower  success.
  *         FALSE:set SetTxPower failed
  */
Boolean BT_SetTxPower(uint8_t power);


/**
  * @brief  Delete ble custom Service
  * @param  none
  * @retval TRUE:success.
  *         FALSE:failed
  */
Boolean BT_DeleteService(void);


/**
  * @brief  add ble custom Service
  * @param  ble_service_uuid:
	*														byte0: uuid length(2 or 16)
	*														byte1-2(16): uuid
	*					service_uuid_len: sizeof(ble_service_uuid)
  * @retval 0:failed
  *         other:Service handle
  */
uint16_t BT_AddBleService(uint8_t* ble_service_uuid, uint16_t service_uuid_len);


/**
  * @brief  add ble custom Characteristic
  * @param  ble_Characteristic_uuid:
	*														byte0: characterisitic attribute
	*																	bit0		Broadcast
	*																	bit1		Read
	*																	bit2		Write without Response
	*																	bit3		Write
	*																	bit4		Notify
	*																	bit5		Indicate
	*																	bit6		Authentication Signed Write
	*																	bit7		Extended Properties
	*														byte1:			characterisitic uuid length(2 or 16)
	*														byte2-3(17):characterisitic uuid
	*														byte4(18):	write/read payload length(1--20;default:1)
	*														byte5(19)-x:write/read payload(default:00)
	*					service_Characteristic_payload_len: sizeof(ble_Characteristic_uuid)
  * @retval 0:failed
  *         other:Characteristic handle
  */
uint16_t BT_AddBleCharacteristic(uint8_t* ble_Characteristic_uuid, uint16_t service_Characteristic_payload_len);

/**
  * @brief  Read the received bluetooth data from receive buffer
  * @param  pbuf:the output buffer,255 bytes is enough
  *
  * @retval The data length of the readed,0 is fail
  */
int BT_ReadBTData(uint8_t* pbuf);


/**
  * @brief   get event opcode of bluetooth module
  *
  * @param  none
  *
  * @retval -1		:no data
  *         other	:event opcode
  */
int BT_GetEventOpcode(void);


/**
  * @brief   parse bluetooth module data packet according to yichip HCI protocol from ipc buf,you shoud call it at BT_UART IRQHandler function
  * @param  Unone
  *
  * @retval none
  */
void BT_ParseBTData(void);




/**
  * @brief   Handling user events about bluetooth module,This is not an interrupt function,A circular call is required to detect bluetooth data
  *
  * @param  none
  *
  * @retval none
  */
void BT_Progress(void);


/**
  * @brief  BT Init
  * @param  none
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_Init(void);

/**
  * @brief  BT_WakeupInit (M0 Sleep,Bt lpm Sleep)
  * @param  none
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_WakeupInit(void);

/**
  * @brief  DNS(domain name resolution)
  * @param  dns_data: pointer to  domain name(www.baidu.com).
            DataLen: data length(max 62 bytes)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_DnsReq( uint8_t *dns_data,int len);
/**
  * @brief  Connect Bnep
  * @param   *phone_mac_addr: pointer to phone_mac_addr.
	           Byte0~Byte5   The MAC address you want to connect to your phone
						 Byte6~Byte21  Link key
						 (phone MAC and Link key from NVRAM event,all zero is connect last pair phone)
             len: data length(must be 22 byte)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_ConnectBnep( uint8_t *phone_mac_addr,int len);

/**
  * @brief  disconnect Bnep
  * @param   none
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_disconnectBnep(void);



/**
  * @brief  Connect Tcp
  * @param  tcp_ip_addr: pointer to  tcp_ip_addr.
	          Byte0  TCP connect handle(0x00 or 0x01)
						Byte1~Byte4  IP address(192.168.1.1 is c0 a8 01 01)
						Byte5~Byte6  port number(8888 is 22 b8)
            len: data length(must be 7 byte)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_ConnectTcp( uint8_t *tcp_ip_addr,int len);



/**
  * @brief  Send  TcpData
  * @param  tcpdata: pointer to  tcpdata.
	          Byte0  TCP handle
						Byte1~ByteN  The TCP data need to send(max 235 bytes)
            len: data length(max value 1+235)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_BnepSendTcpData( uint8_t *tcpdata,int len);


/**
  * @brief  Send  Tcp big packet Data
  * @param  tcpdata: pointer to  tcpdata.
	          Byte0  TCP handle
						Byte1~ByteN  The TCP data need to send(max 1460 bytes)
            len: data length(max value 1+1460)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_BnepSendTcpBigData( uint8_t *tcpdata,int len);


/**
  * @brief  Send  UDP Data
  * @param  tcpdata: pointer to  udpdata.
	          Byte0~Byte3  UDP remote IP(192.168.1.1 is c0 a8 01 01)
						Byte4~Byte5  UDP local port(8888 is 22 b8)
						Byte6~Byte7  UDP remote port(12345 is 30 39)
						Byte8~ByteN  The UDP data need to send(max 247 bytes)
            len: data length(max value 255)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_BnepSendUdpData( uint8_t *udpdata,int len);



/**
  * @brief  Disconnect  Tcp
  * @param  tcp_handle: the want to disconnect TCP handle(0x00 or 0x01)
  * @retval TRUE:success
  *         FALSE:fail
  */
Boolean BT_DisconnectTcp(uint8_t tcp_handle);







#endif




























//   C:\Users\Administrator\Desktop\PT26_Project\Source\Interface.h



/*File Name  : Interface.h
*CPU        : STM32F10XC8(ARM 32-bit Cortex-M3 CPU)
*Description: 打印机与CPU之间的接口头文件
*********************************************************************/
#ifndef _INTERFACE_H_
#define _INTERFACE_H_

#include "PrtConfig.h"
#include "type.h"
//FLASH CS
#define FLASH_CS_SET      	(GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN))
#define FLASH_CS_RESET   	(GPIO_ResetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN))

//KEY
#define GET_WAKE_KEY  		(GPIO_ReadInputDataBit(KEY_WAKE_PORT, KEY_WAKE_PIN))
#define GET_SET_KEY   		(GPIO_ReadInputDataBit(KEY_SET_PORT, KEY_SET_PIN))


//charge
#define   GET_CHARGE_STATE     (GPIO_ReadInputDataBit(PORT_CHARGE_STATE, PIN_CHARGE_STATE))

//#define GET_USB_PLUG		(GPIO_ReadInputDataBit(USB_PLUG_IN_PORT, USB_PLUG_IN_PIN)) 	


//CBUSY
#define USBBusy_ON   		NVIC_DisableIRQ(USB_IRQn)//disable_intr(INTR_USB); 
#define USBBusy_OFF			NVIC_EnableIRQ(USB_IRQn)
#define USARTBusy_ON  		//(GPIO_SetBits(GPIOB, GPIO_Pin_5))
#define USARTBusy_OFF		//(GPIO_ResetBits(GPIOB, GPIO_Pin_5))

#define Busy_ON   			PrinterBusy(1)
#define Busy_OFF    		PrinterBusy(0)

//USB Connect
#define USB_Connect  		//(GPIO_SetBits(GPIOB, GPIO_Pin_8))
#define USB_Disconnect 		//(GPIO_ResetBits(GPIOB, GPIO_Pin_8))

//LAT
#define LAT_ON         		  GPIO_ResetBits(TPH_SPI_CS_PORT, TPH_SPI_CS_PIN)
#define LAT_OFF     		  GPIO_SetBits(TPH_SPI_CS_PORT, TPH_SPI_CS_PIN)





#define TPH_EN_ON			  do{GPIO_SetBits(TPH_MDEN_PORT,TPH_MDEN_PIN) ; GPIO_SetBits(TPH_POWER_EN_PORT,TPH_POWER_EN_PIN);} while(0)
#define TPH_EN_OFF			  do{GPIO_ResetBits(TPH_MDEN_PORT,TPH_MDEN_PIN) ; GPIO_ResetBits(TPH_POWER_EN_PORT,TPH_POWER_EN_PIN);} while(0)

#define TIME_RAW	7
//Timer
#define Timer_SetCounter(value)    	TIM_SetPeriod(TIM4,(value*96))
#define Timer_Enable               	TIM_Cmd(TIM4, ENABLE)
#define Timer_Disable               TIM_Cmd(TIM4, DISABLE)


#define Timer_key_SetCounter(value) TIM_SetPeriod(TIM1,(value*96))
#define Timer_key_Enable            TIM_Cmd(TIM1, ENABLE)
#define Timer_key_Disable           TIM_Cmd(TIM1, DISABLE)
//LF Motor Timer
#define LFTimer_Enable             	TIM_Cmd(TIM2, ENABLE)
#define LFTimer_Disable            	TIM_Cmd(TIM2, DISABLE)
#define LFTimer_SetCounter(value)   TIM_SetPeriod(TIM2,value*PAPER.print_speed_time_multiple)
									

//Prt Timer
#define PrtTimer_Enable             TIM_Cmd(TIM3, ENABLE)
#define PrtTimer_Disable           	TIM_Cmd(TIM3, DISABLE)
#define PrtTimer_SetCounter(value)  TIM_SetPeriod(TIM3,value*120)

//Lcd Timer
//#define Timer_Lcd_SetCounter(value) TIM_SetPeriod(TIM5,(value*96))
//#define Timer_Lcd_Enable            TIM_Cmd(TIM5, ENABLE)
//#define Timer_Lcd_Disable           TIM_Cmd(TIM5, DISABLE)

#define Timer_Lcd1_SetCounter(value) TIM_SetPeriod(TIM7,(value*96))
#define Timer_Lcd1_Enable            TIM_Cmd(TIM7, ENABLE)
#define Timer_Lcd1_Disable           TIM_Cmd(TIM7, DISABLE)

//Interrupt Switch
#define CloseAllInt      //(__set_PRIMASK(1))
#define OpenAllInt       //(__set_PRIMASK(0))

//SystemReset
#define SystemReset     //(NVIC_SystemReset())

//Load  WDG
#define IWDG_Reload     WDT_ReloadCounter();


//Prt Stb
#define PrtStb123_ON       GPIO_SetBits(TPH_STB1_PORT,TPH_STB1_PIN)
#define PrtStb123_OFF      GPIO_ResetBits(TPH_STB1_PORT,TPH_STB1_PIN)
#define PrtStb456_ON       GPIO_SetBits(TPH_STB2_PORT,TPH_STB2_PIN)
#define PrtStb456_OFF      GPIO_ResetBits(TPH_STB2_PORT,TPH_STB2_PIN)

//Cash前箱
#define bCash_ON           //(GPIO_SetBits(GPIOA, GPIO_Pin_8))
#define bCash_OFF          //(GPIO_ResetBits(GPIOA, GPIO_Pin_8))

//Motor
#define Motor_A1_ON          GPIO_SetBits(STEP_MOTOR_A1_PORT, STEP_MOTOR_A1_PIN)
#define Motor_A1_OFF         GPIO_ResetBits(STEP_MOTOR_A1_PORT, STEP_MOTOR_A1_PIN)
#define Motor_A2_ON          GPIO_SetBits(STEP_MOTOR_A2_PORT, STEP_MOTOR_A2_PIN)
#define Motor_A2_OFF         GPIO_ResetBits(STEP_MOTOR_A2_PORT,STEP_MOTOR_A2_PIN)
#define Motor_B1_ON          GPIO_SetBits(STEP_MOTOR_B1_PORT,STEP_MOTOR_B1_PIN)
#define Motor_B1_OFF         GPIO_ResetBits(STEP_MOTOR_B1_PORT,STEP_MOTOR_B1_PIN)
#define Motor_B2_ON          GPIO_SetBits(STEP_MOTOR_B2_PORT,STEP_MOTOR_B2_PIN)
#define Motor_B2_OFF         GPIO_ResetBits(STEP_MOTOR_B2_PORT,STEP_MOTOR_B2_PIN)

#define MOTOR_EN_ON			GPIO_SetBits(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
#define MOTOR_EN_OFF		GPIO_ResetBits(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
#define GET_MOTOR_OUT_BIT	GPIO_ReadOutputDataBit(STEP_MOTOR_EN_PORT,STEP_MOTOR_EN_PIN)
//lcd
#define LCD_RST_ON			GPIO_ResetBits(LCD_RST_PORT,LCD_RST_PIN) 
#define LCD_RST_OFF			GPIO_SetBits(LCD_RST_PORT,LCD_RST_PIN) 

//#define LCD_POWER_OFF		GPIO_SetBits(LCD_PWR_PORT,LCD_PWR_PIN) 
//#define LCD_POWER_ON		GPIO_ResetBits(LCD_PWR_PORT,LCD_PWR_PIN) 



#define Head_En_ON		    GPIO_SetBits(Head_En_PORT,Head_En_PIN) 
#define Head_En_OFF		    GPIO_ResetBits(Head_En_PORT,Head_En_PIN) 



#ifdef   USE_LCD_IIC_PORT
#define LCD_I2C_SDA_H		GPIO_SetBits(LCD_IIC_SDA_PORT,LCD_IIC_SDA_PIN)  
#define LCD_I2C_SDA_L		GPIO_ResetBits(LCD_IIC_SDA_PORT,LCD_IIC_SDA_PIN)

#define LCD_I2C_SCL_H		GPIO_SetBits(LCD_IIC_CLK_PORT,LCD_IIC_CLK_PIN)  
#define LCD_I2C_SCL_L		GPIO_ResetBits(LCD_IIC_CLK_PORT,LCD_IIC_CLK_PIN)


#define LCD_CS_H		      GPIO_SetBits(LCD_CS_PORT,LCD_CS1_PIN)  
#define LCD_CS_L		      GPIO_ResetBits(LCD_CS_PORT,LCD_CS1_PIN)

#else
#define LCD_SDA_H		      GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)  
#define LCD_SDA_L		      GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)

#define LCD_SCL_H		      GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)  
#define LCD_SCL_L		      GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)




#define LCD_CS_H		      GPIO_SetBits(LCD_CS_PORT,LCD_CS1_PIN)  
#define LCD_CS_L		      GPIO_ResetBits(LCD_CS_PORT,LCD_CS1_PIN)

//#define LCD_DC_H		      GPIO_SetBits(LCD_DC_PORT,LCD_DC_PIN)  
//#define LCD_DC_L		      GPIO_ResetBits(LCD_DC_PORT,LCD_DC_PIN)

#endif



#define  on_0      0




#if   on_0






#define     LED_BULE_off	    GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)  
#define 	  LED_BULE_on	    GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)

#define 	  LED_RED_off	    GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)  
#define 	  LED_RED_on	    GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)


#else







#define  LED_BULE_on          GPIO_SetBits(LCD_CLK_PORT,LCD_CLK_PIN)  
#define  LED_BULE_off         GPIO_ResetBits(LCD_CLK_PORT,LCD_CLK_PIN)

#define  LED_RED_on	         GPIO_SetBits(LCD_SDA_PORT,LCD_SDA_PINT)  
#define  LED_RED_off          GPIO_ResetBits(LCD_SDA_PORT,LCD_SDA_PINT)

#endif


//power
#define SYS_POWER_EN_ON	  		GPIO_SetBits(SYS_POWER_EN_PORT,SYS_POWER_EN_PIN)  
#define SYS_POWER_EN_OFF	    GPIO_ResetBits(SYS_POWER_EN_PORT,SYS_POWER_EN_PIN)  

//bm adc sw
#define BM_E0_ON			  GPIO_SetBits(BM_E0_PORT,BM_E0_PIN)		
#define BM_E0_OFF			  GPIO_ResetBits(BM_E0_PORT,BM_E0_PIN)	

#define BM_E1_ON			  GPIO_SetBits(BM_E1_PORT,BM_E1_PIN)		
#define BM_E1_OFF			  GPIO_ResetBits(BM_E1_PORT,BM_E1_PIN)	


#define gap_e3_on			  GPIO_SetBits(gap_e3_port,gap_e3_pin)		
#define gap_e3_off			  GPIO_ResetBits(gap_e3_port,gap_e3_pin)

#define gap_e2_on			  GPIO_SetBits(gap_e2_port,gap_e2_pin)		
#define gap_e2_off			  GPIO_ResetBits(gap_e2_port,gap_e2_pin)

//#define BEEP_ON				GPIO_SetBits(BEEP_PORT,BEEP_PIN)
//#define BEEP_OFF			GPIO_ResetBits(BEEP_PORT,BEEP_PIN)


#if(GB2312 == 1)//2M FLASH
	/* 	
	字库存放分为以下6个部分:
	1>Part1 : 0000~EDEF             汉字  A1~A9区 24x24
	2>Part2: EDF0~18C8F              FontB 9x24 (其中EDF0~F80F 为ASCII 0x20~0x7F,其余为代码页)
	代码页为:page0~page 5 , page 16~page19, page 255 .
	3>Part3: 18C90~8FC0F            汉字 B0~F7区  24x24
	4>Part4 : 8FC10~B060F           code page 0~code page 32, page 255    12x24
	5>Part3: B0610~E780F            code page 50~code page 96                  12x24
	6>Part2: E7810~E858F            ASCII 0x20~0x7F                                   12X24
	*/

	//#define EXTFLASH_ADDRESS_FONT_EN_16x8    (0x000DF400)
	//#define EXTFLASH_ADDRESS_FONT_CN_16x16   (0x000081C0)
	//#define EXTFLASH_ADDRESS_FONT_EN_24x12_1 (0x000E2780)
	//#define EXTFLASH_ADDRESS_FONT_EN_24x12_2 (0x000E26F0)
	//#define EXTFLASH_ADDRESS_FONT_CN_24x24   (0x001C23F0)


	#define BaseAddr1_24x24            0x000000//~0x00EDEF 
    #define BaseAddr_9x24              0x00EDF0//~0x00F80F
    #define ExtendedBaseAddr_9x24      0x00F810//~0x018C8F 
    #define BaseAddr2_24x24            0x018C90//~0x08FC0F
    #define ExtendedBaseAddr1_12x24	   0x08FC10//~0x0B060F
    #define ExtendedBaseAddr2_12x24	   0x0B0610//~0x0E780F
    #define BaseAddr_12x24             0x0E7810//~0x0E858F
   // #define UserParameterBaseAddr      0x0E9000//~0x0E9FFF 4K
	#define UserCharAddr_12x24         0x0EA000//~0x149FFF 96*4K
	#define UserCharAddr_9x17          0x0EA000//~0x149FFF 96*4K
	#define Pty860Addr				   0x100000
	#define UserCharAddr_24x24         0x14A000//~0x1A9FFF 93*4K
    #define NvImageBaseAddr            0x1AA000//~0x1BEFFF  5*16k(每幅图片最大16K)
    #define UndefinedAddr              0x1BF000//~0x1FFFFF
    #define LogAddr                    0x1FF000//~0x1FFFFF
    
	#define ZKBlockSize_12x24          0x1200
	#define ZKBlockSize_9x24           0x0D80
#endif


//PC25VF080B 8Mbit SPI Serial Flash op code
#define FLASH_WriteStatusReg	  0x01
#define FLASH_ByteProgram		  0x02
#define FLASH_ReadData			  0x03
#define FLASH_WriteDisable		  0x04
#define FLASH_ReadStatusReg		  0x05
#define FLASH_WriteEnable		  0x06
#define FLASH_FastReadData		  0x0B
#define FLASH_4KSectorErase		  0x20
#define FLASH_EnWriteSR           0x50
#define FLASH_AAIWordProgram      0xAD
#define FLASH_ChipErase			  0xC7
#define FLASH_DeviceID			  0xAB

#define DensitySetTimeLevel1       100
#define DensitySetTimeLevel2       200
#define DensitySetTimeLevel3       300
#define DensitySetTimeLevel4       450

#define BAUDRATE9600              9600
#define BAUDRATE19200            19200
#define BAUDRATE38400            38400
#define BAUDRATE57600            57600
#define BAUDRATE115200          115200

#define AD_Value_PE_EXIT		  1200
extern u32  iBaudRate;

extern unsigned char  Zimotemp[72]; 
extern unsigned char KeySelfTestPrinting_flag ;    //按键打印自检标志_
extern unsigned char Key_Feed_Line_flag;            //右键走纸标志_
extern unsigned char No_paper_flag ;
typedef struct  
{ 
	uint8_t Previous_shortreleaseKey;
	uint8_t  Previous_shortrelease_counter;
	uint8_t PreviousKeyArray[5];     //上上次按键状态
	uint8_t PreviousKey;
	uint8_t CurrentKey;
	uint8_t ProcessTime;
	uint16_t ProcessTime2;
	uint16_t ProcessTime3;  
	uint16_t ProcessTime4;          //用于记录按键按下之后计时(目前设置500),计时减到0再回主界面
	uint8_t scan_time;
	uint8_t power_state;
	uint8_t Key_Cancel_No_paper_state;      //按键按下时不显示缺纸显示的标志
	uint8_t poweron_firsttime;
	uint16_t keySelfTestProcessTime;
	uint8_t key_counter;
	uint16_t Power_Key_Long_Press;        //电源键长按标志
	uint16_t PowerKeyLongPressTime;       //电源键长按时间
	uint8_t FCancelWrongOrders;          //取消报错标志
}KEY_STRUCT;  
extern KEY_STRUCT BOARD_KEY;
extern void Cpu_Init(void);
extern void USART_Configuration(void);
extern void SerialSendByte(unsigned char SendByte);
extern void SerialSendBuff(unsigned char *SendBuff,unsigned int leng);
extern void PrinterSend(unsigned char *SendBuf,unsigned int leng);
extern void LFMotorPhaseSet(unsigned char Phase);
extern void SPI_Send_Byte(u8 out);
extern u8   SPI_Read_Byte(u32 Dst_Addr);
extern void SPI_Write_Byte(u32 Dst_Addr, u8 byte);
extern void SPI_Erase_Sector(u32 Dst_Addr);

extern void SPI_Write_nBytes(u32 Dst_Addr, u8 *Data, int nBytes);
extern void SPI_FastRead_nBytes(u32 Dst_Addr,u8 *Data , int nBytes);
extern void SPI_Read_nBytes(u32 Dst_Addr, u8 *Data, int nBytes);

extern void PrtStbAllStatus(unsigned char Status);
extern void PrinterBusy(unsigned char Status);

extern void SendnBytes_To_Head(unsigned char *pData,unsigned int nByte);
extern void KEY_Main(void);

extern void PWM_Configuration(void);
extern void MusicPlay(void);

extern void SetTphDensitySetTime(void);
extern void SetMotorSpeedTime(void);

extern void test_3(unsigned char mm);
extern void test_2(unsigned char mm);

extern void test_1(void);
extern void  charge_enable(void);

extern  void charge_disable(void);
void poweroff_set(void);
#endif

/**********************************END*****************************************/





























//     G:\Git_file\YC3121_PT26\Librarier\core\board_config.h  (souce\CmdSet.c)


/*
File Name    : board_config.h
Author       : Yichip
Version      : V1.0
Date         : 2020/07/17
Description  : board I/O config file.
*/

#ifndef __BOARD_CONFIG_H__
#define __BOARD_CONFIG_H__

#include "yc3121.h"
#include "yc_gpio.h"
#include "yc_spi.h"
#include "yc_adc.h"
#include "yc_chrg.h"


//ADC绠¤剼?嶇?
#define ADC_IO_PORT  	GPIOC
#define ADC1_IO_PIN  	GPIO_Pin_6
#define ADC2_IO_PIN  	GPIO_Pin_7
#define ADC3_IO_PIN  	GPIO_Pin_8
#define ADC4_IO_PIN  	GPIO_Pin_9

#define ADC_GAP_PIN	    ADC1_IO_PIN
#define ADC_BM_PIN	    ADC2_IO_PIN
#define ADC_TM_PIN	    ADC3_IO_PIN
#define ADC_BAT_BIN	    ADC4_IO_PIN



























//    G:\Git_file\YC3121_PT26\Source\LCD\api_ui_lcd.c

/******************************************************************************
版权所有:  深圳市。。科技有限公司 
文件名:    api_ui_led.c
作者:      wangdy
创建日期:  2021/06/2
描述:      led显示控制  
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
			  参考样式       
******************************************************************************/

/************************************头文件************************************/

//#include "api_ui_process.h"
//#include "printerConfig.h"
#include "bsp_lcd.h"
#include "api_ui_lcd.h"
#include "LcdMenu.h"
/*
#include "api_ui_main.h"
#include "api_ui_macaddr.h"
#include "api_ui_update.h"
#include "api_ui_language_choice.h"
#include "api_ui_selftest_print.h"
#include "api_ui_auto_poweroff.h"
#include "api_ui_firmware_version.h"
#include "api_ui_poweroff_charge.h"
#include "api_ui_factory_setting.h"
#include "api_ui_carriage_open.h"
#include "api_ui_datatrans.h"
#include "api_ui_paper_type.h"
#include "api_ui_auto_calibrate.h"

#include "api_ui_language.h"
#include "yc_systick.h"
#include "api_font_img.h"
#include <stdio.h>
#include <string.h>
#include "api_keyscan.h"
#include "var_global.h"
#include "printerConfig.h"
#include "api_userpara.h"
#include "api_powerctrl.h"
*/

#define UI_LCD
#ifdef UI_LCD

/*************************************宏定义*************************************/



/*************************************变量*************************************/

ST_UI_HANDLE			Current_Handle;
UICommonStoreTypeDef	UICommonStore = {0};	//存储参数信息 
UICommonTypeDef				UICommon =      //界面通用信息 
{
	.Last_MenuID = 1,	//默认转第一个界面  
};				

/*************************************函数*************************************/

/*******************************************************************************
* 名称:		UI_Menu_ShowChinese_16x16       
* 描述:		显示文本 16*16
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowChinese_16x16(uint8_t x,uint8_t y,uint8_t *chinese)
{
	uint8_t i = 0;
	uint8_t chinese_buf[2];		//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)chinese)/2; i++)
	{
		//取到汉字字模的位置  
		chinese_buf[0] = chinese[i*2 + 0];
		chinese_buf[1] = chinese[i*2 + 1];
		//取到字模信息 
		font_ptr = Get_FontChinese_16x16(chinese_buf);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Chinese_16x16(index,y,font_ptr);
			index += 16;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowAscii_16x16     
* 描述:		显示ascii 8*16
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowAscii_16x16(uint8_t x,uint8_t y,uint8_t *ascii)
{
	uint8_t i = 0;
	uint8_t ascii_index = 0;	//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)ascii); i++)
	{ 
		ascii_index = ascii[i];
		//取到字模信息 
		font_ptr = Get_FontAscii_16x16(ascii_index);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Ascii_16x16(index,y,font_ptr);
			index += 8;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowMenu_16x16     
* 描述:		显示菜单信息(用于区分语言)
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowMenu_16x16(uint8_t x,uint8_t y,uint8_t *menu)
{

	if(LCD.language==ENGLISH)
	{
		UI_Menu_ShowAscii_16x16(x,y,menu);
	}

	if(LCD.language==CHINESE)
	{
		UI_Menu_ShowChinese_16x16(x,y,menu);
	}
}


/*******************************************************************************
* 名称:		UI_Menu_ShowChinese_12x12       
* 描述:		显示文本 12*12
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowChinese_12x12(uint8_t x,uint8_t y,uint8_t *chinese)
{
	uint8_t i = 0;
	uint8_t chinese_buf[2];		//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)chinese)/2; i++)
	{
		//取到汉字字模的位置  
		chinese_buf[0] = chinese[i*2 + 0];
		chinese_buf[1] = chinese[i*2 + 1];
		//取到字模信息 
		font_ptr = Get_FontChinese_12x12(chinese_buf);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Chinese_12x12(index,y,font_ptr);
			index += 12;
		}
	}
}

/*******************************************************************************
* 名称:		UI_Menu_ShowAscii_12x12     
* 描述:		显示ascii 6*12
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowAscii_12x12(uint8_t x,uint8_t y,uint8_t *ascii)
{
	uint8_t i = 0;
	uint8_t ascii_index = 0;	//汉字数组信息 
	uint8_t index = x;
	uint8_t *font_ptr;			//汉字指针 
	
	for(i=0; i<strlen((char *)ascii); i++)
	{ 
		ascii_index = ascii[i];
		//取到字模信息 
		font_ptr = Get_FontAscii_12x12(ascii_index);
		//LCD显示 
		if(font_ptr != NULL)
		{
			LCD_Display_Ascii_12x12(index,y,font_ptr);
			index += 6;
		}
	}
}


/*******************************************************************************
* 名称:		UI_Menu_ShowMenu_12x12     
* 描述:		显示菜单信息(用于区分语言)
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
void UI_Menu_ShowMenu_12x12(uint8_t x,uint8_t y,uint8_t *menu)
{
	//if(gUserPara.Language == LANGUAGE_EN)
	if(LCD.language==ENGLISH)
	{
		//UI_Menu_ShowAscii_12x12(x,y,menu);
		UI_Menu_ShowAscii_12x12(0,y,menu);
	}
	//else if(gUserPara.Language == LANGUAGE_CN)
	else if(LCD.language==CHINESE)
	{
		UI_Menu_ShowChinese_12x12(x,y,menu);
	}
}

/*******************************************************************************
* 名称:		UI_Menu_Init       
* 描述:		UI_Menu初始化 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/
/*
void UI_Menu_Init(void)
{
	Current_Handle = UIHandle_Main;
	Current_Handle.Init(NULL);			//初始化显示信息 
}
*/
/*******************************************************************************
* 名称:		UI_Menu_OpModeChange       
* 描述:		UI_Menu
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

void UI_Menu_OpModeChange(MenuOPModeTypeDef mode, void *param)
{
	switch(mode)
	{
		case OP_MODE_MAIN:
		{
			Current_Handle = UIHandle_Main;
			Current_Handle.Init(NULL);			//初始化显示信息 
			break;
		}
		case OP_MODE_MACADDR:				//MAC
		{
			Current_Handle = UIHandle_MacAddr;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 7;
			break;
		}
		case OP_MODE_UPDATE:				//升级  
		{
			Current_Handle = UIHandle_Update;
			Current_Handle.Init(NULL);			//初始化显示信息 
			break;
		}
		case OP_MODE_LANGUAGECHOICE:		//语言选择
		{
			Current_Handle = UIHandle_LanguageChoice;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 4;
			break;
		}
		case OP_MODE_SELFTEST_PRINT:		//打印自检  
		{
			Current_Handle = UIHandle_Selftest_Print;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 1;
			break;
		}
		case OP_MODE_AUTO_POWEROFF:			//自动关机 
		{
			Current_Handle = UIHandle_AutoPoweroff;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 5;
			break;
		}
		case OP_MODE_FIRMWARE_VERSION:		//固件版本号 
		{
			Current_Handle = UIHandle_Firmware_Version;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 8;
			break;
		}
		case OP_MODE_FACTORY_SETTING:		//恢复参数 
		{
			Current_Handle = UIHandle_Factory_Setting;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 6;
			break;
		}
		case OP_MODE_PAPER_TYPE:			//纸张类型 
		{
			Current_Handle = UIHandle_PaperType;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 2;
			break;
		}
		case OP_MODE_AUTO_CALIBRATE:		//自动定标 
		{
			Current_Handle = UIHandle_AutoCalibrate;
			Current_Handle.Init(NULL);			//初始化显示信息 
			UICommon.Last_MenuID = 3;
			break;
		}
		default:
		{
			break;
		}
	}
}
*/
/*******************************************************************************
* 名称:		UI_StorePara       
* 描述:		UI配置存参 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

static void UI_StorePara(void)
{
	//跳主界面后  开始存参 
	1 -定标参数  
	if(UICommonStore.NeedStoreCaliFlag)
	{
		UICommonStore.NeedStoreCaliFlag = false;
		gCalibratePara.SensorMode = UICommonStore.SensorMode;		//纸张类型存储  
		CalibrateParaWritetoFlash(&gCalibratePara);	//写定标参数  
	}
	//2-用户参数  
	if(UICommonStore.NeedStoreLanguateFlag)
	{
		UICommonStore.NeedStoreLanguateFlag = false;
		UserParaWritetoFlash(&gUserPara);
	}
	//3-存储定时时间信息 
	if(UICommonStore.NeedStorePowerOffTimeFlag)
	{
		UICommonStore.NeedStorePowerOffTimeFlag = false;
		gUserPara.AutoPowerOffTimeEnum = UICommonStore.AutoPowerOffTimeEnum;
		UserParaWritetoFlash(&gUserPara);
	}
}

*/


/*******************************************************************************
* 名称:		UI_Menu_Process       
* 描述:		UI_Menu定时调用 
* 输入参数:	无  
* 输出参数:	无   
* 其它:		   
*******************************************************************************/

/*

void UI_Menu_Process(void)
{
	uint32_t current_count = 0;
	static uint32_t last_count = 0;
	uint32_t backmain_current_count = 0;
	static uint32_t backmain_last_count = 0;
	KeyStateTypeEnum  key_state_power = 0;
	KeyStateTypeEnum  key_state_feed = 0;
	
	//----------------跳转主界面计时信息 10MS判断一次
	backmain_current_count = SysTick_GetMyTick();
	if(backmain_last_count != backmain_current_count)
	{
		backmain_last_count = backmain_current_count;	
		if(GlobalVar.Use_Key_Menu_Flag)
		{
			GlobalVar.UI_ReturnToMain_Count++;	
			if(GlobalVar.UI_ReturnToMain_Count > LCD_RETURN_MAIN_TIMEOUT)
			{
				GlobalVar.UI_ReturnToMain_Count = 0;
				GlobalVar.Use_Key_Menu_Flag = false;
				
				//跳到主界面去 如果当前非主界面  
				if(0 != memcmp(&Current_Handle, &UIHandle_Main, sizeof(ST_UI_HANDLE)))
				{
					UI_Menu_OpModeChange(OP_MODE_MAIN,NULL);		
					UI_StorePara();			//存参 
				}
			}
		}
		else 
		{
			GlobalVar.UI_ReturnToMain_Count = 0;	
		}
	}

	//-------------------按键刷新
	if(false == GlobalVar.Use_Key_Menu_Flag)
	{
		key_state_power = Key_Get_State(KEY_POWER);		//左按键按下后  按键被菜单接管 
		if(key_state_power == KEY_PRESS_SINGLE)
		{
			GlobalVar.Use_Key_Menu_Flag = true;
			GlobalVar.UI_ReturnToMain_Count = 0;		//跳过  计数器清0  
			AutoPowerOffClear();						//清除关机计数 
			
			Current_Handle.KeyEvent(KEY_POWER);			//左键处理 
			AutoPowerOffClear();						//清除关机计数 
			
			MyPrintf("PowerKey Pressed\r\n");
		}
		
		//MyPrintf("PowerKey,Run to Screen\r\n");
	}
	//进入菜单模式   则进行处理 
	else if(true == GlobalVar.Use_Key_Menu_Flag)
	{
		key_state_power = Key_Get_State(KEY_POWER);
		key_state_feed = Key_Get_State(KEY_FEED);
		
		if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_PRESS_SINGLE))
		{
			GlobalVar.UI_ReturnToMain_Count = 0;		//计数清0  
			Current_Handle.KeyEvent(KEY_FEED);			//右键处理 
			AutoPowerOffClear();						//清除关机计数 
		}
		if((key_state_power == KEY_PRESS_SINGLE) && (key_state_feed == KEY_RELEASE))
		{
			GlobalVar.UI_ReturnToMain_Count = 0;		//计数清0  		
			Current_Handle.KeyEvent(KEY_POWER);			//左键处理 
			AutoPowerOffClear();						//清除关机计数 
		}
	}
	
//	//------------------------定时刷新  更新刷新频率  
	current_count = SysTick_GetMyTick();
	if((current_count - last_count) > LCD_REFRESH_TIME)
	{
		last_count = current_count;
		
		if((key_state_power == KEY_RELEASE) && (key_state_feed == KEY_RELEASE))
		{
			Current_Handle.KeyEvent(KEY_NULL);			//没按键 则正常做刷新  
		}
	}
}
*/
#endif



#define ADC_CH_GAP		ADC_CHANNEL_1
#define ADC_CH_BM		ADC_CHANNEL_2
#define ADC_CH_TM		ADC_CHANNEL_3
#define ADC_CH_BAT		ADC_CHANNEL_4


//DEBUG涓插彛閰?
#define UARTBAUD            	115200
#define UART0_TX_PORT       	GPIOA
#define UART0_TX_PIN        	GPIO_Pin_1
#define UART0_RX_PORT       	GPIOA
#define UART0_RX_PIN        	GPIO_Pin_0

//TPH SPI IO
#define TPH_SPI				    SPI0
#define TPH_SPI_CLK_PORT		GPIOB
#define TPH_SPI_CLK_PIN		    GPIO_Pin_14

#define TPH_SPI_MOSI_PORT		GPIOB
#define TPH_SPI_MOSI_PIN		GPIO_Pin_13

#define TPH_SPI_CS_PORT		    GPIOB
#define TPH_SPI_CS_PIN		    GPIO_Pin_15

#define TPH_STB1_PORT			GPIOB
#define TPH_STB1_PIN			GPIO_Pin_12    //加热

#define TPH_STB2_PORT			GPIOB	
#define TPH_STB2_PIN			GPIO_Pin_11    //加热

#define TPH_MDEN_PORT			GPIOC
#define TPH_MDEN_PIN			GPIO_Pin_0





//FLASH SPI_FLASH IO
#define FLASH_SPI				SPI1
#define FLASH_SPI_MOSI_PORT		GPIOC
#define FLASH_SPI_MOSI_PIN		GPIO_Pin_3

#define FLASH_SPI_MISO_PORT		GPIOC
#define FLASH_SPI_MISO_PIN		GPIO_Pin_5

#define FLASH_SPI_CLK_PORT		GPIOC
#define FLASH_SPI_CLK_PIN		GPIO_Pin_2

#define FLASH_SPI_CS_PORT		GPIOC
#define FLASH_SPI_CS_PIN		GPIO_Pin_4





#ifdef USE_LCD_IIC_PORT

//LCD I2C IO
#define LCD_IIC_SDA_PORT		GPIOA
#define LCD_IIC_SDA_PIN		       GPIO_Pin_5

#define LCD_IIC_CLK_PORT		GPIOA
#define LCD_IIC_CLK_PIN		       GPIO_Pin_4

#define LCD_RST_PORT			GPIOA
#define LCD_RST_PIN			       GPIO_Pin_3

#define LCD_CS_PORT			GPIOA
#define LCD_CS1_PIN			       GPIO_Pin_2

//#define LCD_PWR_PORT		       GPIOB
//#define LCD_PWR_PIN			GPIO_Pin_0




#else

#define LCD_SDA_PORT		       GPIOA
#define LCD_SDA_PINT			GPIO_Pin_5


#define LCD_CLK_PORT		       GPIOA
#define LCD_CLK_PIN			       GPIO_Pin_4


#define LCD_RST_PORT		       GPIOA
#define LCD_RST_PIN			       GPIO_Pin_3     //

#define LCD_CS_PORT			GPIOA
#define LCD_CS1_PIN			       GPIO_Pin_2     //            (没有用)


//#define LCD_DC_PORT			GPIOA   
//#define LCD_DC_PIN			       GPIO_Pin_15    //rxid -----------rfid


//#define LCD_PWR_PORT		       GPIOB
//#define LCD_PWR_PIN			GPIO_Pin_0     //gap_e3  -------- 

#endif


#define   Head_En_PORT		       GPIOA
#define   Head_En_PIN		       GPIO_Pin_12    //head_en         







//STEP MOTOR


#define STEP_MOTOR_A1_PORT		GPIOC
#define STEP_MOTOR_A1_PIN		GPIO_Pin_1

#define STEP_MOTOR_A2_PORT		GPIOC
#define STEP_MOTOR_A2_PIN		GPIO_Pin_10

#define STEP_MOTOR_B1_PORT		GPIOC
#define STEP_MOTOR_B1_PIN		GPIO_Pin_12

#define STEP_MOTOR_B2_PORT		GPIOC
#define STEP_MOTOR_B2_PIN		GPIO_Pin_11


#define STEP_MOTOR_EN_PORT		GPIOA
#define STEP_MOTOR_EN_PIN		GPIO_Pin_11  

#define TPH_POWER_EN_PORT		GPIOA
#define TPH_POWER_EN_PIN		GPIO_Pin_11


// SERSOR IO	
// 测试纸张位置的传感器
#define gap_e3_port				GPIOB
#define gap_e3_pin				GPIO_Pin_0    //gap_e3

#define gap_e2_port				GPIOB
#define gap_e2_pin				GPIO_Pin_5    //gap_e2

#define BM_E0_PORT				GPIOB
#define BM_E0_PIN				GPIO_Pin_6    //gap_e1

#define BM_E1_PORT				GPIOB
#define BM_E1_PIN				GPIO_Pin_10   //gap_e0


#define KEY_WAKE_PORT    		GPIOA
#define KEY_WAKE_PIN     		GPIO_Pin_13



#define KEY_SET_PORT    		GPIOA
#define KEY_SET_PIN     		GPIO_Pin_7



#define SYS_POWER_EN_PORT		GPIOA			//上电输出高
#define SYS_POWER_EN_PIN		GPIO_Pin_9

//CHARGE-GET
#define   PIN_CHARGE_STATE	    GPIO_Pin_8
#define   PORT_CHARGE_STATE		GPIOA




//#define SysTimerInt			TIMER4_IRQHandler
//#define PrtTimerInt			TIMER3_IRQHandler
//#define LFMotorInt			TIMER2_IRQHandler
#endif





























//    C:\Users\Administrator\Desktop\PT26_Project\FreeRTOS\FreeRTOSConfig.h


/*
 * FreeRTOS Kernel V10.0.1
 * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#include "yc3121.h"
#include "platform.h"

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html.
 *----------------------------------------------------------*/
#define configUSE_PREEMPTION					1
#define configUSE_IDLE_HOOK						1
#define configUSE_TICK_HOOK						0
#define configCPU_CLOCK_HZ						( CPU_MHZ )
#define configTICK_RATE_HZ						( ( TickType_t ) TICK_RATE_HZ )
#define configMAX_PRIORITIES					( 5 )
#define configMINIMAL_STACK_SIZE				( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE					( ( size_t ) ( 10 * 1024 ) )
#define configMAX_TASK_NAME_LEN					( 8 )
#define configUSE_TRACE_FACILITY				0
#define configUSE_16_BIT_TICKS					0
#define configIDLE_SHOULD_YIELD					1

#define configUSE_MUTEXES						        1
#define configCHECK_FOR_STACK_OVERFLOW			    	1
#define configGENERATE_RUN_TIME_STATS			  		0
#define configUSE_RECURSIVE_MUTEXES				  		1
#define configQUEUE_REGISTRY_SIZE				    	0
#define configUSE_COUNTING_SEMAPHORES			  		0
#define configUSE_MALLOC_FAILED_HOOK			  		1
#define configUSE_APPLICATION_TASK_TAG					0
#define configUSE_PORT_OPTIMISED_TASK_SELECTION			0
#define configUSE_TASK_EXTENSION                		0

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES							0
#define configMAX_CO_ROUTINE_PRIORITIES 			 	(2)

/* Software timer definitions. */
#define configUSE_TIMERS						    	1
#define configTIMER_TASK_PRIORITY				( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH						5
#define configTIMER_TASK_STACK_DEPTH			( configMINIMAL_STACK_SIZE * 5 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet						1
#define INCLUDE_uxTaskPriorityGet						1
#define INCLUDE_vTaskDelete								1
#define INCLUDE_vTaskCleanUpResources					0
#define INCLUDE_vTaskSuspend							1
#define INCLUDE_vTaskDelayUntil							1
#define INCLUDE_vTaskDelay						  		1


/* This demo makes use of one or more example stats formatting functions.  These
format the raw data provided by the uxTaskGetSystemState() function in to human
readable ASCII form.  See the notes in the implementation of vTaskList() within
FreeRTOS/Source/tasks.c for limitations. */
#define configUSE_STATS_FORMATTING_FUNCTIONS	0

/*
enable queue sets
*/
#define configUSE_QUEUE_SETS                    1

#endif /* FREERTOS_CONFIG_H */




























//                G:\Git_file\YC3121_PT26\Librarier\sdk\yc_lpm.c


#include "yc_lpm.h"

uint32_t lpm_read(volatile int *addr)
{
    return ((uint32_t(*)(volatile int *addr))FUNC_LPM_READ_ADDR)(addr);
}

void lpm_write(volatile int *addr, uint32_t value)
{
    ((void(*)(volatile int *addr, uint32_t value))FUNC_LPM_WRITE_ADDR)(addr, value);
}

void lpm_bt_write(uint8_t type, uint32_t val)
{
    //  ((void(*)(uint8_t type,uint32_t val))FUNC_LPM_BT_WRITE_ADDR)(type,val);
    enable_clock(CLKCLS_BT);
    *(volatile uint8_t *)0xc804c = (val & 0x000000ff) >> 0;
    delay_us(1);
    *(volatile uint8_t *)0xc804d = (val & 0x0000ff00) >> 8;
    delay_us(1);
    *(volatile uint8_t *)0xc804e = (val & 0x00ff0000) >> 16;
    delay_us(1);
    *(volatile uint8_t *)0xc804f = (val & 0xff000000) >> 24;
    delay_us(1);
    *(volatile uint8_t *)0xc8005 = 1 << type;
    delay_ms(1);
}

uint32_t lpm_bt_read(uint8_t type)
{
    if (type == LPMBT_WKUPLOW || type == LPMBT_WKUPHIGH)
    {
        return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type)) >> 2;
    }
    else
    {
        return (((uint32_t(*)(uint8_t type))FUNC_LPM_BT_READ_ADDR)(type));
    }
}

void lpm_sleep(void)
{
    ((void(*)())FUNC_LPM_SLEEP_ADDR)();
}

void setlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val)
{
    ((void(*)(volatile int *addr, uint8_t startbit, uint8_t bitwidth, uint32_t val))FUNC_SETLPMVAL_ADDR)(addr, startbit, bitwidth, val);
}

uint32_t readlpmval(volatile int *addr, uint8_t startbit, uint8_t bitwidth)
{
    uint32_t tmp = 0;
    if (32 == bitwidth)
    {
        tmp = lpm_read(addr);
        return ((tmp >> startbit) & ((1 << bitwidth) - 1));
    }
    else
    {
        return lpm_read(addr);
    }
}

void GPIO_Unused_Pd(void)
{
    for (int i = 0; i < 48; i++)
    {
        if (GPIO_CONFIG(i) == 0 || GPIO_CONFIG(i) == 4 || GPIO_CONFIG(i) == 5)
        {
            GPIO_CONFIG(i) |= GPCFG_PD;
        }
    }
}

static uint32_t value_rtc_1s = 0;

static uint32_t get_otp(void)
{
    uint32_t time;

    if (value_rtc_1s == 0)
    {
        read_otp(0x13e, (uint8_t *)&time, 2);
        time = (time == 0) ? 0x8000 : time;
        time &= (~((uint32_t)0x1 << 31));
    }
    else
    {
        time = value_rtc_1s;
        time |= ((uint32_t)0x1 << 31);
    }

    return time;
}

void BT_Hibernate(void)
{
#if (VERSIONS == EXIST_BT)
    if(TRUE == ipc_inited)
    {
        ipc_inited = FALSE;

        read_otp(0x13e, (uint8_t *)&value_rtc_1s, 2);
        value_rtc_1s = (value_rtc_1s == 0) ? 0x8000 : value_rtc_1s;

        BT_CONFIG &= ~(1 << BT_INIT_FLAG);

        NVIC_DisableIRQ(BT_IRQn);
        SYSCTRL_ROM_SWITCH = 0x90;

        HCI_TypeDef IpcRxData;
        IpcRxData.type = 1;
        IpcRxData.opcode = 0x27;
        IpcRxData.DataLen = 0;
        IPC_TxData(&IpcRxData);
        //delay(10000);
        delay_ms(60);
    }
#elif (VERSIONS == NO_BT || VERSIONS == NO_XTAL)
    if(TRUE == ipc_inited)
    {
        ipc_inited = FALSE;
        BT_CONFIG &= ~(1 << BT_INIT_FLAG);
        NVIC_DisableIRQ(BT_IRQn);
        SYSCTRL_ROM_SWITCH = 0x90;
        lpm_bt_write(2,0);
        delay_us(1000);
        lpm_bt_write(3,0);
        delay_us(1000);
        lpm_bt_write(5,0);
        delay_us(1000);
        lpm_bt_write(1,0xd80000);
        delay_us(1000);
        lpm_bt_write(4,0x50000);
        delay_us(1000);
    }
#endif
}

void Chip_Speedstep(void)
{
    SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div8);
}

void CM0_Sleep(uint32_t time, uint32_t GPIO_Pin0_Pin31, uint16_t GPIO_Pin32_Pin47, uint8_t islow_wakeup, uint8_t is_powerdownbt)
{
    uint32_t temp;

    SYSCTRL_AHBPeriphClockCmd(SYSCTRL_AHBPeriph_INTR | SYSCTRL_AHBPeriph_SHA | \
                            SYSCTRL_AHBPeriph_CRC | SYSCTRL_AHBPeriph_PWM | \
                            SYSCTRL_AHBPeriph_WDT | SYSCTRL_AHBPeriph_USB | \
                            SYSCTRL_AHBPeriph_SPI | SYSCTRL_AHBPeriph_DES | \
                            SYSCTRL_AHBPeriph_RSA | SYSCTRL_AHBPeriph_ASE | \
                            SYSCTRL_AHBPeriph_7816 | SYSCTRL_AHBPeriph_SM4 | \
                            SYSCTRL_AHBPeriph_7811 | SYSCTRL_AHBPeriph_ADC7811 | \
                            SYSCTRL_AHBPeriph_CP, DISABLE);

    //DISABLE RTC WAKEUP
    setlpmval(LPM_GPIO_WKHI, 17, 1, 0);

    //set gpio wakeup level
    setlpmval(LPM_GPIO_WKHI, 18, 1, islow_wakeup ? 1 : 0);

    //set gpio num
    if(GPIO_Pin0_Pin31!=0 || GPIO_Pin32_Pin47!=0)
    {
        for(int i = 0;i < 32;i++)
        {
            if((GPIO_Pin0_Pin31 & (1<<i)) != 0)
            {
                if (islow_wakeup)
                    GPIO_CONFIG(i) = PULL_UP;
                else
                    GPIO_CONFIG(i) = PULL_DOWN;
            }
        }
        for(int i = 0;i<16;i++)
        {
            if((GPIO_Pin32_Pin47 & (1<<i)) != 0)
            {
                if (islow_wakeup)
                    GPIO_CONFIG(i+32) = PULL_UP;
                else
                    GPIO_CONFIG(i+32) = PULL_DOWN;
            }
        }
        setlpmval(LPM_GPIO_WKUP, 0, 32, GPIO_Pin0_Pin31);
        setlpmval(LPM_GPIO_WKHI, 0, 16, GPIO_Pin32_Pin47);
    }
    else
    {
        setlpmval(LPM_GPIO_WKUP, 0, 32, 0);
        setlpmval(LPM_GPIO_WKHI, 0, 16, 0);
    }

    temp = get_otp();

    if (time)
    {
        //SET SECMAX
        setlpmval(LPM_SECMAX, 0, 16, temp);
        //SET SLEEP CNT
        setlpmval(LPM_WKUP_TIMER, 0, 32, time);
        //clr RTC CNT
        setlpmval(LPM_RTC_CNT, 0, 32, 0);
        // ENABLE RTC WAKEUP
        setlpmval(LPM_GPIO_WKHI, 17, 1, 1);
    }

    if (is_powerdownbt == 1 && (temp >> 31) == 0)
    {
        BT_Hibernate();
    }

    lpm_sleep();
}

void enable_gpio_32(void)
{
    uint32_t value = lpm_bt_read(LPMBT_CONTROL1);
    value &= ~(1<<17);
    lpm_bt_write(LPMBT_CONTROL1, value);
}





























//           G:\Git_file\YC3121_PT26\Librarier\startup\flash_start.s

			AREA    |.flash_start|, CODE, READONLY  ,ALIGN=4

Reset_Handler PROC
			EXPORT  Reset_Handler
			IMPORT  __main
			LDR 	R0, =__main
			BX 		R0
			ENDP	


hard_fault_handler PROC
			EXPORT  hard_fault_handler 
			ldr r0,=HARD_FAULT_IRQHandler       
			bx r0
			nop
			ENDP
		
svc_handler PROC
			EXPORT  svc_handler         
			ldr r0,=SVC_IRQHandler
			bx r0
			nop
			ENDP

pendsv_handler PROC
			EXPORT  pendsv_handler      
			ldr r0,=PENDSV_IRQHandler
			bx r0
			nop
			ENDP
		
systick 	PROC
			EXPORT systick 
			ldr r0,=SYSTICK_IRQHandler
			bx r0
			nop
			ENDP
		
irq0 		PROC
			EXPORT irq0
			movs r0,#4*0
			b isr
			ENDP
				
irq1 		PROC
			EXPORT irq1
			movs r0,#4*1
			b isr
			ENDP
				
irq2 		PROC
			EXPORT irq2
			movs r0,#4*2
			b isr
			ENDP
				
irq3 		PROC
			EXPORT irq3
			movs r0,#4*3
			b isr
			ENDP

irq4 		PROC
			EXPORT irq4
			movs r0,#4*4
			b isr
			ENDP
				
irq5 		PROC
			EXPORT irq5
			movs r0,#4*5
			b isr
			ENDP
				
irq6 		PROC
			EXPORT irq6
			movs r0,#4*6
			b isr
			ENDP
				
irq7 		PROC
			EXPORT irq7
			movs r0,#4*7
			b isr
			ENDP

irq8 		PROC
			EXPORT irq8
			movs r0,#4*8
			b isr
			ENDP
				
irq9 		PROC
			EXPORT irq9
			movs r0,#4*9
			b isr
			ENDP
				
irq10 		PROC
			EXPORT irq10
			movs r0,#4*10
			b isr
			ENDP
				
irq11 		PROC
			EXPORT irq11
			movs r0,#4*11
			b isr
			ENDP

irq12 		PROC
			EXPORT irq12
			movs r0,#4*12
			b isr
			ENDP
				
irq13 		PROC
			EXPORT irq13
			movs r0,#4*13
			b isr
			ENDP
				
irq14 		PROC
			EXPORT irq14
			movs r0,#4*14
			b isr
			ENDP
				
irq15 		PROC
			EXPORT irq15
			movs r0,#4*15
			b isr
			ENDP
				
irq16 		PROC
			EXPORT irq16
			movs r0,#4*16
			b isr
			ENDP
				
irq17 		PROC
			EXPORT irq17
			movs r0,#4*17
			b isr
			ENDP
				
irq18 		PROC
			EXPORT irq18
			movs r0,#4*18
			b isr
			ENDP
				
irq19 		PROC
			EXPORT irq19
			movs r0,#4*19
			b isr
			ENDP

irq20 		PROC
			EXPORT irq20
			movs r0,#4*20
			b isr
			ENDP
				
irq21 		PROC
			EXPORT irq21
			movs r0,#4*21
			b isr
			ENDP
				
irq22 		PROC
			EXPORT irq22
			movs r0,#4*22
			b isr
			ENDP
				
irq23 		PROC
			EXPORT irq23
			movs r0,#4*23
			b isr
			ENDP

irq24 		PROC
			EXPORT irq24
			movs r0,#4*24
			b isr
			ENDP
				
irq25 		PROC
			EXPORT irq25
			movs r0,#4*25
			b isr
			ENDP
				
irq26 		PROC
			EXPORT irq26
			movs r0,#4*26
			b isr
			ENDP
				
irq27 		PROC
			EXPORT irq27
			movs r0,#4*27
			b isr
			ENDP

irq28 		PROC
			EXPORT irq28
			movs r0,#4*28
			b isr
			ENDP
				
irq29 		PROC
			EXPORT irq29
			movs r0,#4*29
			b isr
			ENDP
				
irq30		PROC
			EXPORT irq30
			movs r0,#4*30
			b isr
			ENDP
				
irq31 		PROC
			EXPORT irq31
			movs r0,#4*31
			b isr
			ENDP				
				

isr    		PROC
			ldr r1,=isr_table
			ldr r0,[r0, r1]
			bx r0
			ENDP
					
				ALIGN	
NMI_IRQHandler  		PROC
						EXPORT      NMI_IRQHandler				[WEAK]
						B	.
						ENDP

HARD_FAULT_IRQHandler   PROC
						EXPORT      HARD_FAULT_IRQHandler		[WEAK]
						B	.
						ENDP

SVC_IRQHandler   		PROC
						EXPORT      SVC_IRQHandler				[WEAK]
						B	.
						ENDP

PENDSV_IRQHandler   	PROC
						EXPORT      PENDSV_IRQHandler			[WEAK]
						B	.
						ENDP
							
SYSTICK_IRQHandler   	PROC
						EXPORT      SYSTICK_IRQHandler			[WEAK]
						B	.
						ENDP
					
EXTI0_IRQHandler   		PROC
						EXPORT      EXTI0_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI1_IRQHandler   		PROC
						EXPORT      EXTI1_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI2_IRQHandler   		PROC
						EXPORT      EXTI2_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI3_IRQHandler   		PROC
						EXPORT      EXTI3_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI4_IRQHandler   		PROC
						EXPORT      EXTI4_IRQHandler			[WEAK]
						B	.
						ENDP
							
EXTI5_IRQHandler   		PROC
						EXPORT      EXTI5_IRQHandler			[WEAK]
						B	.
						ENDP	
					
Default_Handler PROC
; ToDo:  Add here the export definition for the device specific external interrupts handler
                EXPORT		USB_IRQHandler	 	[WEAK]
				EXPORT		IIC_IRQHandler   	[WEAK]
				EXPORT		QSPI_IRQHandler  	[WEAK]
				EXPORT		SPI0_IRQHandler  	[WEAK]
				EXPORT		SPI1_IRQHandler  	[WEAK]
				EXPORT		UART0_IRQHandler 	[WEAK]
				EXPORT		UART1_IRQHandler 	[WEAK]
				EXPORT 		MEMCP_IRQHandler 	[WEAK]				
				EXPORT		RSA_IRQHandler   	[WEAK]
				EXPORT		SCI0_IRQHandler  	[WEAK]
				EXPORT		SCI1_IRQHandler  	[WEAK]
				EXPORT		BT_IRQHandler 		[WEAK]
				EXPORT		GPIO_IRQHandler    	[WEAK]
				EXPORT		TIMER0_IRQHandler	[WEAK]
				EXPORT		TIMER1_IRQHandler	[WEAK]
				EXPORT		TIMER2_IRQHandler	[WEAK]
				EXPORT		TIMER3_IRQHandler	[WEAK]
				EXPORT		TIMER4_IRQHandler	[WEAK]
				EXPORT		TIMER5_IRQHandler	[WEAK]
				EXPORT		TIMER6_IRQHandler	[WEAK]
				EXPORT		TIMER7_IRQHandler	[WEAK]
				EXPORT		TIMER8_IRQHandler 	[WEAK]
				EXPORT		SM4_IRQHandler   	[WEAK]	
				EXPORT		SEC_IRQHandler		[WEAK]	
				EXPORT		MSR_IRQHandler		[WEAK]	
				EXPORT		TRNG_IRQHandler		[WEAK]	
				EXPORT 		WDT_IRQHandler		[WEAK]

; ToDo:  Add here the names for the device specific external interrupts handler
USB_IRQHandler	 	
IIC_IRQHandler   	
QSPI_IRQHandler  	
SPI0_IRQHandler  	
SPI1_IRQHandler  	
UART0_IRQHandler 	
UART1_IRQHandler 	
MEMCP_IRQHandler 	
RSA_IRQHandler   	
SCI0_IRQHandler  	
SCI1_IRQHandler  	
BT_IRQHandler 		
GPIO_IRQHandler    	
TIMER0_IRQHandler	
TIMER1_IRQHandler	
TIMER2_IRQHandler	
TIMER3_IRQHandler	
TIMER4_IRQHandler	
TIMER5_IRQHandler	
TIMER6_IRQHandler	
TIMER7_IRQHandler	
TIMER8_IRQHandler 	
SM4_IRQHandler   	
SEC_IRQHandler		
MSR_IRQHandler		
TRNG_IRQHandler		
WDT_IRQHandler		
                B       .
                ENDP
					
					
					
			EXPORT isr_table				
isr_table	DCD     USB_IRQHandler	 
			DCD 	IIC_IRQHandler   
			DCD 	QSPI_IRQHandler  
			DCD 	SPI0_IRQHandler  
			DCD 	SPI1_IRQHandler  
			DCD 	UART0_IRQHandler 
			DCD 	UART1_IRQHandler 
			DCD 	MEMCP_IRQHandler 
			DCD 	RSA_IRQHandler   
			DCD 	SCI0_IRQHandler  
			DCD 	SCI1_IRQHandler  
			DCD 	BT_IRQHandler 
			DCD 	GPIO_IRQHandler         
			DCD 	TIMER0_IRQHandler
			DCD 	TIMER1_IRQHandler
			DCD 	TIMER2_IRQHandler
			DCD 	TIMER3_IRQHandler
			DCD 	TIMER4_IRQHandler
			DCD 	TIMER5_IRQHandler
			DCD 	TIMER6_IRQHandler
			DCD 	TIMER7_IRQHandler
			DCD 	TIMER8_IRQHandler 
			DCD 	SM4_IRQHandler   
			DCD 	SEC_IRQHandler
			DCD 	MSR_IRQHandler
			DCD 	TRNG_IRQHandler
			DCD 	WDT_IRQHandler
			END
			
			



		




























//         G:\Git_file\YC3121_PT26\Librarier\sdk\yc_uart.h


/*
File Name    : yc_uart.c
Author       : Yichip
Version      : V1.0
Date         : 2019/12/4
Description  : UART encapsulation.
*/
#ifndef __YC_UART_H__
#define __YC_UART_H__

#include "yc3121.h"

/** @def time of UART receive data  time out intterrupt. real time = regvalue*48
  * @{
  */
#define TIME_IT_TIMEOUT (uint16_t)0x01

/** @defgroup USART_Mode
  * @{
  */
#define Mode_Single_Line       (1<<6)
#define Mode_duplex            (0<<6)
#define IS_MODE(MODE)  (((MODE) == Mode_Single_Line) ||\
                        ((MODE) == Mode_duplex))
/**
  * @}
  */

/** @
  * @defgroup USART_DataBits
  */
#define Databits_8b            (0<<2)
#define Databits_9b            (1<<2)

#define IS_USART_WORD_LENGTH(LENGTH)  (((LENGTH) == Databits_8b) || \
                                       ((LENGTH) == Databits_9b))
/**
  * @}
  */

/** @defgroup USART_Stop_Bits
  * @{
  */
#define StopBits_1            (0<<3)
#define StopBits_2            (1<<3)
#define IS_USART_STOPBITS(STOPBITS)  (((STOPBITS) == StopBits_1) ||  \
                                      ((STOPBITS) == StopBits_2) )
/**
  * @}
  */

/** @defgroup USART_Hardware_Flow_Control
  * @{
  */
#define FlowCtrl_None       (0<<4)
#define FlowCtrl_Enable     (1<<4)

#define IS_FlowCtrl(CONTROL)  (((CONTROL) == FlowCtrl_None) || \
                               ((CONTROL) == FlowCtrl_Enable))
/**
  * @}
  */

/** @defgroup UART_Interrupt_Type_definition
  * @{
  */
#define UART_IT_TX	      0x01
#define UART_IT_RX        0x02
#define IS_UART_IT(x)     (x == UART_IT_TX)||(x == UART_IT_RX)
/**
  * @}
  */

/** @defgroup USART_Parity
* @{
*/
#define   Parity_None       (0<<1)
#define   Parity_Even       (0<<1)
#define   Parity_Odd        (1<<1)
#define IS_PARITY(PARITY)  (((PARITY) == Parity_Even) ||\
                            ((PARITY) == Parity_None)  ||\
                            ((PARITY) == Parity_Odd))
/**
  * @}
  */

/** @defgroup USART_BaudRate
* @{
*/
#define IS_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0x5B8) && ((BAUDRATE) < 0x0044AA21))
/**
  * @}
  */

typedef struct
{
    uint8_t Mode;         /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.
                             This parameter can be a value of @ref USART_Mode */

    uint32_t BaudRate;    /*!< This member configures the USART communication baud rate. */

    uint8_t DataBits;     /*!< Specifies the number of data bits transmitted or received in a frame.
                             This parameter can be a value of @ref USART_DataBits */

    uint8_t StopBits;     /*!< Specifies the number of stop bits transmitted.
                             This parameter can be a value of @ref USART_Stop_Bits */

    uint8_t Parity;       /*!< Specifies the parity mode.
                             This parameter can be a value of @ref USART_Parity
                             @note When parity is enabled, the computed parity is inserted
                             at the MSB position of the transmitted data (9th bit when
                             the word length is set to 9 data bits; 8th bit when the
                             word length is set to 8 data bits). */

    uint8_t FlowCtrl;     /*!< Specifies wether the hardware flow control mode is enabled or disabled.
                             This parameter can be a value of @ref USART_Hardware_Flow_Control */

    int RxBufLen;          /*!< Specifies uart DMA Rx  buff length */

} UART_InitTypeDef;

/** @defgroup UART_TypeDef
* @{
*/
typedef enum
{
    UART0 = 0,
    UART1,
} UART_TypeDef;

#define IS_UART(UARTx) (UARTx == UART0 ||UARTx == UART1)
/**
 * @}
 */

/**
  * @brief  ENABLE or DISABLE UARTx auto flow control
  * @param  USARTx: Select the USART or the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  NewState:ENABLE or DISABLE auto flow control
  * @retval None
  */
void UART_AutoFlowCtrlCmd(UART_TypeDef UARTx, FunctionalState NewState);

/**
  * @brief  Clear IT
  * @param  USARTx: Select the USART or the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @retval None
  */
void UART_ClearIT(UART_TypeDef UARTx);

/**
  * @brief  DeInit UART
  * @param  UARTx: Select the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @retval None
  */
void UART_DeInit(UART_TypeDef UARTx);

/**
  * @brief  Transmits datas via UART DMA .
  * @param  USARTx: Select the USART or the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  buf: pointer to a buf that contains the data you want transmit.
  * @param  len: the buf length
  * @retval None
  */
void UART_DMASendBuf(UART_TypeDef UARTx, uint8_t *buf, int len);

/**
  * @brief  Get IT Identity
  * @param  UARTx: Select the UART peripheral.
  * @retval IT Identity
  */
uint8_t UART_GetITIdentity(UART_TypeDef UARTx);

/**
  * @brief  Initializes the USARTx peripheral according to the specified
  *         parameters in the USART_InitStruct .
  * @param  UARTx: Select the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  USART_InitStruct: pointer to a USART_InitTypeDef structure
  *         that contains the configuration information for the specified USART
  *         peripheral.
  * @retval None
  */
void UART_Init(UART_TypeDef UARTx, UART_InitTypeDef *UART_InitStruct);

/**
  * @brief  Judge Rx fifo full is or not.
  * @param  UARTx: Select the UART peripheral.
  * @retval TRUE:Rx fifo is full.
  *         FALSE:Rx fifo is not full
  */
Boolean UART_IsRXFIFOFull(UART_TypeDef UARTx);

/**
  * @brief  Judge Rx fifo empty is or not.
  * @param  UARTx: Select the UART peripheral.
  * @retval TRUE:Rx fifo is not empty.
  *         FALSE:Rx fifo is empty;
  */
Boolean UART_IsRXFIFONotEmpty(UART_TypeDef UARTx);

/**
  * @brief  Judge UART is Busy or not
  * @param  UARTx: Select the UART peripheral.
  * @retval None
  */
Boolean UART_IsUARTBusy(UART_TypeDef  UARTx);

/**
  * @brief  Config Interrupt trigger mode
  * @param  USARTx: Select the USART or the UART peripheral.
  *                 This parameter can be one of the following values:
  *                 UART0, UART1.
  * @param  UART_IT: Interrupt trigger mode ,this param will the following values,
  *         UART_IT_TX:interrupt trigger after send data completed.
  *         UART_IT_RX:interrupt trigger when received data.
  * @param  NewState:
  * @retval None
  */
void UART_ITConfig(UART_TypeDef UARTx, uint32_t UART_IT, FunctionalState NewState);

/**
  * @brief  Receive single data through the USARTx peripheral.
  * @param  USARTx: Select the USART or the UART peripheral.
  *   This parameter can be one of the following values:
  *   UART0, UART1.
  * @retval None
  */
uint8_t UART_ReceiveData(UART_TypeDef UARTx);

/**
  * @brief  Receives datas through the UART DMA.
  * @param  USARTx: Select the USART or the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  buf: pointer to a buf that contains the data you want receive.
  * @param  len: the buf length
  * @retval None
  */
int UART_RecvBuf(UART_TypeDef UARTx, uint8_t *buf, int len);

/**
  * @brief T ransmits datas via UART DMA,the function will return after datas is sent.
  * @param USARTx: Select the USART or the UART peripheral.
  *          This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  buf: pointer to a buf that contains the data you want transmit.
  * @param  len: the buf length
  * @retval None
  */
void UART_SendBuf(UART_TypeDef UARTx, uint8_t *buf, int len);

/**
  * @brief  UART Send One Data
  * @param  UARTx: Select  the UART peripheral.
  * @retval None
  */
void UART_SendData(UART_TypeDef UARTx, uint8_t Data);

/**
  * @brief  UART_SetITTimeout
  * @param  USARTx: Select the USART or the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
	*         timeout: 0x0000~0xffff
  * @retval None
  */
void UART_SetITTimeout(UART_TypeDef UARTx, uint16_t timeout);

/**
  * @brief  Set the number of uart receive data intterupt trigger
  * @param  UARTx: Select the UART peripheral.
  *         This parameter can be one of the following values:
  *         UART0, UART1.
  * @param  Bcnt: if the number of receive datas greater than Bcnt,interrupt trigger
  * @retval None
  */
void UART_SetRxITNum(UART_TypeDef UARTx, uint8_t Bcnt);

/**
  * @brief  Fills each USART_InitStruct member with its default value.
  * @param  USART_InitStruct: pointer to a USART_InitTypeDef structure
  *         which will be initialized.
  * @retval None
  */
void UART_StructInit(UART_InitTypeDef *UART_InitStruct);

/**
  * @brief  UART_ReceiveDataLen
  * @param  UARTx: UART0 or UART1
  * @retval Data len
  */
uint16_t UART_ReceiveDataLen(UART_TypeDef UARTx);

#endif /*__YC_UART_H__*/





























//         G:\Git_file\YC3121_PT26\Librarier\sdk\yc_uart.c

/*
File Name    : yc_uart.c
Author       : Yichip
Version      : V1.0
Date         : 2019/12/4
Description  : UART encapsulation.
*/
#include "yc_uart.h"

#define uart_DMA_buf_len    1024
uint8_t uart0_DMA_buf[uart_DMA_buf_len] = {0};
uint8_t uart1_DMA_buf[uart_DMA_buf_len] = {0};

#define RX_ENABLE_BIT       0
#define RX_ENABLE           (1 << RX_ENABLE_BIT)

#define UART_DMA_ENABLE_BIT 31
#define UART_DMA_ENABLE     (1<<UART_DMA_ENABLE_BIT)

#define TX_INTR_ENABLE_BIT  31
#define TX_INTR_ENABLE      ((uint32_t)1<< TX_INTR_ENABLE_BIT)

#define Set_RxITNum_Mask    0xff00
#define Statu_RxNum_Mask    (uint32_t)0xffff0000

void UART_AutoFlowCtrlCmd(UART_TypeDef UARTx, FunctionalState NewState)
{
    _ASSERT(IS_UART(UARTx));

    if (NewState == ENABLE)
    {
        switch (UARTx)
        {
        case UART0:
            UART0_CTRL |= FlowCtrl_Enable;
            break;
        case UART1:
            UART1_CTRL |= FlowCtrl_Enable;
            break;
        }
    }
    else
    {
        switch (UARTx)
        {
        case UART0:
            UART0_CTRL &= (~FlowCtrl_Enable);
            break;
        case UART1:
            UART1_CTRL &= (~FlowCtrl_Enable);
            break;
        }
    }
    return;
}

void UART_ClearIT(UART_TypeDef UARTx)
{
    uint8_t ITType = UART_GetITIdentity(UARTx);
    UART_ITConfig(UARTx, ITType, DISABLE);
}

void UART_DeInit(UART_TypeDef  UARTx)
{
    _ASSERT(IS_UART(UARTx));

    switch (UARTx)
    {
    case UART0:
        UART0_CTRL = 0;
        break;
    case UART1:
        UART1_CTRL = 0;
        break;
    }
}

void UART_DMASendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
    _ASSERT(IS_UART(UARTx));
    _ASSERT(NULL != buf);
    _ASSERT((len < 0xffff));

    if (UARTx == UART0)
    {
        DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
        DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
        DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
    }
    else
    {
        DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
        DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
        DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
    }
}

uint8_t UART_GetITIdentity(UART_TypeDef UARTx)
{
    uint8_t IT_Mode = 0;
    switch (UARTx)
    {
    case UART0:
    {
        if (((UART0_CTRL & Set_RxITNum_Mask) > 0) && ((UART0_STATUS >> 16) > 0))
        {
            IT_Mode =  UART_IT_RX;
        }
        else
        {
            if ((UART0_CTRL & (uint32_t)TX_INTR_ENABLE))
            {
                IT_Mode =  UART_IT_TX;
            }
            else
            {
                IT_Mode =  FALSE;
            }
        }

    }
    break;

    case UART1:
    {
        if (((UART1_CTRL & Set_RxITNum_Mask) > 0) && ((UART1_STATUS >> 16) > 0))
        {
            IT_Mode =  UART_IT_RX;
        }
        else
        {
            if (UART1_CTRL & TX_INTR_ENABLE)
            {
                IT_Mode =  UART_IT_TX;
            }
            else
            {
                IT_Mode =  FALSE;
            }
        }
    }
    break;
    }
    return IT_Mode;
}

void UART_Init(UART_TypeDef UARTx, UART_InitTypeDef *UART_InitStruct)
{
#define RESET_BAUD (1<<7)
#define AUTO_BAUD  (0<<7)
    uint32_t reg_value = 0;
    uint32_t temp_baudrate = 0;

    _ASSERT(IS_UART(UARTx));
    _ASSERT(IS_MODE(UART_InitStruct->Mode));
    _ASSERT(IS_BAUDRATE(UART_InitStruct->BaudRate));
    _ASSERT(IS_PARITY(UART_InitStruct->Parity));
    _ASSERT(IS_FlowCtrl(UART_InitStruct->FlowCtrl));
    _ASSERT(IS_USART_STOPBITS(UART_InitStruct->StopBits));

    temp_baudrate = ((48000000 / UART_InitStruct->BaudRate) << 16);

    reg_value = RX_ENABLE                |
                UART_InitStruct->Parity  | \
                UART_InitStruct->DataBits | \
                UART_InitStruct->StopBits | \
                UART_InitStruct->FlowCtrl | \
                UART_InitStruct->Mode    | \
                RESET_BAUD               | \
                temp_baudrate;

    if (UARTx == UART0)
    {
        UART0_CTRL                 = 0;
        DMA_DEST_ADDR(DMACH_UART0) = (int)uart0_DMA_buf;
        DMA_LEN(DMACH_UART0)       = uart_DMA_buf_len;
        DMA_CONFIG(DMACH_UART0)    = 1;
        DMA_START(DMACH_UART0)    |= (1 << (DMA_RESET_BIT));
        DMA_START(DMACH_UART0)    &= ~(1 << (DMA_RESET_BIT));
        UART0_CTRL                 = 0;
        UART0_CTRL                 = reg_value;
    }
    else
    {
        UART1_CTRL                 = 0;
        DMA_DEST_ADDR(DMACH_UART1) = (int)uart1_DMA_buf;
        DMA_LEN(DMACH_UART1)       = uart_DMA_buf_len;
        DMA_CONFIG(DMACH_UART1)    = 1;
        DMA_START(DMACH_UART1)    |= (1 << (DMA_RESET_BIT));
        DMA_START(DMACH_UART1)    &= ~(1 << (DMA_RESET_BIT));
        UART1_CTRL                 = 0;
        UART1_CTRL                 = reg_value;
    }
    return;
}

Boolean UART_IsRXFIFOFull(UART_TypeDef UARTx)
{
#define BITRXFULL 1
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        return (Boolean)(UART0_STATUS & (1 << BITRXFULL));
    }
    else
    {
        return (Boolean)(UART1_STATUS & (1 << BITRXFULL));
    }
}

Boolean UART_IsRXFIFONotEmpty(UART_TypeDef  UARTx)
{
#define BITRXEMPTY 0
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        return (Boolean)((UART0_STATUS >> 16) ? 1 : 0);
    }
    else
    {
        return (Boolean)((UART1_STATUS >> 16) ? 1 : 0);
    }
}

Boolean UART_IsUARTBusy(UART_TypeDef  UARTx)
{
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        return (Boolean)(!(DMA_STATUS(DMACH_UART0) & 1));
    }
    else
    {
        return (Boolean)(!(DMA_STATUS(DMACH_UART1) & 1));
    }
}

void UART_ITConfig(UART_TypeDef UARTx, uint32_t UART_IT, FunctionalState NewState)
{
    _ASSERT(IS_UART(UARTx));
    _ASSERT(IS_UART_IT(UART_IT));

    switch (UARTx)
    {
    case UART0:
    {
        if (UART_IT == UART_IT_RX)
        {
            if (NewState)
            {
                UART0_CTRL |= ((ENABLE << 8));
            }
            else
            {
                UART0_CTRL &= ~Set_RxITNum_Mask;
            }

        }
        else if (UART_IT == UART_IT_TX)
        {
            UART0_CTRL &= (~TX_INTR_ENABLE);
            UART0_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
        }
    }
    break;

    case UART1:
    {
        if (UART_IT == UART_IT_RX)
        {
            if (NewState)
            {
                UART1_CTRL |= ((ENABLE << 8));
            }
            else
            {
                UART1_CTRL &= ~Set_RxITNum_Mask;
            }
        }
        else if (UART_IT == UART_IT_TX)
        {
            UART1_CTRL &= (uint32_t)~TX_INTR_ENABLE;
            UART1_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
        }
    }
    break;
    }
}

uint8_t UART_ReceiveData(UART_TypeDef UARTx)
{
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        return UART0_RDATA;
    }
    else
    {
        return UART1_RDATA;
    }
}

int UART_RecvBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
    uint32_t length = 0;
    volatile int *pstatus = NULL;
    volatile unsigned char *pdata = NULL;
    _ASSERT(IS_UART(UARTx));
    _ASSERT(NULL != buf);

    if (UART0 == UARTx)
    {
        pstatus = &UART0_STATUS;
        pdata = &UART0_RDATA;
    }
    else
    {
        pstatus = &UART1_STATUS;
        pdata = &UART1_RDATA;
    }

    while ((*pstatus >> 16) > 0)
    {
        if (length < len)
        {
            buf[length++] = *pdata;
        }
        else
        {
            break;
        }
    }

    return length;
}


void UART_SendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
{
    _ASSERT(IS_UART(UARTx));
    _ASSERT(NULL != buf);
    _ASSERT((len < 0xffff));

    if (UARTx == UART0)
    {
        DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
        DMA_LEN(DMACH_UART0)      = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
        DMA_START(DMACH_UART0)    = (1 << DMA_START_BIT);
        while ((!(DMA_STATUS(DMACH_UART0) & 1)));
    }
    else
    {
        DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
        DMA_LEN(DMACH_UART1)      = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
        DMA_START(DMACH_UART1)    = (1 << DMA_START_BIT);
        while ((!(DMA_STATUS(DMACH_UART1) & 1)));
    }
}

void UART_SendData(UART_TypeDef UARTx, uint8_t Data)
{
    uint8_t buf[1] = {Data};

    if (UARTx == UART0)
    {
        DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
        DMA_LEN(DMACH_UART0)      = (DMA_LEN(DMACH_UART0) & 0xffff) | 1 << 16;
        DMA_START(DMACH_UART0)    = (1 << DMA_START_BIT);
        while (!(DMA_STATUS(DMACH_UART0) & 1));
    }
    else
    {
        DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
        DMA_LEN(DMACH_UART1)      = (DMA_LEN(DMACH_UART1) & 0xffff) | 1 << 16;
        DMA_START(DMACH_UART1)    = (1 << DMA_START_BIT);
        while (!(DMA_STATUS(DMACH_UART1) & 1));
    }
}

void UART_SetITTimeout(UART_TypeDef UARTx, uint16_t timeout)
{
    if (UART0 == UARTx)
    {
        UART0_INTR = timeout;
    }
    else
    {
        UART1_INTR = timeout;
    }
}

void UART_SetRxITNum(UART_TypeDef UARTx, uint8_t Bcnt)
{
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        UART0_CTRL = (UART0_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
    }
    else
    {
        UART1_CTRL = (UART1_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
    }

}

void UART_StructInit(UART_InitTypeDef *UART_InitStruct)
{
    UART_InitStruct->BaudRate = 9600;
    UART_InitStruct->DataBits = Databits_8b;
    UART_InitStruct->FlowCtrl = FlowCtrl_None ;
    UART_InitStruct->Mode = Mode_duplex;
    UART_InitStruct->StopBits = StopBits_1;
    UART_InitStruct->Parity = 0;
}

uint16_t UART_ReceiveDataLen(UART_TypeDef UARTx)
{
    _ASSERT(IS_UART(UARTx));

    if (UART0 == UARTx)
    {
        return (uint16_t)(UART0_STATUS >> 16);
    }
    else
    {
        return (uint16_t)(UART1_STATUS >> 16);
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值