4412的板子IO都是1.8v的。只有I2C6是用了电平转换到了3.3v。所以我准备使用I2C6来驱动mpu9250

menuconfig中去掉触摸的驱动

  • Device Drivers  --->
  • Input device support  --->
  • Touchscreens  --->
  • FT5X0X based touchscreens(去掉)

然后是去掉RC522的驱动(SPI占用I2C了)

  • Device Drivers  --->
  • SPI support   --->
  • < >   RC522 Module driver support(去掉)

-> Networking support (NET [=y])                                
-> CAN bus subsystem support (CAN [=y])                       
 -> CAN Device Drivers                                         
-> Platform CAN drivers with Netlink support (CAN_DEV [=y])

    < >   Microchip MCP251x SPI CAN controllers

二、在mach-itop4412.c中添加设备

static struct i2c_board_info i2c_devs6[] __initdata = {
    {
        I2C_BOARD_INFO("mpu9250", MPU9250_ADDRESS),
    },
};

这里的MPU9250_ADDRESS应该是7位的,如果写0XD0,就是MPU9250_ADDRESS>>1

然后内核编译后,烧录进开发板

cat /sys/bus/i2c/devices下就会有6-0068,这个文件了

 

写了一个空的I2C模版:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>

#include <linux/regulator/consumer.h>

#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <plat/ft5x0x_touch.h>

#define I2C6_9250_NAME "mpu9250"

#define I2C_SDA6    EXYNOS4_GPC1(3)
#define I2C_SCL6    EXYNOS4_GPC1(4)

static int i2c_mpu9250_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    printk("==%s: \n", __FUNCTION__);
    return 0;
}

static int __devexit i2c_mpu9250_remove(struct i2c_client *client)
{
    i2c_set_clientdata(client, NULL);               //设置client为NULL
    printk("==%s: \n", __FUNCTION__);
    return 0;
}

static const struct i2c_device_id i2c_mpu9250_id[] = {
    { I2C6_9250_NAME, 0 },
    { }
};

static struct i2c_driver i2c_mpu9250_driver = {
    .probe = i2c_mpu9250_probe,
    .remove = __devexit_p(i2c_mpu9250_remove),
    .id_table = i2c_mpu9250_id,
    .driver = {
        .name  = I2C6_9250_NAME,
        .owner = THIS_MODULE,
    },
};

static void i2c_io_init()
{
    int ret;
    ret = gpio_request(I2C_SCL6, "I2C_SCL6");
    if(ret) {
        printk(KERN_ERR "failed to request TP1_EN for I2C control\n");
    }

    gpio_direction_output(I2C_SCL6, 1);
    s3c_gpio_cfgpin(I2C_SCL6, S3C_GPIO_OUTPUT);
    gpio_free(I2C_SCL6);

    mdelay(5);

    ret = gpio_request(I2C_SDA6, "I2C_SDA6");
    if(ret) {
        gpio_free(I2C_SDA6);

        ret = gpio_request(I2C_SDA6, "I2C_SDA6");
        if(ret) {
            printk("i2c_io_test: Fialed to request I2C_SDA6 \n");
        }
    }
    gpio_direction_output(I2C_SDA6, 0);
    mdelay(200);

    gpio_direction_output(I2C_SDA6, 1);

    s3c_gpio_cfgpin(I2C_SDA6, S3C_GPIO_OUTPUT);
    gpio_free(I2C_SDA6);
    msleep(300);
    printk("==%s: \n", __FUNCTION__);
}

static int __init i2c_mpu9250_init(void)
{
    printk("==%s: \n", __FUNCTION__);
    i2c_io_init();
    return i2c_add_driver(&i2c_mpu9250_driver);
}

static void __exit i2c_mpu9250_exit(void)
{
    printk("==%s: \n", __FUNCTION__);
    i2c_del_driver(&i2c_mpu9250_driver);
}

late_initcall(i2c_mpu9250_init);       //延迟加载
module_exit(i2c_mpu9250_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("mpu9250");
MODULE_AUTHOR("ChenTuo");
i2c_9250.c

相关文章:

  • 2022-12-23
  • 2021-11-29
  • 2021-05-10
  • 2021-07-05
  • 2021-11-21
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-10
  • 2021-04-30
  • 2021-08-06
  • 2021-06-23
  • 2022-12-23
相关资源
相似解决方案