一、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 0if (gpio_reg & (1 << shift))RESTORE_GPIO_DIR = 1;else {gpio_reg |= (1 << shift);OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);}#elsegpio_reg |= (1 << shift);OUTW(IOADDR_GPIO_REG_BASE + 0x20 + ofs, gpio_reg);#endifOUTW(IOADDR_GPIO_REG_BASE + 0x40 + ofs, (1 << shift));//LED BLUEofs = 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);elsemdelay(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 BLUEofs = 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()<210?GSENSOR_OFF:SysGetFlag(FL_GSENSOR));
/*sf begin*/
if((SysGetFlag(SF_SHOCKPOWERON_CNT)>10)||(DrvPower_GetBatteryValue()<210)){Gsensor_SetSensitivityParking(GSENSOR_OFF);
}else{Gsensor_SetSensitivityParking(SysGetFlag(FL_GSENSOR));
}
/*sf end*/
三、低電檢測
System\SysMain_Exe.c:在System_OnShutdown關機函數里面調用DrvPower_GetBatteryValue通過ADC讀取當前電壓