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; }
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); }
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"); } }
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; }
void light_sleep() { unsigned char b = 0x00; if ( i2c_writereg(LIGHT_ADDR, COMMAND_DEFAULT | CONTROL, 1, &b) ) { kputs("Error turning off light sensor\n"); } }
/*#--------------------------------------------------------------------------- *# *# 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 */
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 }