Hi,
I have got a small project at home, running the inv-mpu6050 driver. To get
it to work I had to add device tree functionality to the driver and then
write a cape dtc for the beaglebone. As a result I have got the following
outputs:
cat /sys/devices/bone_capemgr.8/slots
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-BONE-MPU6050
lsmod
Module Size Used by
inv_mpu6050 7868 0
g_multi 47670 0
libcomposite 14299 1 g_multi
mt7601Usta 601404 0
ls /sys/bus/iio/devices/iio:device0/
buffer in_accel_scale in_accel_z_raw in_anglvel_y_raw
in_temp_offset name sampling_frequency_available trigger
dev in_accel_x_raw in_anglvel_scale in_anglvel_z_raw
in_temp_raw power scan_elements uevent
in_accel_matrix in_accel_y_raw in_anglvel_x_raw in_gyro_matrix
in_temp_scale sampling_frequency subsystem
cat /sys/bus/iio/devices/iio:device0/*raw
-8202
-458
11288
10
51
109
-4967
But now to the downside. It takes about100ms to read one value e.g.
/sys/bus/iio/devices/iio:device0/in_accel_x_raw ?!
I am still working on the device tree part of the driver, as the
configuration should be able to deal with negative values, but my current
dtc does not support the unary operator yet. That is fixed in a later
version. I will have a look at that when I find some time. When it is
finished I would like to give the driver back to the community.
For now my work has the current state:
-) MPU6050 cape:
/*
* Copyright (C) 2014 Thomas Graziadei
*
* Make use of the Invensens MPU6050
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BB-MPU6050";
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P9.18", /* i2c1_sda */
"P9.17", /* i2c1_scl */
/* the hardware ip uses */
"i2c1";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_i2c1_pins: pinmux_bb_i2c1_pins {
pinctrl-single,pins = <
0x158 0x72 /* spi0_d1.i2c1_sda, SLEWCTRL_SLOW |
INPUT_PULLUP | MODE2 */
0x15c 0x72 /* spi0_cs0.i2c1_scl, SLEWCTRL_SLOW |
INPUT_PULLUP | MODE2 */
>;
};
};
};
fragment@1 {
target = <&i2c1>; /* i2c1 is numbered correctly */
__overlay__ {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_i2c1_pins>;
/* this is the configuration part */
clock-frequency = <100000>;
#address-cells = <1>;
#size-cells = <0>;
/* add any i2c devices on the bus here */
mpu6050@68 {
compatible = "inv,mpu6050";
reg = <0x68>;
orientation = <1 0 0 0 1 0 0 0 1>;
};
};
};
};
-) driver patch:
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 37ca05b..d101a0c 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -648,6 +648,31 @@ static int inv_check_and_setup_chip(struct
inv_mpu6050_state *st,
return 0;
}
+static struct inv_mpu6050_platform_data*
+ mpu6050_parse_dt(struct device* dev)
+{
+ struct device_node *np = dev->of_node;
+ struct inv_mpu6050_platform_data *pdata;
+
+ if (!np) {
+ dev_err(dev, "no device tree or platform data\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return ERR_PTR(-ENOMEM);
+
+
+ if (of_property_read_u8_array(np, "orientation",
+ pdata->orientation, sizeof(pdata->orientation)) != 0) {
+ dev_err(dev, "no valid orientation property found\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ return pdata;
+}
+
/**
* inv_mpu_probe() - probe function.
* @client: i2c client.
@@ -660,6 +685,7 @@ static int inv_mpu_probe(struct i2c_client *client,
{
struct inv_mpu6050_state *st;
struct iio_dev *indio_dev;
+ struct inv_mpu6050_platform_data* pdata;
int result;
if (!i2c_check_functionality(client->adapter,
@@ -675,8 +701,21 @@ static int inv_mpu_probe(struct i2c_client *client,
}
st = iio_priv(indio_dev);
st->client = client;
- st->plat_data = *(struct inv_mpu6050_platform_data
- *)dev_get_platdata(&client->dev);
+ pdata = (struct inv_mpu6050_platform_data*)
+ dev_get_platdata(&client->dev);
+
+ if (pdata == NULL) {
+ /* check of devicetree */
+ // printk(KERN_ERR "checking device tree for parameter infos");
+ pdata = mpu6050_parse_dt(&client->dev);
+ }
+
+ if (IS_ERR(pdata)) {
+ return PTR_ERR(pdata);
+ }
+
+ st->plat_data = *pdata;
+
/* power is turned on inside check chip type*/
result = inv_check_and_setup_chip(st, id);
if (result)
@@ -777,14 +816,22 @@ static const struct i2c_device_id inv_mpu_id[] = {
MODULE_DEVICE_TABLE(i2c, inv_mpu_id);
+static struct of_device_id inv_mpu6050_i2c_of_match[] = {
+ { .compatible = "inv,mpu6050", },
+ { }
+};
+
+MODULE_DEVICE_TABLE(of, inv_mpu6050_i2c_of_match);
+
static struct i2c_driver inv_mpu_driver = {
.probe = inv_mpu_probe,
.remove = inv_mpu_remove,
.id_table = inv_mpu_id,
.driver = {
- .owner = THIS_MODULE,
- .name = "inv-mpu6050",
- .pm = INV_MPU6050_PMOPS,
+ .owner = THIS_MODULE,
+ .name = "inv-mpu6050",
+ .pm = INV_MPU6050_PMOPS,
+ .of_match_table = inv_mpu6050_i2c_of_match,
},
};
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.