Exemplo n.º 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;
}
Exemplo n.º 2
0
light_reading_t light_read() {
	light_reading_t retval;
	unsigned char buf[4];
	if ( i2c_readreg(LIGHT_ADDR, COMMAND_BLOCK | D0L, 4, buf ) ) {
		kputs("Error reading from light sensor\n");
	}
	retval.ch0 = buf[0] | ((uint16_t)buf[1] << 8);
	retval.ch1 = buf[2] | ((uint16_t)buf[3] << 8);
	return retval;
}
Exemplo n.º 3
0
int sixaxis_check( void)
{
	// read "who am I" register
	int id = i2c_readreg( 117 );
	// new board returns 78h (unknown gyro maybe mpu-6500 compatible) marked m681
	// old board returns 68h (mpu - 6050)
	// a new (rare) gyro marked m540 returns 7Dh
	#ifdef DEBUG
	gyroid = id;
	#endif
	#ifdef DISABLE_GYRO_CHECK
	return 1;
	#endif
	return (0x78==id||0x68==id||0x7d==id );
}
Exemplo 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;
}
Exemplo n.º 5
0
unsigned char
pcf8563_readreg(int reg) 
{
	unsigned char res = i2c_readreg(RTC_I2C_READ, reg);

	/* The PCF8563 does not return 0 for unimplemented bits */
	switch(reg)
	{
		case RTC_SECONDS:
		case RTC_MINUTES:
		     res &= 0x7f;
		     break;
		case RTC_HOURS:
		case RTC_DAY_OF_MONTH:
		     res &= 0x3f;
		     break;
		case RTC_MONTH:
		     res = (res & 0x1f) - 1;  /* PCF8563 returns month in range 1-12 */
		     break;
	}
	return res;
}
Exemplo n.º 6
0
Arquivo: i2c_gvc.c Projeto: 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 */
Exemplo n.º 7
0
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
}