中斷返回函數(shù):讀取xyz軸數(shù)值,并上報給input子系統(tǒng)
staticirqreturn_tmpu3050_interrupt_thread(intirq,void*data)
{
structmpu3050_sensor*sensor=data;//獲取mpu3050傳感器
structaxis_dataaxis;
mpu3050_read_xyz(sensor-》client,&axis);//獲取xyz軸數(shù)值
input_report_abs(sensor-》idev,ABS_X,axis.x);//上報x軸事件
input_report_abs(sensor-》idev,ABS_Y,axis.y);//上報y軸事件
input_report_abs(sensor-》idev,ABS_Z,axis.z);//上報z軸事件
input_sync(sensor-》idev);//同步事件
returnIRQ_HANDLED;
}
獲取xyz軸數(shù)值,通過i2c命令去獲取便可
staticintmpu3050_xyz_read_reg(structi2c_client*client,u8*buffer,intlength)
{
/*
*Annoyingwecan’tmakethisconstbecausethei2clayerdoesn‘t
*declareinputbuffersconst.
*/
charcmd=MPU3050_XOUT_H;//i2c讀取0x1D~0x22寄存器值
structi2c_msgmsg[]={
{
.addr=client-》addr,
.flags=0,
.len=1,
.buf=&cmd,
},
{
.addr=client-》addr,
.flags=I2C_M_RD,
.len=length,
.buf=buffer,
},
};
returni2c_transfer(client-》adapter,msg,2);
}
應(yīng)用層在MPU3050設(shè)備節(jié)點的時候會開啟中斷,MPU3050有數(shù)據(jù)更新則會觸發(fā)中斷,接著調(diào)用中斷返回函數(shù)上報事件,應(yīng)用程序便可讀取設(shè)備節(jié)點獲取xyz軸的數(shù)據(jù)
staticintmpu3050_input_open(structinput_dev*input)
{
structmpu3050_sensor*sensor=input_get_drvdata(input);//獲取mpu3050傳感器
interror;
pm_runtime_get(sensor-》dev);
/*Enableinterrupts
使能中斷,設(shè)置0x17寄存器MPU_RDY_EN,DMP_DONE_EN,RAW_RDY_EN位*/
error=i2c_smbus_write_byte_data(sensor-》client,MPU3050_INT_CFG,
MPU3050_LATCH_INT_EN|MPU3050_RAW_RDY_EN|MPU3050_MPU_RDY_EN);
if(error《0){
pm_runtime_put(sensor-》dev);
returnerror;
}
return0;
}
電子發(fā)燒友App


















評論