[NOVATEK] NT96580行车记录仪功能学习笔记

sdk文件结构(我个人理解)

1、DX文件夹里面是IO口以及项目使用到的相关外设配置

2、GX是外设功能实现函数所在文件夹

3、Startup文件夹是整个项目的入口,里面有个startup.c文件是main函数所在

4、UIAPP是手机APP功能设置的文件夹,增删改功能主要是在UIAPP和UIWnd文件夹里面操作

一、u-Boot升级灯

运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转

宏定义

Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h

Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_spi\nvt_flash_spi_cmd.c

自带led引脚电平设置函数

/*      LED function for FW update*/
static void led_set_gpio_high(int operation)
{
	u32 gpio_reg;
	int ofs = NVT_LED_RED_PIN/32;
	int shift = NVT_LED_RED_PIN & 0x1F;

	ofs = ofs*0x4;

	/*Set gpio as high*/
	gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);

	#if 0
	if (gpio_reg & (1 << shift))
		RESTORE_GPIO_DIR = 1;
	else {
		gpio_reg |= (1 << shift);
		OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	}
	#else
	gpio_reg |= (1 << shift);
	OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	#endif

	OUTW(IOADDR_GPIO_REG_BASE + 0x40 + ofs, (1 << shift));

	//LED BLUE
	ofs = NVT_LED_BLUE_PIN/32;
	shift = NVT_LED_BLUE_PIN & 0x1F;
	ofs = ofs*0x4;
	gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);
	gpio_reg |= (1 << shift);
	OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
	OUTW(IOADDR_GPIO_REG_BASE + 0x40 + ofs, (1 << shift));

	#if 0 // do not use delay!!! it will slow down flash erase/program!!!
	/*Config duration*/
	if (operation)
		mdelay(NVT_LED_PROGRAM_DURATION);
	else
		mdelay(NVT_LED_ERASE_DURATION);
	#endif
}

static void led_set_gpio_low(void)
{
	//u32 gpio_reg;
	int ofs = NVT_LED_RED_PIN/32;
	int shift = NVT_LED_RED_PIN & 0x1F;

	ofs = ofs*0x4;
	/*Set gpio as low*/
	OUTW(IOADDR_GPIO_REG_BASE + 0x60 + ofs, (1 << shift));

	//LED BLUE
	ofs = NVT_LED_BLUE_PIN/32;
	shift = NVT_LED_BLUE_PIN & 0x1F;

	ofs = ofs*0x4;
	OUTW(IOADDR_GPIO_REG_BASE + 0x60 + ofs, (1 << shift));

	#if 0
	/*Force gpio direction as original config*/
	if (!(RESTORE_GPIO_DIR)) {
		gpio_reg = INW(IOADDR_GPIO_REG_BASE + 0x20 + ofs);
		gpio_reg &= ~(1 << shift);
		OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);
		RESTORE_GPIO_DIR = 0;
	}
	#endif
}

在spiNand_programPage和nand_cmd_erase_block里面进行计数电平翻转

二、将内容保存在Flash里面

在UIInfo.h(na51055_PIP\code\application\source\cardv\SrcCode\UIWnd\SPORTCAM\UIInfo\UIInfo.h)里面名为UI_IndexInfo的枚举类型定义一个成员用来计数(枚举类型里面的美格成员都是一个唯一的整数值),然后通过SysSetFlag()和SysGetFlag()函数来设置和获取枚举类型成员的值

1、应用场景:ACC断开后震动开机次数计数

(1)在UIInfo.h定义一个名为SF_SHOCKPOWERON_CNT的成员来记录震动开机次数

(2)然后在震动开关机文件里面的函数应用

UIWnd\SPORTCAM\UIFlow\UIFlowMovie\UIFlowWndMovie.c:

每次开机都会跑这个函数,acc接入震动开机计数清零、acc断开开机一次计数值甲乙

System\SysMain_Exe.c:在System_OnShutdown关机函数里面判断计数值是否超过预设值,调用Gsensor_SetSensitivityParking(GSENSOR_OFF);并传入参数GSENSOR_OFF使得下次震动无法开机

	Gsensor_SetSensitivityParking(DrvPower_GetBatteryValue()<195?GSENSOR_OFF:SysGetFlag(FL_GSENSOR));

		/*sf begin*/
		if(SysGetFlag(SF_SHOCKPOWERON_CNT)>9){
			Gsensor_SetSensitivityParking(GSENSOR_OFF);
		}
		/*sf end*/

三、低电检测

System\SysMain_Exe.c:在System_OnShutdown关机函数里面调用DrvPower_GetBatteryValue通过ADC读取当前电压值并做出判断。

电压值<11.6V ACC断开后下次震动无法开机Gsensor_SetSensitivityParking(GSENSOR_OFF);

电压正常Gsensor_SetSensitivityParking(SysGetFlag(FL_GSENSOR));

应用 :低电震动不开机

Gx\include\GxInput.h

System\SysMain_Exe.c 

四、按键

1、检测灵敏度

在System\SysInput_Exe.c里面有定时器,每几秒循环在检测。SX_TIMER_ITEM的参数三就是循环检测的时间(参数*20ms)

2、拍照按键

长按:格式化存储卡并重启

短按:拍照

System\SysInput_Exe.c

void UI_DetNormalKey(void)
{
	static int press_cnt = 0;
	int adc_key ;
	adc_key = DrvKey_DetNormalKey();

	if(press_cnt)
		printf("adc_key:%d press_cnt:%d\n",adc_key,press_cnt);

	if(adc_key!=0){
		press_cnt++;
	}else if(press_cnt>30){
		if(System_GetState(SYS_STATE_CARD) == CARD_INSERTED){//判断存储卡是否插入
			UISound_Play(DEMOSOUND_SOUND_KEY_TONE);
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_STOP, 0);//停止录像
			Delay_DelayMs(1000);
			Ux_SendEvent(0, NVTEVT_EXE_SYSRESET, 0);//默认恢复设置:WiFIi名和密码等
			Delay_DelayMs(1000);
			BKG_PostEvent(NVTEVT_BKW_FORMAT_CARD);//格式化存储卡
			Delay_DelayMs(3000);
			// Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_START, 0);
			system("cd /root");
			system("reboot");
			press_cnt = 0;
		}
	}else if(press_cnt>0){
		if(gMovData.State == MOV_ST_REC){//录像开启时才进行拍照
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_RAWENC, 0);
		}
		press_cnt = 0;
	}
}

3、电源键

长按:关机

短按:开启/暂停录像

Gx\GxInput\Key\GxKey.c

void GxKey_DetPwrKey(void)
{
	static int pwr_cnt = 0;
	UINT32 uiPwrKey = DrvKey_DetPowerKey();
	if(pwr_cnt)
		printf("pwr_cnt:%d\n",pwr_cnt);
	if(uiPwrKey!=0){
		pwr_cnt++;
	}else if(pwr_cnt>30){
		UISound_Play(DEMOSOUND_SOUND_KEY_TONE);
		if (g_fpKeyCB) {
			g_fpKeyCB(KEY_CB_POWER, KEY_RELEASE, -2147483648);
		}
		pwr_cnt = 0;
	}else if(pwr_cnt>0){
		if(SysGetFlag(FL_MOVIE_REC)==0){//判断当前录像状态:开/关
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_START, 0);//开启录像
			WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STARTED);//手机APP同步
		}else{
			Ux_SendEvent(&CustomMovieObjCtrl, NVTEVT_EXE_MOVIE_REC_STOP, 0);
			WifiApp_SendCmd(WIFIAPP_CMD_NOTIFY_STATUS, WIFIAPP_RET_RECORD_STOPPED);
		}
		pwr_cnt = 0;
	}
}

五、LED灯

蓝灯L_GPIO_12:录像——开启录像闪烁、关闭录像常亮

红灯L_GPIO_11:WiFi——开启WiFi常亮、手机连接成功闪烁

1、配置

(1)在Dx\580_CARDV_EVB\IOCfg.h进行引脚配置

(2)LED灯控制函数

Dx\580_CARDV_EVB\IOCfg.c

void LED_red_ctrl(BOOL status)
{
	if(status)
		gpio_setPin(LED_RED);
	else
		gpio_clearPin(LED_RED);
}

void LED_blue_ctrl(BOOL status)
{
	if(status)
		gpio_setPin(LED_BLUE);
	else
		gpio_clearPin(LED_BLUE);
}

Dx\include\DrvExt.h 

2、WiFi和录像状态

code\application\source\cardv\SrcCode\PrjInc.h:WiFi和LED状态

UIWnd\ALEXA\UIFlow\UIFlowMovie\UIFlowMovieFuncs.h :录像状态

3、状态判断

(1)录像

SrcCode\UIApp\Movie\UIAppMovie_Exe.c:

 (2)WiFi

UIApp\Setup\UISetup_Exe.c:

UIApp\Network\UIAppNetwork.c:

4、实现LED灯闪烁

System\SysInput_Exe.c里面循环运行的定时器函数UI_DetCustom1Key

	//LED
	static WIFI_type wifi_cnt = WIFI_STATUS_OFF;
	if(cardv_status.WIFI_status!=wifi_cnt){
		if(cardv_status.WIFI_status==WIFI_STATUS_OFF){
			cardv_status.LED_status.RED_LE
  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值