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

📄 cmd_trab.c

📁 嵌入式试验箱S3C2410的bootloader源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	if ((result = adc_read (2)) == -1) {		printf ("%s: VCC5V could not be read\n", __FUNCTION__);		return (-1);	}	/*	 * Calculate voltage value. Split in two parts because there is no	 * floating point support.  VCC5V is connected over an resistor divider:	 * VCC5V=ADCval*2,5V/1023*(10K+30K)/10K.	 */	result = result * 10 * 1000 / 1023; /* result in mV */	return (result);}static int test_dip (void){	static int first_run = 1;	static int first_dip;	if (first_run) {		if ((first_dip = read_dip ()) == -1) {			return (1);		}		first_run = 0;		debug ("%s: first_dip=%d\n", __FUNCTION__, first_dip);	}	if (first_dip != read_dip ()) {		return (1);	} else {		return (0);	}}static int test_vcc5v (void){	int vcc5v;	if ((vcc5v = read_vcc5v ()) == -1) {		return (1);	}	if ((vcc5v > VCC5V_MAX) || (vcc5v < VCC5V_MIN)) {		printf ("%s: vcc5v[V/100]=%d\n", __FUNCTION__, vcc5v);		return (1);	} else {		return (0);	}}static int test_rotary_switch (void){	static int first_run = 1;	static int first_rs;	if (first_run) {		/*		 * clear bits in CPLD, because they have random values after		 * power-up or reset.		 */		*CPLD_ROTARY_SWITCH |= (1 << 16) | (1 << 17);		first_rs = ((*CPLD_ROTARY_SWITCH >> 16) & 0x7);		first_run = 0;		debug ("%s: first_rs=%d\n", __FUNCTION__, first_rs);	}	if (first_rs != ((*CPLD_ROTARY_SWITCH >> 16) & 0x7)) {		return (1);	} else {		return (0);	}}static int test_sram (void){	return (memory_post_tests (SRAM_ADDR, SRAM_SIZE));}static int test_eeprom (void){	unsigned char temp[sizeof (EEPROM_TEST_STRING_1)];	int result = 0;	/* write test string 1, read back and verify */	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1,				(unsigned char*)EEPROM_TEST_STRING_1,				sizeof (EEPROM_TEST_STRING_1))) {		return (1);	}	if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1,			       temp, sizeof (EEPROM_TEST_STRING_1))) {		return (1);	}	if (strcmp ((char *)temp, EEPROM_TEST_STRING_1) != 0) {		result = 1;		printf ("%s: error; read_str = \"%s\"\n", __FUNCTION__, temp);	}	/* write test string 2, read back and verify */	if (result == 0) {		if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1,					(unsigned char*)EEPROM_TEST_STRING_2,					sizeof (EEPROM_TEST_STRING_2))) {			return (1);		}		if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1,				       temp, sizeof (EEPROM_TEST_STRING_2))) {			return (1);		}		if (strcmp ((char *)temp, EEPROM_TEST_STRING_2) != 0) {			result = 1;			printf ("%s: error; read str = \"%s\"\n",				__FUNCTION__, temp);		}	}	return (result);}static int test_contact_temp (void){	int contact_temp;	contact_temp = tsc2000_contact_temp ();	if ((contact_temp < MIN_CONTACT_TEMP)	    || (contact_temp > MAX_CONTACT_TEMP))		return (1);	else		return (0);}int i2c_write_multiple (uchar chip, uint addr, int alen,			uchar *buffer, int len){	int i;	if (alen != 1) {		printf ("%s: addr len other than 1 not supported\n",			 __FUNCTION__);		return (1);	}	for (i = 0; i < len; i++) {		if (i2c_write (chip, addr+i, alen, buffer+i, 1)) {			printf ("%s: could not write to i2c device %d"				 ", addr %d\n", __FUNCTION__, chip, addr);			return (1);		}#if 0		printf ("chip=%#x, addr+i=%#x+%d=%p, alen=%d, *buffer+i="			"%#x+%d=%p=\"%.1s\"\n", chip, addr, i, addr+i,			alen, buffer, i, buffer+i, buffer+i);#endif		udelay (30000);	}	return (0);}int i2c_read_multiple ( uchar chip, uint addr, int alen,			uchar *buffer, int len){	int i;	if (alen != 1) {		printf ("%s: addr len other than 1 not supported\n",			 __FUNCTION__);		return (1);	}	for (i = 0; i < len; i++) {		if (i2c_read (chip, addr+i, alen, buffer+i, 1)) {			printf ("%s: could not read from i2c device %#x"				 ", addr %d\n", __FUNCTION__, chip, addr);			return (1);		}	}	return (0);}static int adc_read (unsigned int channel){	int j = 1000; /* timeout value for wait loop in us */	int result;	S3C2400_ADC *padc;	padc = S3C2400_GetBase_ADC();	channel &= 0x7;	adc_init ();	padc->ADCCON &= ~ADC_STDBM; /* select normal mode */	padc->ADCCON &= ~(0x7 << 3); /* clear the channel bits */	padc->ADCCON |= ((channel << 3) | ADC_ENABLE_START);	while (j--) {		if ((padc->ADCCON & ADC_ENABLE_START) == 0)			break;		udelay (1);	}	if (j == 0) {		printf("%s: ADC timeout\n", __FUNCTION__);		padc->ADCCON |= ADC_STDBM; /* select standby mode */		return -1;	}	result = padc->ADCDAT & 0x3FF;	padc->ADCCON |= ADC_STDBM; /* select standby mode */	debug ("%s: channel %d, result[DIGIT]=%d\n", __FUNCTION__,	       (padc->ADCCON >> 3) & 0x7, result);	/*	 * Wait for ADC to be ready for next conversion. This delay value was	 * estimated, because the datasheet does not specify a value.	 */	udelay (1000);	return (result);}static void adc_init (void){	S3C2400_ADC *padc;	padc = S3C2400_GetBase_ADC();	padc->ADCCON &= ~(0xff << 6); /* clear prescaler bits */	padc->ADCCON |= ((65 << 6) | ADC_PRSCEN); /* set prescaler */	/*	 * Wait some time to avoid problem with very first call of	 * adc_read(). Without this delay, sometimes the first read	 * adc value is 0. Perhaps because the adjustment of prescaler	 * takes some clock cycles?	 */	udelay (1000);	return;}static void led_set (unsigned int state){	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();	led_init ();	switch (state) {	case 0: /* turn LED off */		gpio->PADAT |= (1 << 12);		break;	case 1: /* turn LED on */		gpio->PADAT &= ~(1 << 12);		break;	default:		break;	}}static void led_blink (void){	led_init ();	/* blink LED. This function does not return! */	while (1) {		reset_timer_masked ();		led_set (1);		udelay (1000000 / LED_BLINK_FREQ / 2);		led_set (0);		udelay (1000000 / LED_BLINK_FREQ / 2);	}}static void led_init (void){	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();	/* configure GPA12 as output and set to High -> LED off */	gpio->PACON &= ~(1 << 12);	gpio->PADAT |= (1 << 12);}static void sdelay (unsigned long seconds){	unsigned long i;	for (i = 0; i < seconds; i++) {		udelay (1000000);	}}static int global_vars_write_to_eeprom (void){	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_STATUS, 1,				(unsigned char*) &status, 1)) {		return (1);	}	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_PASS_CYCLES, 1,				(unsigned char*) &pass_cycles, 2)) {		return (1);	}	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_CYCLE,				1, (unsigned char*) &first_error_cycle, 2)) {		return (1);	}	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NUM,				1, (unsigned char*) &first_error_num, 1)) {		return (1);	}	if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NAME,				1, (unsigned char*) first_error_name,				sizeof(first_error_name))) {		return (1);	}	return (0);}static void global_vars_init (void){	status                  = 1; /* error */	pass_cycles             = 0;	first_error_cycle       = 0;	first_error_num         = 0;	first_error_name[0]     = '\0';	act_cycle               = 0;	max_cycles              = 0;}static void test_function_table_init (void){	int i;	for (i = 0; i < BIF_MAX; i++)		test_function[i].pf = dummy;	/*	 * the length of "name" must not exceed 16, including the '\0'	 * termination. See also the EEPROM address map.	 */	test_function[0].pf = test_dip;	test_function[0].name = "dip";	test_function[1].pf = test_vcc5v;	test_function[1].name = "vcc5v";	test_function[2].pf = test_rotary_switch;	test_function[2].name = "rotary_switch";	test_function[3].pf = test_sram;	test_function[3].name = "sram";	test_function[4].pf = test_eeprom;	test_function[4].name = "eeprom";	test_function[5].pf = test_contact_temp;	test_function[5].name = "contact_temp";}static int read_max_cycles (void){	if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_MAX_CYCLES, 1,			       (unsigned char *) &max_cycles, 2) != 0) {		return (1);	}	return (0);}static int dummy(void){	return (0);}int do_temp_log (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){	int contact_temp;	int delay = 0;#if (CONFIG_COMMANDS & CFG_CMD_DATE)	struct rtc_time tm;#endif	if (argc > 2) {		printf ("Usage:\n%s\n", cmdtp->usage);		return 1;	}	if (argc > 1) {		delay = simple_strtoul(argv[1], NULL, 10);	}	spi_init ();	while (1) {#if (CONFIG_COMMANDS & CFG_CMD_DATE)		rtc_get (&tm);		printf ("%4d-%02d-%02d %2d:%02d:%02d - ",			tm.tm_year, tm.tm_mon, tm.tm_mday,			tm.tm_hour, tm.tm_min, tm.tm_sec);#endif		contact_temp = tsc2000_contact_temp();		printf ("%d\n", contact_temp) ;		if (delay != 0)			/*			 * reset timer to avoid timestamp overflow problem			 * after about 68 minutes of udelay() time.			 */			reset_timer_masked ();			sdelay (delay);	}	return 0;}U_BOOT_CMD(	tlog,	2,	1,	do_temp_log,	"tlog    - log contact temperature [1/100 C] to console (endlessly)\n",	"delay\n"	"    - contact temperature [1/100 C] is printed endlessly to console\n"	"      <delay> specifies the seconds to wait between two measurements\n"	"      For each measurment a timestamp is printeted\n");#endif	/* CFG_CMD_BSP */

⌨️ 快捷键说明

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