static ssize_t mma845x_register_store(struct i2c_client *client,const char *buf) { int address, value; sscanf(buf, "%x %x", &address, &value); printk("going to set val[0x%x] > reg[0x%x] \n",value, address); if (mma845x_write_reg(client, (unsigned char)address, (unsigned char *)&value) < 0){ printk("failed to set val[0x%x] > reg[0x%x] \n",value, address); return -EINVAL; } return 0; }
static int mma845x_active(struct i2c_client *client,int enable) { int tmp; int ret = 0; tmp = mma845x_read_reg(client,MMA8452_REG_CTRL_REG1); if(enable) tmp |=ACTIVE_MASK; else tmp &=~ACTIVE_MASK; mmaprintkd("mma845x_active %s (0x%x)\n",enable?"active":"standby",tmp); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG1,tmp); return ret; }
static int mma8452_start_dev(struct i2c_client *client, char rate) { int ret = 0; int tmp; struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); // mma8452_data 定义在 mma8452.h 中. mmaprintkf("-------------------------mma8452 start ------------------------\n"); /* standby */ mma845x_active(client,0); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); /* disable FIFO FMODE = 0*/ ret = mma845x_write_reg(client,MMA8452_REG_F_SETUP,0); mmaprintkd("mma8452 MMA8452_REG_F_SETUP:%x\n",mma845x_read_reg(client,MMA8452_REG_F_SETUP)); /* set full scale range to 2g */ ret = mma845x_write_reg(client,MMA8452_REG_XYZ_DATA_CFG,0); mmaprintkd("mma8452 MMA8452_REG_XYZ_DATA_CFG:%x\n",mma845x_read_reg(client,MMA8452_REG_XYZ_DATA_CFG)); /* set bus 8bit/14bit(FREAD = 1,FMODE = 0) ,data rate*/ tmp = (rate<< MMA8452_RATE_SHIFT) | FREAD_MASK; ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG1,tmp); mma8452->curr_tate = rate; mmaprintkd("mma8452 MMA8452_REG_CTRL_REG1:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG1)); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG3,5); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG3:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG3)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG4,1); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG4:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG4)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG5,1); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG5:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG5)); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); mma845x_active(client,1); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); enable_irq(client->irq); return ret; }
static int mma8452_start_test(struct i2c_client *client) { int ret = 0; int tmp; mmaprintkf("-------------------------mma8452 start test------------------------\n"); /* standby */ mma845x_active(client,0); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); /* disable FIFO FMODE = 0*/ ret = mma845x_write_reg(client,MMA8452_REG_F_SETUP,0); mmaprintkd("mma8452 MMA8452_REG_F_SETUP:%x\n",mma845x_read_reg(client,MMA8452_REG_F_SETUP)); /* set full scale range to 2g */ ret = mma845x_write_reg(client,MMA8452_REG_XYZ_DATA_CFG,0); mmaprintkd("mma8452 MMA8452_REG_XYZ_DATA_CFG:%x\n",mma845x_read_reg(client,MMA8452_REG_XYZ_DATA_CFG)); /* set bus 8bit/14bit(FREAD = 1,FMODE = 0) ,data rate*/ tmp = (MMA8452_RATE_12P5<< MMA8452_RATE_SHIFT) | FREAD_MASK; ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG1,tmp); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG1:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG1)); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG3,5); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG3:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG3)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG4,1); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG4:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG4)); ret = mma845x_write_reg(client,MMA8452_REG_CTRL_REG5,1); mmaprintkd("mma8452 MMA8452_REG_CTRL_REG5:%x\n",mma845x_read_reg(client,MMA8452_REG_CTRL_REG5)); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); mma845x_active(client,1); mmaprintkd("mma8452 MMA8452_REG_SYSMOD:%x\n",mma845x_read_reg(client,MMA8452_REG_SYSMOD)); enable_irq(client->irq); msleep(50); return ret; }