📄 cmd_trab.c
字号:
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 + -