Hi all,
I have integrated the mpl3115A2 linux driver which is present in the NXP website : https://www.nxp.com/webapp/sps/download/preDownload.jsp . The driver is successfully registered and I am able to enable and disable it. Can anyone share a sample application to read the Altitude and Pressure?
Thanks,
Chiranjeevi
Solved! Go to Solution.
Hi Chiranjeevi,
I am not a Linux expert, so I have forwarded your question to our Linux specialists, here is their response:
"We do not have a Linux application for this, but since the device use standard input device node, customer shall be able to use application tools like Evtest (google from web) to get the input data. The driver also use sysfs device attribute interface, which can be accessed with “echo” and “cat” from the device node at /sys, refer to readme file in other NXP driver package like FXAS2100x."
Anyway, I looked at the mpl3115.c file and found the following functions to put the sensor into barometric mode, activate it and read the pressure data:
static void mpl3115_device_init(struct i2c_client *client)
{
u8 val[8];
val[0] = 0x28;
mpl3115_i2c_write(client,MPL3115_CTRL_REG1,val,1);
}
static int mpl3115_start_chip(struct i2c_client *client )
{
u8 val;
int ret;
mpl3115_i2c_read(client,MPL3115_CTRL_REG1,&val,1);
val |= MPLL_ACTIVE_MASK;
ret = mpl3115_i2c_write(client,MPL3115_CTRL_REG1, &val,1);
return 0;
}
static int mpl3115_read_data(struct i2c_client *client,int *pres, short *temp)
{
u8 tmp[5];
mpl3115_i2c_read(client,MPL3115_PRESSURE_DATA,tmp,5);
*pres = (DATA_SHIFT_BIT(tmp[0],24) | DATA_SHIFT_BIT(tmp[1],16) | DATA_SHIFT_BIT(tmp[2],8) )>>12;
*temp = (DATA_SHIFT_BIT(tmp[3],8) | DATA_SHIFT_BIT(tmp[4],0))>>4;
return 0;
}
To read the altitude, I would recommend using something like this:
static void mpl3115_device_altitude_init(struct i2c_client *client)
{
u8 val[8];
val[0] = 0xA8; // Altimeter mode, OSR = 32
mpl3115_i2c_write(client,MPL3115_CTRL_REG1,val,1);
}
static int mpl3115_start_chip(struct i2c_client *client )
{
u8 val;
int ret;
mpl3115_i2c_read(client,MPL3115_CTRL_REG1,&val,1);
val |= MPLL_ACTIVE_MASK;
ret = mpl3115_i2c_write(client,MPL3115_CTRL_REG1, &val,1);
return 0;
}
static int mpl3115_read_altitude_data(struct i2c_client *client,int *altitude, short *temp)
{
u8 tmp[5];
mpl3115_i2c_read(client,MPL3115_PRESSURE_DATA,tmp,5);
*altitude = (DATA_SHIFT_BIT(tmp[0],24) | DATA_SHIFT_BIT(tmp[1],16) | DATA_SHIFT_BIT(tmp[2],8) )>>12;
*temp = (DATA_SHIFT_BIT(tmp[3],8) | DATA_SHIFT_BIT(tmp[4],0))>>4;
return 0;
}
You might find useful my simple bare-metal example code that is available here.
I hope it helps.
Regards,
Tomas
PS: If my answer helps to solve your question, please mark it as "Correct". Thank you.
Hi Chiranjeevi,
I am not a Linux expert, so I have forwarded your question to our Linux specialists, here is their response:
"We do not have a Linux application for this, but since the device use standard input device node, customer shall be able to use application tools like Evtest (google from web) to get the input data. The driver also use sysfs device attribute interface, which can be accessed with “echo” and “cat” from the device node at /sys, refer to readme file in other NXP driver package like FXAS2100x."
Anyway, I looked at the mpl3115.c file and found the following functions to put the sensor into barometric mode, activate it and read the pressure data:
static void mpl3115_device_init(struct i2c_client *client)
{
u8 val[8];
val[0] = 0x28;
mpl3115_i2c_write(client,MPL3115_CTRL_REG1,val,1);
}
static int mpl3115_start_chip(struct i2c_client *client )
{
u8 val;
int ret;
mpl3115_i2c_read(client,MPL3115_CTRL_REG1,&val,1);
val |= MPLL_ACTIVE_MASK;
ret = mpl3115_i2c_write(client,MPL3115_CTRL_REG1, &val,1);
return 0;
}
static int mpl3115_read_data(struct i2c_client *client,int *pres, short *temp)
{
u8 tmp[5];
mpl3115_i2c_read(client,MPL3115_PRESSURE_DATA,tmp,5);
*pres = (DATA_SHIFT_BIT(tmp[0],24) | DATA_SHIFT_BIT(tmp[1],16) | DATA_SHIFT_BIT(tmp[2],8) )>>12;
*temp = (DATA_SHIFT_BIT(tmp[3],8) | DATA_SHIFT_BIT(tmp[4],0))>>4;
return 0;
}
To read the altitude, I would recommend using something like this:
static void mpl3115_device_altitude_init(struct i2c_client *client)
{
u8 val[8];
val[0] = 0xA8; // Altimeter mode, OSR = 32
mpl3115_i2c_write(client,MPL3115_CTRL_REG1,val,1);
}
static int mpl3115_start_chip(struct i2c_client *client )
{
u8 val;
int ret;
mpl3115_i2c_read(client,MPL3115_CTRL_REG1,&val,1);
val |= MPLL_ACTIVE_MASK;
ret = mpl3115_i2c_write(client,MPL3115_CTRL_REG1, &val,1);
return 0;
}
static int mpl3115_read_altitude_data(struct i2c_client *client,int *altitude, short *temp)
{
u8 tmp[5];
mpl3115_i2c_read(client,MPL3115_PRESSURE_DATA,tmp,5);
*altitude = (DATA_SHIFT_BIT(tmp[0],24) | DATA_SHIFT_BIT(tmp[1],16) | DATA_SHIFT_BIT(tmp[2],8) )>>12;
*temp = (DATA_SHIFT_BIT(tmp[3],8) | DATA_SHIFT_BIT(tmp[4],0))>>4;
return 0;
}
You might find useful my simple bare-metal example code that is available here.
I hope it helps.
Regards,
Tomas
PS: If my answer helps to solve your question, please mark it as "Correct". Thank you.