@ -29,6 +29,19 @@
# include "tsc2000.h"
# include "tsc2000.h"
# include "rs485.h"
# include "rs485.h"
/*
* define , to wait for the touch to be pressed , before reading coordinates in
* command do_touch . If not defined , an error message is printed , when the
* command do_touch is invoked and the touch is not pressed within an specific
* interval .
*/
# undef CONFIG_TOUCH_WAIT_PRESSED 1
/* max time to wait for touch is pressed */
# ifndef CONFIG_TOUCH_WAIT_PRESSED
# define TOUCH_TIMEOUT 5
# endif /* !CONFIG_TOUCH_WAIT_PRESSED */
/* assignment of CPU internal ADC channels with TRAB hardware */
/* assignment of CPU internal ADC channels with TRAB hardware */
# define VCC5V 2
# define VCC5V 2
# define VCC12V 3
# define VCC12V 3
@ -51,7 +64,6 @@
# define PCLK 66000000
# define PCLK 66000000
# define BUZZER_FREQ 1000 /* frequency in Hz */
# define BUZZER_FREQ 1000 /* frequency in Hz */
# define BUZZER_TIME 1000000 /* time in us */
# define PWM_FREQ 500
# define PWM_FREQ 500
@ -62,7 +74,7 @@
# define CALIB_TL 0 /* calibration point in (T)op (L)eft corner */
# define CALIB_TL 0 /* calibration point in (T)op (L)eft corner */
# define CALIB_DR 1 /* calibration point in (D)own (R)ight corner */
# define CALIB_DR 1 /* calibration point in (D)own (R)ight corner */
/* EEPROM addresse map */
/* EEPROM address map */
# define SERIAL_NUMBER 8
# define SERIAL_NUMBER 8
# define TOUCH_X0 52
# define TOUCH_X0 52
# define TOUCH_Y0 54
# define TOUCH_Y0 54
@ -102,7 +114,7 @@ int do_rotary_switch (void);
int do_pressure ( void ) ;
int do_pressure ( void ) ;
int do_v_bat ( void ) ;
int do_v_bat ( void ) ;
int do_vfd_id ( void ) ;
int do_vfd_id ( void ) ;
int do_buzzer ( void ) ;
int do_buzzer ( char * * ) ;
int do_led ( char * * ) ;
int do_led ( char * * ) ;
int do_full_bridge ( char * * ) ;
int do_full_bridge ( char * * ) ;
int do_dac ( char * * ) ;
int do_dac ( char * * ) ;
@ -114,12 +126,21 @@ int do_touch (char **);
int do_rs485 ( char * * ) ;
int do_rs485 ( char * * ) ;
int do_serial_number ( char * * ) ;
int do_serial_number ( char * * ) ;
int do_crc16 ( void ) ;
int do_crc16 ( void ) ;
int do_power_switch ( void ) ;
int do_gain ( char * * ) ;
int do_eeprom ( char * * ) ;
/* helper functions */
/* helper functions */
static void adc_init ( void ) ;
static void adc_init ( void ) ;
static int adc_read ( unsigned int channel ) ;
static int adc_read ( unsigned int channel ) ;
static void print_identifier ( void ) ;
static void print_identifier ( void ) ;
# ifdef CONFIG_TOUCH_WAIT_PRESSED
static void touch_wait_pressed ( void ) ;
static void touch_wait_pressed ( void ) ;
# else
static int touch_check_pressed ( void ) ;
# endif /* CONFIG_TOUCH_WAIT_PRESSED */
static void touch_read_x_y ( int * x , int * y ) ;
static void touch_read_x_y ( int * x , int * y ) ;
static int touch_write_clibration_values ( int calib_point , int x , int y ) ;
static int touch_write_clibration_values ( int calib_point , int x , int y ) ;
static int rs485_send_line ( const char * data ) ;
static int rs485_send_line ( const char * data ) ;
@ -127,6 +148,14 @@ static int rs485_receive_chars (char *data, int timeout);
static unsigned short updcrc ( unsigned short icrc , unsigned char * icp ,
static unsigned short updcrc ( unsigned short icrc , unsigned char * icp ,
unsigned int icnt ) ;
unsigned int icnt ) ;
# if (CONFIG_COMMANDS & CFG_CMD_I2C)
static int trab_eeprom_read ( char * * argv ) ;
static int trab_eeprom_write ( char * * argv ) ;
int i2c_write_multiple ( uchar chip , uint addr , int alen , uchar * buffer ,
int len ) ;
int i2c_read_multiple ( uchar chip , uint addr , int alen , uchar * buffer ,
int len ) ;
# endif /* CFG_CMD_I2C */
/*
/*
* TRAB board specific commands . Especially commands for burn - in and function
* TRAB board specific commands . Especially commands for burn - in and function
@ -191,15 +220,15 @@ int trab_fkt (int argc, char *argv[])
if ( strcmp ( argv [ 1 ] , " vfd_id " ) = = 0 ) {
if ( strcmp ( argv [ 1 ] , " vfd_id " ) = = 0 ) {
return ( do_vfd_id ( ) ) ;
return ( do_vfd_id ( ) ) ;
}
}
if ( strcmp ( argv [ 1 ] , " buzzer " ) = = 0 ) {
return ( do_buzzer ( ) ) ;
}
if ( strcmp ( argv [ 1 ] , " motor_contact " ) = = 0 ) {
if ( strcmp ( argv [ 1 ] , " motor_contact " ) = = 0 ) {
return ( do_motor_contact ( ) ) ;
return ( do_motor_contact ( ) ) ;
}
}
if ( strcmp ( argv [ 1 ] , " crc16 " ) = = 0 ) {
if ( strcmp ( argv [ 1 ] , " crc16 " ) = = 0 ) {
return ( do_crc16 ( ) ) ;
return ( do_crc16 ( ) ) ;
}
}
if ( strcmp ( argv [ 1 ] , " power_switch " ) = = 0 ) {
return ( do_power_switch ( ) ) ;
}
break ;
break ;
case 3 :
case 3 :
@ -224,6 +253,12 @@ int trab_fkt (int argc, char *argv[])
if ( strcmp ( argv [ 1 ] , " serial_number " ) = = 0 ) {
if ( strcmp ( argv [ 1 ] , " serial_number " ) = = 0 ) {
return ( do_serial_number ( argv ) ) ;
return ( do_serial_number ( argv ) ) ;
}
}
if ( strcmp ( argv [ 1 ] , " buzzer " ) = = 0 ) {
return ( do_buzzer ( argv ) ) ;
}
if ( strcmp ( argv [ 1 ] , " gain " ) = = 0 ) {
return ( do_gain ( argv ) ) ;
}
break ;
break ;
case 4 :
case 4 :
@ -238,6 +273,18 @@ int trab_fkt (int argc, char *argv[])
}
}
break ;
break ;
case 5 :
if ( strcmp ( argv [ 1 ] , " eeprom " ) = = 0 ) {
return ( do_eeprom ( argv ) ) ;
}
break ;
case 6 :
if ( strcmp ( argv [ 1 ] , " eeprom " ) = = 0 ) {
return ( do_eeprom ( argv ) ) ;
}
break ;
default :
default :
break ;
break ;
}
}
@ -351,20 +398,16 @@ int do_vcc12v (void)
static int adc_read ( unsigned int channel )
static int adc_read ( unsigned int channel )
{
{
int j = 1000 ; /* timeout value for wait loop in us */
int j = 1000 ; /* timeout value for wait loop in us */
int result ;
S3C2400_ADC * padc ;
S3C2400_ADC * padc ;
padc = S3C2400_GetBase_ADC ( ) ;
padc = S3C2400_GetBase_ADC ( ) ;
channel & = 0x7 ;
channel & = 0x7 ;
debug ( " %s: adccon %#x \n " , __FUNCTION__ , padc - > ADCCON ) ;
padc - > ADCCON & = ~ ADC_STDBM ; /* select normal mode */
padc - > ADCCON & = ~ ADC_STDBM ; /* select normal mode */
padc - > ADCCON & = ~ ( 0x7 < < 3 ) ; /* clear the channel bits */
padc - > ADCCON & = ~ ( 0x7 < < 3 ) ; /* clear the channel bits */
padc - > ADCCON | = ( ( channel < < 3 ) | ADC_ENABLE_START ) ;
padc - > ADCCON | = ( ( channel < < 3 ) | ADC_ENABLE_START ) ;
debug ( " %s: reading ch %d, addcon %#x \n " , __FUNCTION__ ,
( padc - > ADCCON > > 3 ) & 0x7 , padc - > ADCCON ) ;
while ( j - - ) {
while ( j - - ) {
if ( ( padc - > ADCCON & ADC_ENABLE_START ) = = 0 )
if ( ( padc - > ADCCON & ADC_ENABLE_START ) = = 0 )
break ;
break ;
@ -377,12 +420,20 @@ static int adc_read (unsigned int channel)
return - 1 ;
return - 1 ;
}
}
result = padc - > ADCDAT & 0x3FF ;
padc - > ADCCON | = ADC_STDBM ; /* select standby mode */
padc - > ADCCON | = ADC_STDBM ; /* select standby mode */
debug ( " %s: return %#x, adccon %#x \n " , __FUNCTION__ , padc - > ADCDAT & 0x3FF ,
debug ( " %s: channel %d, result[DIGIT]=%d \n " , __FUNCTION__ ,
padc - > ADCCON ) ;
( 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 ( padc - > ADCDAT & 0x3FF ) ;
return ( result ) ;
}
}
@ -392,12 +443,17 @@ static void adc_init (void)
padc = S3C2400_GetBase_ADC ( ) ;
padc = S3C2400_GetBase_ADC ( ) ;
debug ( " %s: adccon %#x \n " , __FUNCTION__ , padc - > ADCCON ) ;
padc - > ADCCON & = ~ ( 0xff < < 6 ) ; /* clear prescaler bits */
padc - > ADCCON & = ~ ( 0xff < < 6 ) ; /* clear prescaler bits */
padc - > ADCCON | = ( ( 65 < < 6 ) | ADC_PRSCEN ) ; /* set prescaler */
padc - > ADCCON | = ( ( 65 < < 6 ) | ADC_PRSCEN ) ; /* set prescaler */
debug ( " %s: init completed: adccon %#x \n " , __FUNCTION__ , padc - > ADCCON ) ;
/*
* 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 ;
return ;
}
}
@ -423,6 +479,24 @@ int do_buttons (void)
}
}
int do_power_switch ( void )
{
int result ;
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO ( ) ;
/* configure GPE7 as input */
gpio - > PECON & = ~ ( 0x3 < < ( 2 * 7 ) ) ;
/* signal GPE7 from power switch is low active: 0=on , 1=off */
result = ( ( gpio - > PEDAT & ( 1 < < 7 ) ) = = ( 1 < < 7 ) ) ? 0 : 1 ;
print_identifier ( ) ;
printf ( " %d \n " , result ) ;
return 0 ;
}
int do_fill_level ( void )
int do_fill_level ( void )
{
{
int result ;
int result ;
@ -443,6 +517,12 @@ int do_fill_level (void)
int do_rotary_switch ( void )
int do_rotary_switch ( void )
{
{
int result ;
int result ;
/*
* Please note , that the default values of the direction bits are
* undefined after reset . So it is a good idea , to make first a dummy
* call to this function , to clear the direction bits and set so to
* proper values .
*/
result = * CPLD_ROTARY_SWITCH ; /* read CPLD */
result = * CPLD_ROTARY_SWITCH ; /* read CPLD */
debug ( " %s: cpld_inc (32 bit) %#x \n " , __FUNCTION__ , result ) ;
debug ( " %s: cpld_inc (32 bit) %#x \n " , __FUNCTION__ , result ) ;
@ -498,17 +578,13 @@ int do_vfd_id (void)
return 0 ;
return 0 ;
}
}
int do_buzzer ( void )
int do_buzzer ( char * * argv )
{
{
int counter ;
int counter ;
S3C24X0_TIMERS * const timers = S3C24X0_GetBase_TIMERS ( ) ;
S3C24X0_TIMERS * const timers = S3C24X0_GetBase_TIMERS ( ) ;
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO ( ) ;
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO ( ) ;
/* configure pin GPD7 as TOUT2 */
gpio - > PDCON & = ~ 0xC000 ;
gpio - > PDCON | = 0x8000 ;
/* set prescaler for timer 2, 3 and 4 */
/* set prescaler for timer 2, 3 and 4 */
timers - > TCFG0 & = ~ 0xFF00 ;
timers - > TCFG0 & = ~ 0xFF00 ;
timers - > TCFG0 | = 0x0F00 ;
timers - > TCFG0 | = 0x0F00 ;
@ -522,23 +598,33 @@ int do_buzzer (void)
timers - > ch [ 2 ] . TCNTB = counter ;
timers - > ch [ 2 ] . TCNTB = counter ;
timers - > ch [ 2 ] . TCMPB = counter / 2 ;
timers - > ch [ 2 ] . TCMPB = counter / 2 ;
debug ( " %s: frequency: %d, duration: %d \n " , __FUNCTION__ , BUZZER_FREQ ,
if ( strcmp ( argv [ 2 ] , " on " ) = = 0 ) {
BUZZER_TIME ) ;
debug ( " %s: frequency: %d \n " , __FUNCTION__ ,
BUZZER_FREQ ) ;
/* configure pin GPD7 as TOUT2 */
gpio - > PDCON & = ~ 0xC000 ;
gpio - > PDCON | = 0x8000 ;
/* start */
/* start */
timers - > TCON = ( timers - > TCON | UPDATE2 | RELOAD2 ) & ~ INVERT2 ;
timers - > TCON = ( timers - > TCON | UPDATE2 | RELOAD2 ) &
~ INVERT2 ;
timers - > TCON = ( timers - > TCON | START2 ) & ~ UPDATE2 ;
timers - > TCON = ( timers - > TCON | START2 ) & ~ UPDATE2 ;
return ( 0 ) ;
udelay ( BUZZER_TIME ) ;
}
else if ( strcmp ( argv [ 2 ] , " off " ) = = 0 ) {
/* stop */
/* stop */
timers - > TCON & = ~ ( START2 | RELOAD2 ) ;
timers - > TCON & = ~ ( START2 | RELOAD2 ) ;
/* port pin configuration */
/* configure GPD7 as output and set to low */
gpio - > PDCON & = ~ 0xC000 ;
gpio - > PDCON & = ~ 0xC000 ;
gpio - > PDCON | = 0x4000 ;
gpio - > PDCON | = 0x4000 ;
gpio - > PDDAT & = ~ 0x80 ;
gpio - > PDDAT & = ~ 0x80 ;
return 0 ;
return ( 0 ) ;
}
printf ( " %s: invalid parameter %s \n " , __FUNCTION__ , argv [ 2 ] ) ;
return 1 ;
}
}
@ -781,7 +867,6 @@ int do_thermo (char **argv)
int channel , res ;
int channel , res ;
tsc2000_reg_init ( ) ;
tsc2000_reg_init ( ) ;
tsc2000_set_range ( 3 ) ;
if ( strcmp ( argv [ 2 ] , " all " ) = = 0 ) {
if ( strcmp ( argv [ 2 ] , " all " ) = = 0 ) {
int i ;
int i ;
@ -806,7 +891,24 @@ int do_touch (char **argv)
int x , y ;
int x , y ;
if ( strcmp ( argv [ 2 ] , " tl " ) = = 0 ) {
if ( strcmp ( argv [ 2 ] , " tl " ) = = 0 ) {
# if CONFIG_TOUCH_WAIT_PRESSED
touch_wait_pressed ( ) ;
touch_wait_pressed ( ) ;
# else
{
int i ;
for ( i = 0 ; i < ( TOUCH_TIMEOUT * 1000 ) ; i + + ) {
if ( touch_check_pressed ( ) ) {
break ;
}
udelay ( 1000 ) ; /* pause 1 ms */
}
}
if ( ! touch_check_pressed ( ) ) {
print_identifier ( ) ;
printf ( " error: touch not pressed \n " ) ;
return 1 ;
}
# endif /* CONFIG_TOUCH_WAIT_PRESSED */
touch_read_x_y ( & x , & y ) ;
touch_read_x_y ( & x , & y ) ;
print_identifier ( ) ;
print_identifier ( ) ;
@ -814,7 +916,24 @@ int do_touch (char **argv)
return touch_write_clibration_values ( CALIB_TL , x , y ) ;
return touch_write_clibration_values ( CALIB_TL , x , y ) ;
}
}
else if ( strcmp ( argv [ 2 ] , " dr " ) = = 0 ) {
else if ( strcmp ( argv [ 2 ] , " dr " ) = = 0 ) {
# if CONFIG_TOUCH_WAIT_PRESSED
touch_wait_pressed ( ) ;
touch_wait_pressed ( ) ;
# else
{
int i ;
for ( i = 0 ; i < ( TOUCH_TIMEOUT * 1000 ) ; i + + ) {
if ( touch_check_pressed ( ) ) {
break ;
}
udelay ( 1000 ) ; /* pause 1 ms */
}
}
if ( ! touch_check_pressed ( ) ) {
print_identifier ( ) ;
printf ( " error: touch not pressed \n " ) ;
return 1 ;
}
# endif /* CONFIG_TOUCH_WAIT_PRESSED */
touch_read_x_y ( & x , & y ) ;
touch_read_x_y ( & x , & y ) ;
print_identifier ( ) ;
print_identifier ( ) ;
@ -822,49 +941,81 @@ int do_touch (char **argv)
return touch_write_clibration_values ( CALIB_DR , x , y ) ;
return touch_write_clibration_values ( CALIB_DR , x , y ) ;
}
}
return 1 ; /* return error */
return 1 ; /* not "tl", nor "dr", so return error */
}
}
# ifdef CONFIG_TOUCH_WAIT_PRESSED
static void touch_wait_pressed ( void )
static void touch_wait_pressed ( void )
{
{
while ( ! ( tsc2000_read ( TSC2000_REG_ADC ) & TC_PSM ) ) ;
while ( ! ( tsc2000_read ( TSC2000_REG_ADC ) & TC_PSM ) ) ;
}
}
# else
static int touch_check_pressed ( void )
{
return ( tsc2000_read ( TSC2000_REG_ADC ) & TC_PSM ) ;
}
# endif /* CONFIG_TOUCH_WAIT_PRESSED */
static int touch_write_clibration_values ( int calib_point , int x , int y )
static int touch_write_clibration_values ( int calib_point , int x , int y )
{
{
# if (CONFIG_COMMANDS & CFG_CMD_I2C)
# if (CONFIG_COMMANDS & CFG_CMD_I2C)
int x_verify = 0 ;
int y_verify = 0 ;
tsc2000_reg_init ( ) ;
tsc2000_reg_init ( ) ;
if ( calib_point = = CALIB_TL ) {
if ( calib_point = = CALIB_TL ) {
if ( i2c_write ( I2C_EEPROM_DEV_ADDR , TOUCH_X0 , 1 ,
if ( i2c_write_multipl e ( I2C_EEPROM_DEV_ADDR , TOUCH_X0 , 1 ,
( char * ) & x , 2 ) ) {
( char * ) & x , 2 ) ) {
printf ( " could not write to eeprom \n " ) ;
return 1 ;
return 1 ;
}
}
udelay ( 11000 ) ;
if ( i2c_write_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_Y0 , 1 ,
if ( i2c_write ( I2C_EEPROM_DEV_ADDR , TOUCH_Y0 , 1 ,
( char * ) & y , 2 ) ) {
( char * ) & y , 2 ) ) {
printf ( " could not write to eeprom \n " ) ;
return 1 ;
return 1 ;
}
}
udelay ( 11000 ) ;
return 0 ;
/* verify written values */
if ( i2c_read_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_X0 , 1 ,
( char * ) & x_verify , 2 ) ) {
return 1 ;
}
if ( i2c_read_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_Y0 , 1 ,
( char * ) & y_verify , 2 ) ) {
return 1 ;
}
if ( ( y ! = y_verify ) | | ( x ! = x_verify ) ) {
print_identifier ( ) ;
printf ( " error: verify error \n " ) ;
return 1 ;
}
return 0 ; /* no error */
}
}
else if ( calib_point = = CALIB_DR ) {
else if ( calib_point = = CALIB_DR ) {
if ( i2c_write ( I2C_EEPROM_DEV_ADDR , TOUCH_X1 , 1 ,
if ( i2c_write_multipl e ( I2C_EEPROM_DEV_ADDR , TOUCH_X1 , 1 ,
( char * ) & x , 2 ) ) {
( char * ) & x , 2 ) ) {
printf ( " could not write to eeprom \n " ) ;
return 1 ;
return 1 ;
}
}
udelay ( 11000 ) ;
if ( i2c_write_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_Y1 , 1 ,
if ( i2c_write ( I2C_EEPROM_DEV_ADDR , TOUCH_Y1 , 1 ,
( char * ) & y , 2 ) ) {
( char * ) & y , 2 ) ) {
printf ( " could not write to eeprom \n " ) ;
return 1 ;
return 1 ;
}
}
udelay ( 11000 ) ;
/* verify written values */
if ( i2c_read_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_X1 , 1 ,
( char * ) & x_verify , 2 ) ) {
return 1 ;
}
if ( i2c_read_multiple ( I2C_EEPROM_DEV_ADDR , TOUCH_Y1 , 1 ,
( char * ) & y_verify , 2 ) ) {
return 1 ;
}
if ( ( y ! = y_verify ) | | ( x ! = x_verify ) ) {
print_identifier ( ) ;
printf ( " error: verify error \n " ) ;
return 1 ;
}
return 0 ;
return 0 ;
}
}
return 1 ;
return 1 ;
@ -1091,3 +1242,172 @@ static unsigned short updcrc(unsigned short icrc, unsigned char *icp,
return ( crc ) ;
return ( crc ) ;
}
}
int do_gain ( char * * argv )
{
int range ;
range = simple_strtoul ( argv [ 2 ] , NULL , 10 ) ;
if ( ( range < 1 ) | | ( range > 3 ) )
{
printf ( " %s: invalid parameter %s \n " , __FUNCTION__ , argv [ 2 ] ) ;
return 1 ;
}
tsc2000_set_range ( range ) ;
return ( 0 ) ;
}
int do_eeprom ( char * * argv )
{
# if (CONFIG_COMMANDS & CFG_CMD_I2C)
if ( strcmp ( argv [ 2 ] , " read " ) = = 0 ) {
return ( trab_eeprom_read ( argv ) ) ;
}
else if ( strcmp ( argv [ 2 ] , " write " ) = = 0 ) {
return ( trab_eeprom_write ( argv ) ) ;
}
printf ( " %s: invalid parameter %s \n " , __FUNCTION__ , argv [ 2 ] ) ;
return ( 1 ) ;
# else
printf ( " No I2C support enabled (CFG_CMD_I2C), could not write "
" to EEPROM \n " ) ;
return ( 1 ) ;
# endif /* CFG_CMD_I2C */
}
# if (CONFIG_COMMANDS & CFG_CMD_I2C)
static int trab_eeprom_read ( char * * argv )
{
int i ;
int len ;
unsigned int addr ;
long int value = 0 ;
uchar * buffer ;
buffer = ( uchar * ) & value ;
addr = simple_strtoul ( argv [ 3 ] , NULL , 10 ) ;
addr & = 0xfff ;
len = simple_strtoul ( argv [ 4 ] , NULL , 10 ) ;
if ( ( len < 1 ) | | ( len > 4 ) ) {
printf ( " %s: invalid parameter %s \n " , __FUNCTION__ ,
argv [ 4 ] ) ;
return ( 1 ) ;
}
for ( i = 0 ; i < len ; i + + ) {
if ( i2c_read ( I2C_EEPROM_DEV_ADDR , addr + i , 1 , buffer + i , 1 ) ) {
printf ( " %s: could not read from i2c device %#x "
" , addr %d \n " , __FUNCTION__ ,
I2C_EEPROM_DEV_ADDR , addr ) ;
return ( 1 ) ;
}
}
print_identifier ( ) ;
if ( strcmp ( argv [ 5 ] , " - " ) = = 0 ) {
if ( len = = 1 )
printf ( " %d \n " , ( signed char ) value ) ;
else if ( len = = 2 )
printf ( " %d \n " , ( signed short int ) value ) ;
else
printf ( " %ld \n " , value ) ;
}
else {
if ( len = = 1 )
printf ( " %d \n " , ( unsigned char ) value ) ;
else if ( len = = 2 )
printf ( " %d \n " , ( unsigned short int ) value ) ;
else
printf ( " %ld \n " , ( unsigned long int ) value ) ;
}
return ( 0 ) ;
}
static int trab_eeprom_write ( char * * argv )
{
int i ;
int len ;
unsigned int addr ;
long int value = 0 ;
uchar * buffer ;
buffer = ( uchar * ) & value ;
addr = simple_strtoul ( argv [ 3 ] , NULL , 10 ) ;
addr & = 0xfff ;
len = simple_strtoul ( argv [ 4 ] , NULL , 10 ) ;
if ( ( len < 1 ) | | ( len > 4 ) ) {
printf ( " %s: invalid parameter %s \n " , __FUNCTION__ ,
argv [ 4 ] ) ;
return ( 1 ) ;
}
value = simple_strtol ( argv [ 5 ] , NULL , 10 ) ;
debug ( " value=%ld \n " , value ) ;
for ( i = 0 ; i < len ; i + + ) {
if ( i2c_write ( I2C_EEPROM_DEV_ADDR , addr + i , 1 , buffer + i , 1 ) ) {
printf ( " %s: could not write to i2c device %d "
" , addr %d \n " , __FUNCTION__ ,
I2C_EEPROM_DEV_ADDR , addr ) ;
return ( 1 ) ;
}
#if 0
printf ( " chip=%#x, addr+i=%#x+%d=%p, alen=%d, *buffer+i= "
" %#x+%d=%p=%#x \n " , I2C_EEPROM_DEV_ADDR_DEV_ADDR , addr ,
i , addr + i , 1 , buffer , i , buffer + i , * ( buffer + i ) ) ;
# endif
udelay ( 30000 ) ; /* wait for EEPROM ready */
}
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 ) ;
}
# endif /* CFG_CMD_I2C */