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");