예제 #1
0
static long i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
		return -EINVAL;
	}

	switch (_IOC_NR(cmd)) {
		case I2C_WRITEREG:
			/* write to an i2c slave */
			D(printk(KERN_DEBUG "i2cw %d %d %d\n",
				 I2C_ARGSLAVE(arg),
				 I2C_ARGREG(arg),
				 I2C_ARGVALUE(arg)));

			return i2c_writereg(I2C_ARGSLAVE(arg),
					    I2C_ARGREG(arg),
					    I2C_ARGVALUE(arg));
		case I2C_READREG:
		{
			unsigned char val;
			/* read from an i2c slave */
			D(printk(KERN_DEBUG "i2cr %d %d ",
				I2C_ARGSLAVE(arg),
				I2C_ARGREG(arg)));
			val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg));
			D(printk(KERN_DEBUG "= %d\n", val));
			return val;
		}
		default:
			return -EINVAL;

	}
	return 0;
}
예제 #2
0
void sixaxis_init( void)
{
// gyro soft reset
	
 i2c_writereg( 107 , 128);	
	 
 delay(40000);
	
// clear sleep bit on old type gyro (mpu-6050)
i2c_writereg( 107 , 0);
	
// gyro scale 2000 deg (FS =3)
i2c_writereg( 27 , 24);	
	
// Gyro DLPF low pass filter
i2c_writereg( 26 , GYRO_LOW_PASS_FILTER);	
	
}
예제 #3
0
void light_init(void) {
	unsigned char b;
	light_sleep();	
	
	// configure integration rate and interrupt
	b = 0b00000001; // 01 integ field, scale 0.252, time=101ms
	if ( i2c_writereg(LIGHT_ADDR, COMMAND_DEFAULT | TIMING, 1, &b) ) {
		kputs("Error configuring light sensor\n");
	}
}
예제 #4
0
static long
i2c_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	int ret;
	if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
		return -ENOTTY;
	}

	switch (_IOC_NR(cmd)) {
		case I2C_WRITEREG:
			
			D(printk("i2cw %d %d %d\n",
				 I2C_ARGSLAVE(arg),
				 I2C_ARGREG(arg),
				 I2C_ARGVALUE(arg)));

			mutex_lock(&i2c_mutex);
			ret = i2c_writereg(I2C_ARGSLAVE(arg),
					    I2C_ARGREG(arg),
					    I2C_ARGVALUE(arg));
			mutex_unlock(&i2c_mutex);
			return ret;

		case I2C_READREG:
		{
			unsigned char val;
			
			D(printk("i2cr %d %d ",
				I2C_ARGSLAVE(arg),
				I2C_ARGREG(arg)));
			mutex_lock(&i2c_mutex);
			val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg));
			mutex_unlock(&i2c_mutex);
			D(printk("= %d\n", val));
			return val;
		}
		default:
			return -EINVAL;

	}

	return 0;
}
예제 #5
0
void light_sleep() {
	unsigned char b = 0x00;
	if ( i2c_writereg(LIGHT_ADDR, COMMAND_DEFAULT | CONTROL, 1, &b) )   {
		kputs("Error turning off light sensor\n");
	}
}
예제 #6
0
파일: i2c_gvc.c 프로젝트: 7LK/McWRT
/*#---------------------------------------------------------------------------
 *#
 *# FUNCTION NAME: i2c_ioctl
 *#
 *# DESCRIPTION  : Main device API: ioctl's to write/read
 *#                to/from i2c registers
 *#
 *# PARAMETERS   : *inode: reference to inode
 *#                *filp : reference to file pointer
 *#                cmd   : command to be executed during the ioctl call
 *#                arg   : pointer to a structure with the data???
 *#
 *# RETURN       : result of the ioctl call
 *#
 *#---------------------------------------------------------------------------
 */
static int i2c_ioctl( struct inode *inode
                    , struct file *file
                    , unsigned int cmd
                    , unsigned long arg
                    )
{
    /* the acme ioctls */
    I2C_DATA i2cdata;
    int RetVal = EI2CNOERRORS;

    if ( _IOC_TYPE( cmd ) != ETRAXI2C_IOCTYPE )
    {
        return ( -EINVAL );
    }

    switch ( _IOC_NR( cmd ) )
    {
    case I2C_WRITEREG:
        /* write to an i2c slave */
        RetVal = i2c_writereg( I2C_ARGSLAVE( arg )
                             , I2C_ARGREG( arg )
                             , I2C_ARGVALUE( arg )
                             );
        break;

    case I2C_READREG:
        RetVal = i2c_readreg( I2C_ARGSLAVE( arg ), I2C_ARGREG( arg ) );
        break;

    /* New functions added by GVC */
    case I2C_READ:
        copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) );
        {
            int RetryCntr = MAXRETRIES;

            do
            {
                RetVal = i2c_command( i2cdata.slave
                                    , NULL
                                    , 0
                                    , i2cdata.rbuf
                                    , i2cdata.rlen
                                    );
             } while ( ( EI2CNOERRORS != RetVal )
                     &&( --RetryCntr )
                     );
        }
        copy_to_user( (char*)arg, (char*)&i2cdata, sizeof( I2C_DATA ) );
        break;

    case I2C_WRITE:
        copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) );
        {
            int RetryCntr = MAXRETRIES;

            do
            {
                RetVal = i2c_command( i2cdata.slave
                                    , i2cdata.wbuf
                                    , i2cdata.wlen
                                    , NULL
                                    , 0
                                    );
             } while ( ( EI2CNOERRORS != RetVal )
                     &&( --RetryCntr )
                     );
        }
        break;

    case I2C_WRITEREAD:
        copy_from_user( (char*)&i2cdata, (char*)arg, sizeof( I2C_DATA ) );
        {
            int RetryCntr = MAXRETRIES;

            do
            {
                RetVal = i2c_command( i2cdata.slave
                                    , i2cdata.wbuf
                                    , i2cdata.wlen
                                    , i2cdata.rbuf
                                    , i2cdata.rlen
                                    );
             } while ( ( EI2CNOERRORS != RetVal )
                     &&( --RetryCntr )
                     );
        }
        copy_to_user( (char*)arg, (char*)&i2cdata, sizeof( I2C_DATA ) );
        break;

    default:
        RetVal = -EINVAL;
    }

    return ( -RetVal );
}   /* i2c_ioctl */
예제 #7
0
파일: cmd_i2c.c 프로젝트: Robotips/rtprog
int cmd_i2c(int argc, char **argv)
{
    uint8_t i2c = 255;
    rt_dev_t i2c_dev;
    char c;
    uint16_t addr, regaddr, value;

#if !defined (I2C_COUNT) || I2C_COUNT==0
    puts("No i2c module");
    return 1;
#else
    // no args -> print number of i2cs buses
    if(argc == 1)
    {
        printf("count: %d\r\n", (int)I2C_COUNT);
        return 0;
    }

    // help
    if(strcmp(argv[1], "help")==0)
    {
        puts("i2c <bus-id>");
        puts("i2c <bus-id> setspeed <speed>");
        puts("i2c <bus-id> readreg <addr> <regaddr>");
        puts("i2c <bus-id> writereg <addr> <regaddr> <value>");
        return 0;
    }

    // first arg numeric : convert to i2c id
    c = argv[1][0];
    if(isdigit(c))
    {
        i2c = c - '0';
        c = argv[1][1];
        if(isdigit(c))
            i2c = i2c * 10 + (c - '0');
    }
    if (i2c >= I2C_COUNT)
    {
        printf("Invalid i2c id %d\r\n", i2c);
        return 0;
    }
    i2c_dev = MKDEV(DEV_CLASS_I2C, i2c);

    // if no more arg, print properties of i2c
    // > i2c <bus-id>
    if(argc == 2)
    {
        printf("Config: %d bits address %luHz (%luHz)\r\n",
            (int)i2c_addressWidth(i2c_dev),
            i2c_effectiveBaudSpeed(i2c_dev),
            i2c_baudSpeed(i2c_dev));

        return 0;
    }

    // parse argv 2
    // == setspeed > i2c <bus-id> setspeed <speed>
    if(strcmp(argv[2], "setspeed")==0)
    {
        if(argc < 4)
            return 1;
        uint32_t baudSpeed;
        baudSpeed = atol(argv[3]);
        i2c_setBaudSpeed(i2c_dev, baudSpeed);
        return 0;
    }

    if(argc < 5)
        return 1;
    addr = atoi(argv[3]);
    regaddr = atoi(argv[4]);
    // == readreg > i2c <bus-id> readreg <addr> <regaddr>
    if(strcmp(argv[2], "readreg")==0)
    {
        value = i2c_readreg(i2c_dev, addr, regaddr, I2C_REG8 | I2C_REGADDR8);
        printf("'%d' 0x%X\r\n", value, value);
        return 0;
    }

    if(argc < 6)
        return 1;
    value = atoi(argv[5]);
    // == writereg > i2c <bus-id> writereg <addr> <regaddr> <value>
    if(strcmp(argv[2], "writereg")==0)
    {
        i2c_writereg(i2c_dev, addr, regaddr, value, I2C_REG8 | I2C_REGADDR8);
        puts("ok");
        return 0;
    }

    return 1;
#endif
}