| Kernel driver inv-mpu-iio |
| Author: Invensense <http://invensense.com> |
| |
| Table of Contents: |
| ================== |
| - Description |
| - Integrating the Driver in the Linux Kernel |
| - Board and Platform Data |
| > Interrupt Pin |
| > Platform Data |
| - Board File Modifications for Secondary I2C Configuration |
| > MPU-6050 + AKM8963 on the secondary I2C interface |
| > MPU-6500 + AKM8963 on the secondary I2C interface |
| > MPU-9150 |
| > MPU-3050 + BMA250 on the secondary I2C interface |
| - Board File Modifications for Invensense Devices |
| > MPU-3050 |
| > ITG-3500 |
| > MPU-6050 |
| > MPU-6500 |
| > MPU-9150 |
| - IIO Subsystem |
| > Communicating with the Driver in Userspace |
| > ITG-3500 |
| > MPU-6050 and MPU-6500 |
| > MPU-9150 |
| > MPU-3050 + BMA250 on the secondary I2C interface |
| - Low Power Accelerometer Mode |
| - DMP Event |
| - Streaming Data to an Userspace Application |
| - Recommended Sysfs Entry Setup Sequence |
| > With DMP Firmware |
| > Without DMP Firmware |
| - Test Applications |
| > Running Test Applications with MPU-9150/MPU-6050/MPU-6500 |
| > Running Test Applications with MPU-3050/ITG-3500 |
| |
| |
| |
| Description |
| =========== |
| This document describes how to install the Invensense device driver into a |
| Linux kernel. The Invensense driver currently supports the following sensors: |
| - ITG-3500 |
| - MPU-6050 |
| - MPU-9150 |
| - MPU-6500 |
| - MPU-3050 |
| |
| The slave address of each device is either 0x68 or 0x69, depending on the AD0 |
| pin value of the device. Please refer to the appropriate product specification |
| document for further information regarding the AD0 pin. The driver supports both |
| addresses. |
| |
| The following files are included in this package: |
| - Kconfig |
| - Makefile |
| - inv_mpu_core.c |
| - inv_mpu_misc.c |
| - inv_mpu_trigger.c |
| - inv_mpu3050_iio.c |
| - inv_mpu_iio.h |
| - inv_mpu_ring.c |
| - inv_slave_bma250.c |
| - dmpDefaultMPU6050.c |
| - dmpkey.h |
| - dmpmap.h |
| - mpu.h |
| |
| |
| Integrating the Driver in the Linux Kernel |
| ========================================== |
| Please add the files as follows: |
| - Add mpu.h to "kernel/include/linux". |
| - Add all other files to drivers/staging/iio/imu/mpu |
| (another directory is acceptable, but this is the recommended destination) |
| |
| In order to see the driver in menuconfig when building the kernel, please |
| make modifications as shown below: |
| |
| modify "drivers/staging/iio/imu/Kconfig" with: |
| >> source "drivers/staging/iio/imu/mpu/Kconfig" |
| |
| modify "drivers/staging/iio/imu/Makefile" with: |
| >> obj-y += mpu/ |
| |
| |
| Board and Platform Data |
| ======================= |
| In order to recognize the Invensense device on the I2C bus, the board file must |
| be modified. |
| The i2c_board_info instance must be defined as shown below. |
| |
| Interrupt Pin |
| ------------- |
| The hardcoded value of 140 corresponds to the GPIO input pin connected to the |
| Invensense device's interrupt pin. |
| This pin will most likely be different for your platform, and the value should |
| be changed accordingly. |
| |
| Platform Data |
| ------------- |
| The platform data (orientation matrix and secondary bus configurations) must be |
| modified as show below, according to your particular platform configuration. |
| |
| Please note that the MPU-9150 it is treated as a MPU-6050 with AKM8975 on the |
| device's secondary I2C interface. Thus the secondary I2C address must be |
| provided. |
| |
| |
| Board File Modifications for Secondary I2C Configuration |
| ======================================================== |
| For the Panda Board, the board file can be found at |
| arch/arm/mach-omap2/board-omap4panda.c. |
| Please modify the pertinent baord file in your system according to the examples |
| shown below: |
| |
| MPU-6050 + AKM8963 on the secondary I2C interface |
| ------------------------------------------------- |
| static struct mpu_platform_data gyro_platform_data = { |
| .int_config = 0x10, |
| .level_shifter = 0, |
| .orientation = { -1, 0, 0, |
| 0, 1, 0, |
| 0, 0, -1 }, |
| .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, |
| .sec_slave_id = COMPASS_ID_AK8963, |
| .secondary_i2c_addr = 0x0E |
| }; |
| |
| MPU-6500 + AKM8963 on the secondary I2C interface |
| ------------------------------------------------- |
| static struct mpu_platform_data gyro_platform_data = { |
| .int_config = 0x10, |
| .level_shifter = 0, |
| .orientation = { -1, 0, 0, |
| 0, 1, 0, |
| 0, 0, -1 }, |
| .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, |
| .sec_slave_id = COMPASS_ID_AK8963, |
| .secondary_i2c_addr = 0x0E |
| }; |
| |
| MPU-9150 |
| -------- |
| For MPU-9150, please provide the following secondary I2C bus information. |
| |
| static struct mpu_platform_data gyro_platform_data = { |
| .int_config = 0x10, |
| .level_shifter = 0, |
| .orientation = { -1, 0, 0, |
| 0, 1, 0, |
| 0, 0, -1 }, |
| .sec_slave_type = SECONDARY_SLAVE_TYPE_COMPASS, |
| .sec_slave_id = COMPASS_ID_AK8975, |
| .secondary_i2c_addr = 0x0E |
| }; |
| |
| MPU-3050 + BMA250 on the secondary I2C interface |
| ------------------------------------------------ |
| For BMA250 on the secondary I2C bus, please provide the following information. |
| |
| static struct mpu_platform_data gyro_platform_data = { |
| .int_config = 0x10, |
| .level_shifter = 0, |
| .orientation = { -1, 0, 0, |
| 0, 1, 0, |
| 0, 0, -1 }, |
| .sec_slave_type = SECONDARY_SLAVE_TYPE_ACCEL, |
| .sec_slave_id = ACCEL_ID_BMA250, |
| .secondary_i2c_addr = 0x18, |
| }; |
| |
| |
| Board File Modifications for Invensense Devices |
| =============================================== |
| For Invensense devices, please provide the i2c init data as shown in the |
| examples below. |
| |
| In the _i2c_init function, the device is registered in the following manner: |
| |
| // arch/arm/mach-omap2/board-omap4panda.c |
| // in static int __init omap4_panda_i2c_init(void) |
| omap_register_i2c_bus(4, 400, |
| single_chip_board_info, |
| ARRAY_SIZE(single_chip_board_info)); |
| |
| MPU-3050 |
| -------- |
| static struct i2c_board_info __initdata single_chip_board_info[] = { |
| { |
| I2C_BOARD_INFO("mpu3050", 0x68), |
| .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), |
| .platform_data = &gyro_platform_data, |
| }, |
| }; |
| |
| ITG-3050 |
| -------- |
| static struct i2c_board_info __initdata single_chip_board_info[] = { |
| { |
| I2C_BOARD_INFO("itg3500", 0x68), |
| .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), |
| .platform_data = &gyro_platform_data, |
| }, |
| }; |
| |
| MPU6050 |
| ------- |
| static struct i2c_board_info __initdata single_chip_board_info[] = { |
| { |
| I2C_BOARD_INFO("mpu6050", 0x68), |
| .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), |
| .platform_data = &gyro_platform_data, |
| }, |
| }; |
| |
| MPU6500 |
| ------- |
| static struct i2c_board_info __initdata single_chip_board_info[] = { |
| { |
| I2C_BOARD_INFO("mpu6500", 0x68), |
| .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), |
| .platform_data = &gyro_platform_data, |
| }, |
| }; |
| |
| MPU9150 |
| ------- |
| arch/arm/mach-omap2/board-omap4panda.c |
| static struct i2c_board_info __initdata single_chip_board_info[] = { |
| { |
| I2C_BOARD_INFO("mpu9150", 0x68), |
| .irq = (IH_GPIO_BASE + MPUIRQ_GPIO), |
| .platform_data = &gyro_platform_data, |
| }, |
| }; |
| |
| |
| IIO subsystem |
| ============= |
| A successful installation will create the following two new directories under |
| /sys/bus/iio/devices: |
| - iio:device0 |
| - trigger0 |
| |
| Also, a new file, "iio:device0", will be created in the /dev/ diretory. |
| (if you have more than one IIO device, the file will be named "iio:deviceX", |
| where X is a number) |
| |
| |
| Communicating with the Driver in Userspace |
| ------------------------------------------ |
| The driver generates several files in sysfs upon installation. |
| These files are used to communicate with the driver. The files can be found |
| at /sys/bus/iio/devices/iio:device0 (or ../iio:deviceX as shown above). |
| |
| A brief description of the pertinent files for each Invensense device is shown |
| below: |
| |
| ITG-3500 |
| -------- |
| temperature (Read-only) |
| --Read temperature data directly from the temperature register. |
| |
| sampling_frequency (Read/write) |
| --Configure the ADC sampling rate and FIFO output rate. |
| |
| sampling_frequency_available(read-only) |
| --show commonly used frequency |
| |
| clock_source (Read-only) |
| --Check which clock-source is used by the chip. |
| |
| power_state (Read/write) |
| --turn on/off the power supply |
| |
| self_test (read-only) |
| --read this entry trigger self test. The return value is D. |
| D is the success/fail. |
| For different chip, the result is different for success/fail. |
| 1 means success 0 means fail. The LSB of D is for gyro; the bit |
| next to LSB of D is for accel. The bit 2 of D is for compass result. |
| |
| key (read-only) |
| --show the key value of this driver. Used by MPL. |
| |
| gyro_matrix (read-only) |
| --show the orientation matrix obtained from the board file. |
| |
| MPU-6050 and MPU-6500 |
| --------------------- |
| MPU-6050 and MPU-6500 have all sysfs files belonging to ITG-3500 (shown above). |
| In addition, it has the files below: |
| |
| gyro_enable (read/write) |
| --enable/disable gyro functionality. Affects raw_gyro. Turning this off this |
| will shut down gyro and save power. |
| |
| accl_enable (read/write) |
| --enable/disable accelerometer functionality. Affects raw_accl. |
| Turning this off this will shut down accel and save power. |
| |
| firmware_loaded (read/write) |
| --Flag indicating the whether firmware is loaded or not in the DMP engine. |
| 0 means no firmware loaded. 1 means firmware is already loaded . This |
| flag can only be written as 0. It internally updates to 1. |
| |
| dmp_on(read/write) |
| --This entry controls whether to run DMP or not. |
| Write 1 to enable DMP and write 0 to disable dmp. |
| Please note that firmware_loaded must be 1 in order to enable DMP. |
| |
| dmp_int_on(read/write) |
| --This entry controls whether dmp interrupt is on/off. |
| Please note that firmware_loaded must be 1. |
| Also, we'd like to remind you that it is sometimes advantageous to |
| turn interrupts off while the DMP is running. |
| |
| dmp_output_rate |
| --control dmp output rate when dmp is on. |
| |
| dmp_event_int_on(read/write) |
| --This entry controls whether dmp event interrupt is on/off. |
| Please note that turning this on will turn off the data interrupt. |
| Interrupts will be generated only when events occur. |
| This is useful for saving power when the system is waiting for a special event |
| to wake up. |
| |
| dmp_firmware (write only binary file) |
| --DMP firmware code is loaded into this entry. |
| If loading is successful, the firmware_loaded flag will be updated to 1. |
| In order to load new firmware, the firmware_loaded flag must be first set to 0. |
| |
| lpa_mode(read-write) |
| --Low power accelerometer mode |
| |
| lpa_freq(read-write) |
| --Low power acceleromter frequency. |
| |
| accel_matrix |
| --orientation matrix for accelerometer. |
| |
| pedometer_time |
| pedometer_steps, |
| --Pedometer related entries |
| |
| event_tap |
| event_orientation |
| event_display_orientation |
| --Event related entries. |
| Please poll these entries to read their values. Direct reads will yield |
| meaningless results. |
| Further details are provided in the DMP Events section of this README. |
| |
| tap_on |
| --Controls tap function of DMP |
| |
| tap_time |
| tap_min_count |
| tap_threshold |
| --Tap related entries. Controls various parameters of tap function. |
| |
| orientation_on |
| --Turn on/off orientation function of DMP. |
| |
| display_orientation_on |
| --Turn on/off display orientation function of DMP. |
| |
| quaternion_on |
| --Turn on/off quaterniion data output. DMP is required for this feature. |
| |
| MPU-9150 |
| -------- |
| MPU-9150 has all of MPU-6050's entries. It also has two additional entries, |
| described below. |
| |
| compass_enable (read/write) |
| --Enables compass function. |
| |
| compass_matrix (read-only) |
| --Compass orientation matrix |
| |
| MPU-3050 with BMA250 on secondary I2C interface |
| ----------------------------------------------- |
| MPU-3050 with BMA250 on the secondary I2C interface has ever ITG-3500 entry. |
| It also has two additional entries, shown below: |
| |
| accl_matrix |
| |
| accl_enable |
| |
| |
| Low Power Accelerometer Mode |
| ============================ |
| Lower power accelerometer mode is a special mode that is only available |
| in MPU-6050, MPU-6500, and MPU-9150. |
| |
| Only accelerometer is functional in this mode. |
| "gyro_enable" and "compass_enable" must be zero. "dmp_on" must be zero. |
| |
| Low power acceleromter mode has two entries: lpa_mode and lpa_freq |
| |
| To run low power accel mode, set lpa_mode to 1. |
| |
| For MPU6050/MPU9150: |
| Set lpa_freq to 0~3, which correspond to 1.25Hz, 5Hz, 20Hz, 40Hz. |
| |
| For MPU6500: |
| Set lpa_freq to 0~11, which correspond to 0.3125Hz to 640Hz. |
| |
| |
| DMP Event |
| ========= |
| A DMP Event is an event that is output by the DMP unit within the Invensense |
| device (MPU). |
| Only the MPU-6050, MPU-6500, and MPU-9150 feature the DMP. |
| |
| |
| There are four sysfs entries for DMP events: |
| |
| - event_tap |
| - event_orientation |
| - event_display_orientation |
| |
| These four events must be polled before reading. |
| |
| The proper method to poll sysfs is as follows: |
| 1. open file. |
| 2. dummy read. |
| 3. poll. |
| 4. once the poll passed, use fopen and fread to read the sysfs entry. |
| 5. interpret the data. |
| |
| |
| Streaming Data to an Userspace Application |
| ========================================== |
| When streaming data to an userspace application, we recommend that you access |
| gyro/accel/compass data via /dev/iio:device0. |
| |
| Please follow the steps below to read data at a constant rate from the driver: |
| |
| 1. Write a 1 to power_state to turn on the chip. This is the default setting |
| after installing the driver. |
| 2. Write the desired output rate to fifo_rate. |
| 3. Write 1 to enable to turn on the event. |
| 4. Read /dev/iio:device0 to get a string of gyro/accel/compass data. |
| 5. Parse this string to obtain each gyro/accel/compass element. |
| 6. If dmp firmware code is loaded, use "dmp_on" to enable/disable dmp. |
| 7. If compass is enabled, the output will contain compass data. |
| |
| |
| Recommended Sysfs Entry Setup Senquence |
| ======================================= |
| |
| Without DMP Firmware |
| -------------------- |
| 1. Set "power_state" to 1, |
| 2. Set the scale and fifo rate values according to your needs. |
| 3. Set gyro_enable, accel_enable, and compass_enable according to your needs. |
| For example: |
| - If you only want gyro data, set accel_enable to 0 (and compass_enable to |
| 0, if applicable). |
| - If you only want accel data, set gyro_enable to 0 (and compass_enable to |
| 0, if applicable). |
| - If you only want compass data, set gyro_enable to 0 and accel_enable to 0. |
| 4. Set "enable" to 1. |
| 5. You will now get the output that you want. |
| |
| With DMP Firmware |
| ----------------- |
| 1. Set "power_state" to 1. |
| 2. Write "0" to firmware_loaded if it is not zero already. |
| 3. Load firmware into "dmp_firmware" as a whole. Don't split the DMP firmware |
| image. |
| 4. Make sure firmware_loaded is 1 after loading the DMP image. |
| 5. Make appropriate configurations as shown above in the "without DMP firmware" |
| case. |
| 6. Set dmp_on to 1. |
| 7. Set "enable" to 1. |
| |
| Please note that the enable function uses the enable entry under |
| "/sys/bus/iio/devices/iio:device0/buffer" |
| |
| Test Applications |
| ================= |
| A test application is located under software/simple_apps/mpu_iio. |
| This application is stand-alone in that it cannot be run concurrently with other |
| entities trying to access the device node(s) or sysfs entries; in particular, |
| the |
| |
| Running Test Applications with MPU-9150/MPU-6050/MPU-6500 |
| --------------------------------------------------------- |
| To run test applications with MPU-9150, MPU-6050, or MPU-6500 devices, |
| please use the following commands: |
| |
| 1. For orientation/tap/display orientation events: |
| mpu_iio -c 10 -l 3 -p |
| |
| 2. For printing data normally: |
| mpu_iio -c 10 -l 3 -r |
| |
| Running Test Applications with MPU-3050/ITG-3500 |
| ------------------------------------------------ |
| To run test applications with MPU-3050 or ITG-3500 devices, |
| please use the following command: |
| |
| 1. For printing data normally: |
| mpu_iio -c 10 -l 3 -r |
| |
| Please use mpu_iio.c and iio_utils.h as example code for your development |
| purposes. |