1,318
社区成员
发帖
与我相关
我的任务
分享
#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_read_reg(struct i2c_client *client, u8 addr, u8 *pdata)
{
u8 buf1[4] = { 0 };
u8 buf2[4] = { 0 };
struct i2c_msg msgs[] = {
{
.addr = client->addr, //0x68
.flags = 0, //写
.len = 1, //要写的数据长度
.buf = buf1,
},
{
.addr = client->addr,
.flags = I2C_M_RD,
.len = 1,
.buf = buf2,
},
};
int ret;
buf1[0] = addr;
ret = i2c_transfer(client->adapter, msgs, 2);
if(ret < 0) {
pr_err("read reg (0x%02x) error, %d\n", addr, ret);
} else {
*pdata = buf2[0];
}
return ret;
}
static int i2c_mpu9250_read_hw_reg(struct i2c_client *client, unsigned char *val)
{
int ret;
*val = 0xff;
ret = i2c_mpu9250_read_reg(client, 0x75, val);
printk("mpu9250 who am i ret value is %d\n", *val);
return ret;
}
static int i2c_mpu9250_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
unsigned char val;
printk("==%s: \n", __FUNCTION__);
i2c_mpu9250_read_hw_reg(client, &val);
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);
s3c_gpio_setpull(I2C_SCL6, S3C_GPIO_PULL_NONE);
gpio_free(I2C_SCL6);
mdelay(5);
ret = gpio_request(I2C_SDA6, "I2C_SDA6");
if(ret) {
printk("i2c_io_test: Fialed to request I2C_SDA6 \n");
}
gpio_direction_output(I2C_SDA6, 1);
s3c_gpio_cfgpin(I2C_SDA6, S3C_GPIO_OUTPUT);
s3c_gpio_setpull(I2C_SDA6, S3C_GPIO_PULL_NONE);
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");