⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wait-for-power.patch

📁 Uboot常用的移植patches, 方便定制移植到s3c2440
💻 PATCH
字号:
This patch tries to make the system stay in a mode where total powerconsumption is below 100mA until we have determined that it's safe todraw more power.This is work in progress. Don't use it.It makes the following changes:- keeps the system from booting unless we have either good battery power,  500mA from USB, or the wall charger supplying power- flashes the red (AUX) LED during this- defers initialization of the video subsystem until we're about to  display something- leaves the LED boost converter turned off until we actually need itKnown issues:- still burns way too much power, see  http://people.openmoko.org/werner/wait-for-power-try1/usb-batt.htmlIndex: u-boot/board/neo1973/gta02/gta02.c===================================================================--- u-boot.orig/board/neo1973/gta02/gta02.c+++ u-boot/board/neo1973/gta02/gta02.c@@ -45,6 +45,9 @@ /* That many seconds the power key needs to be pressed to power up */ #define POWER_KEY_SECONDS	2 +/* If the battery voltage is below this, we can't provide stable power */+#define	SAVE_POWER_MILLIVOLT	3600+ #if defined(CONFIG_ARCH_GTA02_v1) //#define M_MDIV	0x7f		/* Fout = 405.00MHz */ #define M_MDIV	0x7d		/* Fout = 399.00MHz */@@ -63,6 +66,8 @@ #define U_M_SDIV 2 #endif +extern void smedia3362_lcm_reset(int);+ unsigned int neo1973_wakeup_cause; extern unsigned char booted_from_nand; extern unsigned char booted_from_nor;@@ -293,6 +298,42 @@ #endif } +static void poll_charger(void)+{+	if (pcf50633_read_charger_type() == 1000)+		pcf50633_usb_maxcurrent(1000);+}++static void wait_for_power(void)+{+	int seconds = 0;++	while (1) {+		/* battery is present -> try to boot */+		if (!(pcf50633_reg_read(PCF50633_REG_BVMCTL) & 1))+			break;+/*+ * Consider adding this later to the above condition:+		    pcf50633_read_battvolt() >= SAVE_POWER_MILLIVOLT)+ */++		poll_charger();++		/* we have plenty of external power -> try to boot */+		if (pcf50633_usb_last_maxcurrent >= 500)+			break;++		if (neo1973_new_second())+			seconds++;++		/* blink the AUX LED */+		neo1973_led(GTA02_LED_AUX_RED, !seconds || (seconds & 1));+	}++	/* switch off the AUX LED */+	neo1973_led(GTA02_LED_AUX_RED, 0);+}+ int board_late_init(void) { 	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();@@ -300,6 +341,7 @@ 	char buf[32]; 	int menu_vote = 0; /* <= 0: no, > 0: yes */ 	int seconds = 0;+	int enter_bootmenu;  	set_revision(); @@ -310,12 +352,13 @@ 	int1 = pcf50633_reg_read(PCF50633_REG_INT1); 	int2 = pcf50633_reg_read(PCF50633_REG_INT2); -	/* switch on one of the power led's */-	neo1973_led(GTA02_LED_PWR_ORANGE, 1);+	wait_for_power();  	/* issue a short pulse with the vibrator */+	neo1973_led(GTA02_LED_AUX_RED, 1); 	neo1973_vibrator(1); 	udelay(20000);+	neo1973_led(GTA02_LED_AUX_RED, 0); 	neo1973_vibrator(0);  #if defined(CONFIG_ARCH_GTA02_v1)@@ -377,9 +420,15 @@ 	neo1973_poweroff();  continue_boot:+	enter_bootmenu = menu_vote > 0 || booted_from_nor;+	smedia3362_lcm_reset(1);+	if (!enter_bootmenu && getenv("splashimage"))+		run_command(getenv("splashimage"), 0); 	jbt6k74_init(); 	jbt6k74_enter_state(JBT_STATE_NORMAL); 	jbt6k74_display_onoff(1);+	/* switch on the backlight */+	neo1973_backlight(1);  #if 0 	{@@ -390,7 +439,7 @@ 	} #endif -	if (menu_vote > 0 || booted_from_nor) {+	if (enter_bootmenu) { 		extern struct bootmenu_setup bootmenu_setup;  		if (booted_from_nand)Index: u-boot/board/neo1973/gta02/pcf50633.c===================================================================--- u-boot.orig/board/neo1973/gta02/pcf50633.c+++ u-boot/board/neo1973/gta02/pcf50633.c@@ -58,7 +58,7 @@ 	[PCF50633_REG_MEMLDOENA] = 0x00,  	[PCF50633_REG_LEDOUT]	= 0x2f,	/* full backlight power */-	[PCF50633_REG_LEDENA]	= 0x02,	/* enabled if GPIO1 = HIGH */+	[PCF50633_REG_LEDENA]	= 0x00,	/* disabled */ 	[PCF50633_REG_LEDCTL]	= 0x05, /* ovp enabled, ocp 500mA */ 	[PCF50633_REG_LEDDIM]	= 0x20,	/* dimming curve */ Index: u-boot/drivers/misc/pcf50633.c===================================================================--- u-boot.orig/drivers/misc/pcf50633.c+++ u-boot/drivers/misc/pcf50633.c@@ -111,18 +111,13 @@ 	return 0; } -/* figure out our charger situation */-int pcf50633_read_charger_type(void)+static u_int16_t pcf50633_adc_read(u_int8_t channel, u_int8_t avg) { 	u_int16_t ret; -	/* kill ratiometric, but enable ACCSW biasing */-	pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);-	pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);- 	/* start ADC conversion of selected channel */-	pcf50633_reg_write(PCF50633_REG_ADCC1, PCF50633_ADCC1_MUX_ADCIN1 |-					       PCF50633_ADCC1_AVERAGE_16 |+	pcf50633_reg_write(PCF50633_REG_ADCC1, channel |+					       avg | 					       PCF50633_ADCC1_ADCSTART | 					       PCF50633_ADCC1_RES_10BIT); @@ -135,18 +130,41 @@ 	      (pcf50633_reg_read(PCF50633_REG_ADCS3) & 	      PCF50633_ADCS3_ADCDAT1L_MASK); +	return ret;+}++/* figure out our charger situation */+int pcf50633_read_charger_type(void)+{+	u_int16_t ret;++	if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) != 0x3)+		return 0; /* no power, just battery */++	/* kill ratiometric, but enable ACCSW biasing */+	pcf50633_reg_write(PCF50633_REG_ADCC2, 0x00);+	pcf50633_reg_write(PCF50633_REG_ADCC3, 0x01);++	ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_ADCIN1,+	    PCF50633_ADCC1_AVERAGE_16);+ 	/* well it is nearest to the 1A resistor */ 	if (ret < ((ADC_NOMINAL_RES_1A + ADC_NOMINAL_RES_NC_R_USB) / 2)) 		return 1000; -	/* ok all we know is there is no resistor, it can be USB pwr or none */-	if ((pcf50633_reg_read(PCF50633_REG_MBCS1) & 0x3) == 0x3)-		return 100; /* USB power then */+	/* there is no resistor, so it must be USB pwr */+	return 100; /* USB power then */ -	return 0; /* nope, no power, just battery */ } +u_int16_t pcf50633_read_battvolt(void)+{+	u_int16_t ret;++	ret = pcf50633_adc_read(PCF50633_ADCC1_MUX_BATSNS_RES, 0); +	return (ret * 6000) / 1024;+}  /* initialize PCF50633 register set */ void pcf50633_init(void)@@ -175,10 +193,13 @@ 	} } +int pcf50633_usb_last_maxcurrent = -1;+ void pcf50633_usb_maxcurrent(unsigned int ma) { 	u_int8_t val; +	pcf50633_usb_last_maxcurrent = ma; 	if (ma < 100) 		val = PCF50633_MBCC7_USB_SUSPEND; 	else if (ma < 500)Index: u-boot/drivers/video/smedia3362.c===================================================================--- u-boot.orig/drivers/video/smedia3362.c+++ u-boot/drivers/video/smedia3362.c@@ -223,7 +223,7 @@ 	pGD->frameAdrs = CONFIG_GLAMO_BASE + 0x00800000; 	pGD->memSize = 0x200000; /* 480x640x16bit = 614400 bytes */ -#ifdef CONFIG_GTA02_REVISION+#ifdef CONFIG_GTA02_REVISION_do_this_in_board_late_init 	/* bring up the LCM */ 	smedia3362_lcm_reset(1); 	if (getenv("splashimage"))Index: u-boot/include/pcf50633.h===================================================================--- u-boot.orig/include/pcf50633.h+++ u-boot/include/pcf50633.h@@ -387,6 +387,8 @@ /* this is to be provided by the board implementation */ extern const u_int8_t pcf50633_initial_regs[__NUM_PCF50633_REGS]; +extern int pcf50633_usb_last_maxcurrent; /* mA or -1 if unknown */+ void pcf50633_reg_write(u_int8_t reg, u_int8_t val);  u_int8_t pcf50633_reg_read(u_int8_t reg);@@ -399,5 +401,8 @@  const char *pcf50633_charger_state(void); +int pcf50633_read_charger_type(void);+u_int16_t pcf50633_read_battvolt(void);+ #endif /* _PCF50633_H */ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -