Hi Bruce The link https://android.googlesource.com/kernel/msm/+/android-msm-hammerhead-3.4-kk-fr2/drivers/staging/iio/imu/inv_mpu/README says that i have to build the kernel to make it work.
On Monday, September 15, 2014 5:04:19 PM UTC+5:30, [email protected] wrote: > > Hi > > Also been struggling to get Invensense driver to work....not very > impressed with Invensense to be honest. If you login to their support > forum, there is no mention of MPU9250 Linux kernel drivers.....I found the > tegra stuff, emailed Invensense and asked them where they publish their > code.....they don't. > > Rather then release a unified driver for 3.4 (i2c &spi) and 3.10+ (i2c & > spi) ....they rather efforts and struggle be duplicated by every user of > their component....this is very advanced and progressive thinking .....the > head of software development must be an absolute genius, no wonder their > products are so easy to integrate. > > Invense replied to my email with this link: > > https://android.googlesource.com/kernel/msm/+/android-msm-hammerhead-3.4-kk-fr2/drivers/staging/iio/imu/inv_mpu/README > > > *So I'm guessing with the endless array of 2012 versions.....this is what > they suggested....no idea > > > I have yet to find an working Invensense driver that natively supports > MPU9250 for the 3.10+ kernel....and absolutely nothing that supports Linux > & SPI > > Hoping bosch will come to the rescue and offer real linux support for this > little guy: > > http://www.bosch-sensortec.com/en/homepage/products_3/9_axis_sensors_5/ecompass_2/bmx055_1/bmx055 > > Invensense may have some nice components....but they're worthless without > quality drivers. > > > > > > > > > On Tuesday, 13 May 2014 22:10:59 UTC+1, [email protected] wrote: >> >> 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.
