亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? charge.c

?? 此壓縮包為杰得開發得z228的BSP的源代碼,可以實現很多功能,尤其是視頻解碼有很好的效果.
?? C
字號:
/********************************************************/
/* charge.c: implementation of charging about As3603.		*/
/* Author   : qzsu																			*/
/* History  : 2006-11-01																*/
/********************************************************/

#define CHARGE_WINCE

//include
#include <stdlib.h>
#include <stdio.h>
#include ".\inc\wm97xx.h"
#include ".\inc\charge.h"
#include ".\inc\powermanagement.h"

#ifdef CHARGE_WINCE
#include "hw_lib.h"
#include <windows.h>
#endif

//#define _DEBUG
#define DWORD unsigned int

#define VOL_OFFSET 7
#define VOL_MAX 500
#define VOL_MIN 343

//global
unsigned char* g_AACI_BASE = NULL;

//function
//external
//bool NoSystemStart(void);
//unsigned char GetBatteryQAccPercent(void);

//internal
void Delay(unsigned int msec);
void UDelay(unsigned int us);
static int apAACI_ReadRegister(volatile int reg);
static int apAACI_WriteRegister(volatile int reg, int value);
int GetBatteryVoltage(unsigned int* vol);


/*****************************************
Fuction:	delay msec
Input:		unsigned int msec
Output:		none
Return:		none
Modify:
*******************************************/
void Delay(unsigned int msec)
{
	int i;
	i = msec *50000;
	while(i--);
}


/*****************************************
Fuction:	delay us
Input:		unsigned int us
Output:		none
Return:		none
Modify:
*******************************************/
void UDelay(unsigned int us)
{
	int i;
	i = us *33;
	while(i--);
}


/*****************************************
Fuction:	Write a value to a CODEC control register
Input:		volatile int reg -- register address
					int value
Output:		none
Return:		ture -- success;false -- fail
Modify:
*******************************************/
// Write a value to a CODEC control register
static int apAACI_WriteRegister(volatile int reg, int value)
{
    int timer;

	if(!g_AACI_BASE)return FALSE;

    //AACI_SLFR ---#define AACI_SL1TXBUSY  0x0002---Slot 1 transceive busy????
    // Wait for TX1/2 not to be busy
    timer = AACI_TIMEOUT;
    while ((*((DWORD*)(AACI_SLFR)) & AACI_SL1TXBUSY) && timer) {//等待slot1 的傳送寄存器空閑
        UDelay(10);
        timer--;
    }
    // Note: the data value must be setup before the address
    *((DWORD*)(AACI_SL2TX)) = value << 4;//數據寄存器
    *((DWORD*)(AACI_SL1TX)) = reg   << 12;//地址寄存器

    if (timer)
        return TRUE;
    else
        return FALSE;
}

/*****************************************
Fuction:	Read a value from a CODEC control register
Input:		volatile int reg -- register address
Output:		none
Return:		value readed from register
Modify:
*******************************************/
static int apAACI_ReadRegister(volatile int reg)
{
    int timer;
    unsigned int data;//, stat;

	if(!g_AACI_BASE)return FALSE;

	timer = AACI_TIMEOUT;
    //先放數據,再放地址
    while ((*((DWORD*)(AACI_SLFR)) & AACI_SL1TXBUSY) && timer) {//等待slot1 的傳送寄存器空閑
        UDelay(10);
        timer--;
    }
	
    //先放數據,再放地址
    *((DWORD*)(AACI_SL2TX)) = 0;
    //地址為8BIT,所以應該放在20位中的高8位,所以要向右移12位
    *((DWORD*)(AACI_SL1TX)) = (reg << 12) | 0x80000;

    timer = AACI_TIMEOUT;
    while(((*((DWORD*)(AACI_SLFR)) & 0x100) == 0) && timer){//當退出這個循環的時候表示數據已經接收到了 
        UDelay(10);
        timer--;
    }

  	data = (*((DWORD*)(AACI_SL2RX)) >> 4);
	return data;
}



/*****************************************
Fuction:	check battery voltage
Input:		none
Output:		voltage value
Return:		-1:address error
					0:data error
					1:success
Modify:
*******************************************/
int GetBatteryVoltage(unsigned int* vol)
{
  unsigned int datax0,datay0;
  unsigned int voltage0,voltage1,voltage2,voltage3;
  unsigned int regValue;
  
  if(!g_AACI_BASE || !vol)
  {
  	return -1;
  }

  regValue = apAACI_ReadRegister(0x78);
#ifdef _DEBUG
	printf("apAACI_ReadRegister(0x78):%x\r\n",regValue);
#endif
	if(!(regValue == 0xc201 || regValue == 0xc001))
	{
	 	apAACI_WriteRegister(0x78, 0xc201);
		return -2;
	}
  
   	//comp1
		apAACI_WriteRegister(0x76, 0xc006);
		datax0 = apAACI_ReadRegister(0x7a)&0x0fff;
    voltage0 = datax0*250*70/(4095*34);
#ifdef _DEBUG
	printf("voltage0:%d\r\n",voltage0);
#endif
        
    if(voltage0 < VOL_MIN-VOL_OFFSET || voltage0 > VOL_MAX-VOL_OFFSET)
    {
    	return 0;
    }
        
    //comp2
		apAACI_WriteRegister(0x76, 0xd006);
		datay0 = apAACI_ReadRegister(0x7a)&0x0fff;      
    voltage1 = datay0*250*70/(4095*33);
#ifdef _DEBUG
	printf("voltage1:%d\r\n",voltage1);
#endif
        
    if(voltage1 < VOL_MIN-VOL_OFFSET || voltage1 > VOL_MAX-VOL_OFFSET)
    {
    	return 0;
    }

    voltage2= (voltage0+voltage1)/2;
    voltage3 = voltage2 + VOL_OFFSET;//銅線降壓偏差
        
#ifdef _DEBUG
	printf("GetBatteryVoltage:%d\r\n",voltage3);
#endif
	
	*vol = voltage3;
  
  return 1;
}



/*****************************************
Fuction:	get battery qacc percent using voltage check
Input:		none
Output:		none
Return:		the percent of QAcc
Modify:
*******************************************/
unsigned char GetBatteryQAccPercent(void)
{
	unsigned int vol;
	unsigned int count = 0;
	int ret;
	
	ret = GetBatteryVoltage(&vol);
	while(count++ < 100 && ret <= 0)
	{
		Sleep(20);
		ret = GetBatteryVoltage(&vol);
	}	
	if(ret == 1)
	{
		if(vol >= 420)
		{
			return 100;//100%
		}
		else if(vol >= 390 && vol < 420)
		{
			return (vol-390)*(100-80)/(420-390)+80;
		}
		else if(vol >= 360 && vol < 390)
		{
			return (vol-360)*(80-20)/(390-360)+20;
		}
		else if(vol > VOL_MIN && vol < 360)
		{
			return (vol-VOL_MIN)*(20-0)/(360-VOL_MIN);
		}
		else
		{
			return 0;
		}
	}
	return 0;
}


/*****************************************
Fuction:	judge if permit system start with check battery voltage
Input:		none
Output:		none
Return:		true -- no permit;false -- permit
Modify:
*******************************************/
bool NoSystemStart(void)
{
	unsigned int vol;
	
	if(GetBatteryVoltage(&vol) && vol <= VOL_MIN)
	{
		return true;
	}
	return false;
}


bool InitCharge(void)
{
#ifdef CHARGE_WINCE
	g_AACI_BASE = (unsigned char *)(hw_map_io(0x20037000, 0x1000, 0));
	hw_delay(1);
#else
	g_AACI_BASE = (unsigned char *)0x20037000;
#endif

	if(!g_AACI_BASE)
	{
		return false;
	}

#ifndef CHARGE_WINCE
  //下面復位信號可以讓AACI 復位
  *AACI_RESET = 0;
  Delay(100);//復位等待
  *AACI_RESET = 1;//置高電平讓外圍設備工作
  Delay(1);//等待外圍設備工作穩定
   
  *AACI_MAINCR = (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 0);
#endif

 	apAACI_WriteRegister(0x78, 0xc201);
	
	return true;
}


void DeInitCharge(void)
{
}



//======================Battery Charger Controller BEGIN=====================

void PM_ChargeInitial(void)
{
	WriteAs3603(FUELGAUGE_REG, 0x00);
	
//	WriteAs3603(CHARGECTRL_REG, 0x00);

	PM_ChargeDefaultConfig();
}



U32 PM_ChargeFinish(void)
{
	unsigned char ctrlreg;
		
	ctrlreg = ReadAs3603(CHARGECTRL_REG);
	ctrlreg	&= 0xFE;
	WriteAs3603(CHARGECTRL_REG, ctrlreg);

	return 1;
}

U8 PM_ChargerDetected(void)
{
	U8 value;
	
	value = ReadAs3603(CHARGESTATUS_REG);
	//printf("CHARGESTATUS_REG:%x\r\n",value);
	if((value & 0x01) == 0x01)//chDet
	{
		return true;
	}
	
	return false;
}



void PM_ChargeDefaultConfig(void)
{
	/* Sets charger config register
	000	N/A
	0	Enable battery presence indication
	0	Enable operation without battery
	0	Li+ battery with coke anode
	0	Disable CVM testmode
	*/
	WriteAs3603(CHARGECONF_REG, 0x00);
	
	/* Sets charger current
	TrickleCurrent 2.5mV/RSENSE
	ConstantCurrent 15mV/Rsense
	*/
	WriteAs3603(CHARGECURRENT_REG, 0x1d);//0x11);//700mA
	
	
	WriteAs3603(PRECURDAC_REG, 0x32);//0.5v r=2k
}

#define FULLQ 2200000 //uAh
U8 PM_ChargeUpdate(int* avgCurrent,U32* uiQacc,U32* uiTime)
{
	unsigned char value;
	U32 deltaCount;
	U32 deltaQ;
	U32 deltaT;
	static unsigned char trickleFlag = 0;
	static unsigned char fullFlag = 0;
	
	value = ReadAs3603(FUELGAUGE_REG);
	value |= 0x02;
	WriteAs3603(FUELGAUGE_REG, value);
	
	do
	{
		value = ReadAs3603(FUELGAUGE_REG);
	}while((value & 0x02) == 0x02);//wait update

  //time
	deltaT = ((U32)ReadAs3603(ELAPSEDMSB_REG)) << 8;
	deltaT += ReadAs3603(ELAPSEDLSB_REG);
	if(deltaT == 0)
	{
		return false;
	}
	deltaT = deltaT * 3600000;//8788;//0.8788s per count
	deltaT /= 4096;//10;

  
  //QACC
  value = ReadAs3603(CHARGESTATUS_REG);
  if(fullFlag == 0 && (value & 0x01) == 0x01)//charge
	{
		//charge check sign bit is 0
		if((ReadAs3603(DELTAMSB_REG) & 0x80) != 0)
		{
			return false;
		}
	  deltaCount = ((U32)(ReadAs3603(DELTAMSB_REG)&0x7f)) << 8;
	  deltaCount += ReadAs3603(DELTALSB_REG);
		if(deltaCount == 0)
		{
			return false;
		}
	}
	else//discharge
	{
		//charge check sign bit is 1
		if((ReadAs3603(DELTAMSB_REG) & 0x80) == 0)
		{
			return false;
		}
	  deltaCount = ((U32)(0x7f-(ReadAs3603(DELTAMSB_REG)&0x7f))) << 8;
	  deltaCount += 0xff-ReadAs3603(DELTALSB_REG);
		if(deltaCount == 0 || deltaCount == 0x7fff)
		{
			return false;
		}
	}
	deltaQ = deltaCount * 6103;//61.03uAh per count
	deltaQ /= 100;//uAh

	*uiTime = *uiTime + deltaT;//ms
  if((value & 0x01) == 0x01)//charge
	{
		*uiQacc += deltaQ;//uAh
	}
	else
	{
		if(*uiQacc > deltaQ)
		{
			*uiQacc -= deltaQ;//uAh
		}
		else
		{
			*uiQacc = 0;
		}
	}

	{double temp;
	int iTemp;
		//																							AVFC  Rsense  deltaT/1000 m歐		mA
		temp = (double)deltaCount / ( (double)deltaT * 91.0 * 50.0) * 1000.0 * 1000.0 * 1000.0;
		iTemp = (int)temp;
		*avgCurrent = iTemp;
	}
	//*avgCurrent = (U32)((double)deltaCount*1000*1000*1000 / ( deltaT * 91 * 50));//mA
	
	if(PM_ChargerDetected())
	{
		if(PM_ChargeIsFull() || (*uiQacc) > FULLQ)
		{
			*uiQacc = FULLQ;//uAh
			if(PM_ChargeIsFull())
			{
				PM_ChargeFinish();
				fullFlag = 1;
			}
		}
		else if(!trickleFlag)
		{
			if(PM_ChargeIsTrickle())
			{
				*uiQacc = FULLQ / 100 * 95;
				trickleFlag = 1;
			}
			else if((*uiQacc) > FULLQ / 100 * 94)
			{
				*uiQacc = FULLQ / 100 * 94;
			}
		}
		
		//充滿后會放電,掉到98%以下重新啟動充電
		if(fullFlag == 1 && (*uiQacc) < FULLQ / 100 * 98)
		{
			PM_ChargeStart(); 
			fullFlag = 0;
		}
	}
	
	return true;
}


U8 PM_IsCharging(void)
{
	unsigned char status;
	
	// Detectes battery
	status = ReadAs3603(CHARGESTATUS_REG);
#ifdef _DEBUG
	printf("CHARGESTATUS_REG:%.2x\r\n",status);
#endif

	if((status & 0x03) == 0x03)//chDet,chAct
	{
		return true;
	}

	return false;
}

U8 PM_ChargeIsFull(void)
{
	U8 value;
	
	value = ReadAs3603(CHARGESTATUS_REG);
	if(PM_ChargerDetected() && (value & 0x20) == 0x20)
	{
		return true;
	}
	else
	{
		return false;
	}
}

U8 PM_ChargeIsTrickle(void)
{
	U8 value;
	
	value = ReadAs3603(CHARGESTATUS_REG);
	if(PM_ChargerDetected() && (value & 0x10) == 0x10)
	{
		return true;
	}
	else
	{
		return false;
	}
}

U8 PM_ChargeIsEmpty(void)
{
	U8 value;
	
	value = ReadAs3603(CHARGESTATUS_REG);
	if(!PM_ChargerDetected() && (value & 0x20) == 0x20)
	{
		return true;
	}
	else
	{
		return false;
	}
}


U8 PM_NoBattery(void)
{
	unsigned char status;
	
	// Detectes battery
	status = ReadAs3603(CHARGESTATUS_REG);
	if(status & 0x40)
	{
//#ifdef _DEBUG
		printf("Not detecte battery!--%x\r\n",status);
//#endif
		return true;
	}

	return false;
}


U8 PM_ChargeStart(void)
{
	/* Sets Fuel Gauge Register
	1	Enables Fuel Gauge.
	0	Controls the updates of the Delta Charge MSB/LSB registers and the Elapsed Time MSB/LSB registers
	1	Request offset calibration.
	0	Sets the offset calibration mode.
	*/
	WriteAs3603(FUELGAUGE_REG, 0x01);

	
	/* Sets parameter of the charger
	0	Disables charging
	0	lithium-based battery
	0	Selects Constant Current charge mode
	0	Li+ battery with coke anode
	0	Select constant voltage charging mode
	0	Normal charger operation.
	0	Nominal current
	*/
	/* Enable charger*/
//	WriteAs3603(CHARGECTRL_REG, 0x41);//boost = 1
	WriteAs3603(CHARGECTRL_REG,ReadAs3603(CHARGECTRL_REG)|0x01);
	
	return true;
}



/************************************************************************/
//======================Battery Charger Controller END=====================


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频.com| 国产一区二区导航在线播放| 国产精品一区二区不卡| 精品av久久707| 国产精品一区二区久久不卡| 日本一区二区三区视频视频| 成人黄页毛片网站| 国产精品久久久久久久岛一牛影视 | 久久综合国产精品| 国产精品亚洲视频| 亚洲色图丝袜美腿| 欧美日韩中文字幕一区二区| 老司机午夜精品99久久| 中文字幕国产一区| 欧美日韩高清在线| 国产乱一区二区| 亚洲色图欧洲色图| 欧美巨大另类极品videosbest| 老司机免费视频一区二区三区| 国产精品色在线观看| 欧美精品亚洲一区二区在线播放| 久久99日本精品| 亚洲精品国产精华液| 精品毛片乱码1区2区3区| 99精品在线免费| 日韩精品亚洲专区| 中文字幕中文字幕在线一区 | 欧美猛男男办公室激情| 国产麻豆精品在线观看| 亚洲永久精品大片| 337p粉嫩大胆噜噜噜噜噜91av| 93久久精品日日躁夜夜躁欧美| 亚洲高清免费观看| 国产精品你懂的在线| 91精品国产免费| 91免费视频网址| 国产精品亚洲第一区在线暖暖韩国 | 国产一区二区精品久久91| 亚洲免费色视频| 久久久蜜桃精品| 欧美精品vⅰdeose4hd| a美女胸又www黄视频久久| 久久精品国产久精国产| 午夜久久久久久久久 | 国产精品电影一区二区三区| 欧美一级理论片| 91免费视频大全| 国产乱妇无码大片在线观看| 亚洲成精国产精品女| 国产精品美女久久久久久久| 日韩欧美视频在线| 欧美精品vⅰdeose4hd| 色呦呦国产精品| 懂色av一区二区三区免费观看| 久久er精品视频| 免费在线欧美视频| 日韩精品视频网| 图片区小说区国产精品视频| 亚洲精品成人在线| 亚洲欧美一区二区视频| 久久久99久久| 久久综合色8888| 精品日产卡一卡二卡麻豆| 欧美日韩一区二区三区免费看| 色综合久久久久综合体桃花网| 成人黄色电影在线 | 久99久精品视频免费观看| 亚洲一级不卡视频| 亚洲精品免费播放| 亚洲免费观看高清完整版在线| 国产精品嫩草99a| 国产视频一区二区三区在线观看 | 欧美性大战久久久久久久| 不卡av免费在线观看| 福利91精品一区二区三区| 国产成人精品综合在线观看| 国产精品一卡二卡在线观看| 国产福利不卡视频| 大白屁股一区二区视频| 高清国产一区二区| www.99精品| 91电影在线观看| 欧美性色欧美a在线播放| 欧美欧美欧美欧美| 日韩一级片网站| 久久视频一区二区| 国产色综合一区| 国产精品视频你懂的| 玉米视频成人免费看| 亚洲va在线va天堂| 久久se这里有精品| 粗大黑人巨茎大战欧美成人| 99re8在线精品视频免费播放| 91一区二区三区在线观看| 欧美日韩在线播| 精品毛片乱码1区2区3区| 国产精品视频一二三| 亚洲一区二区在线免费观看视频 | 日韩av一区二| 国产综合色视频| 成人av午夜电影| 欧美在线三级电影| 日韩一级完整毛片| 欧美激情综合网| 洋洋av久久久久久久一区| 日本亚洲电影天堂| 成人免费视频caoporn| 在线影视一区二区三区| 精品国产一区二区国模嫣然| 国产精品狼人久久影院观看方式| 亚洲伊人色欲综合网| 久久国产精品免费| 色综合天天综合给合国产| 日韩欧美一级在线播放| 亚洲特黄一级片| 青青草97国产精品免费观看无弹窗版 | av成人免费在线| 7777精品伊人久久久大香线蕉超级流畅 | 精品国内二区三区| 一区二区三区色| 国模冰冰炮一区二区| 欧美性大战久久久久久久蜜臀| 久久久午夜精品| 视频一区视频二区中文字幕| 91麻豆精品国产91久久久使用方法| 久久综合狠狠综合久久激情| 怡红院av一区二区三区| 青青草国产精品97视觉盛宴| av电影一区二区| 精品久久久久久久久久久久久久久 | 欧美疯狂做受xxxx富婆| 国产精品理伦片| 精品一二线国产| 欧美在线视频不卡| 中文字幕欧美一区| 国产一区二区三区在线观看精品| 欧美亚洲一区二区三区四区| 国产欧美精品一区| 精品在线亚洲视频| 欧美麻豆精品久久久久久| 最新欧美精品一区二区三区| 国产真实乱子伦精品视频| 欧美在线观看视频在线| 中文字幕在线不卡国产视频| 狠狠色丁香久久婷婷综| 欧美一三区三区四区免费在线看| 日韩美女久久久| 成人精品一区二区三区中文字幕 | 成人激情图片网| 国产农村妇女精品| 青青草一区二区三区| 91精品麻豆日日躁夜夜躁| 亚洲一区二区在线视频| 在线影院国内精品| 亚洲色图20p| 91蜜桃网址入口| 中文字幕av一区 二区| 成人永久aaa| 日本一区二区视频在线| 国产精品 欧美精品| 久久蜜臀中文字幕| 久久99在线观看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲欧美国产高清| 波多野结衣中文字幕一区 | 国产欧美一区二区精品性| 国产真实精品久久二三区| 久久这里都是精品| 黑人巨大精品欧美一区| 日韩精品综合一本久道在线视频| 青青草视频一区| 2024国产精品视频| 国产传媒日韩欧美成人| 国产香蕉久久精品综合网| 粉嫩久久99精品久久久久久夜| 国产欧美日韩亚州综合| 国产69精品久久777的优势| 国产精品免费av| 91麻豆视频网站| 亚洲大型综合色站| 欧美电影精品一区二区| 国产成人免费在线观看| 综合亚洲深深色噜噜狠狠网站| 色欧美片视频在线观看| 亚洲va国产天堂va久久en| 日韩一级黄色片| 香蕉影视欧美成人| 久久影院视频免费| 成人免费观看男女羞羞视频| 亚洲男人天堂av网| 欧美精品免费视频| 老色鬼精品视频在线观看播放| 久久久亚洲高清| 91福利社在线观看| 奇米在线7777在线精品| 欧美激情综合五月色丁香小说| 日本高清不卡视频| 玖玖九九国产精品| 国产精品久久久久久亚洲伦 | 日韩激情在线观看|