修改书《嵌入式Linux系统设计及应用-基于国产龙芯SOCV2.3.0》中IIC的例子,获取MPU6050的数据。
1.连线方式,MPU6050的AD0连接GND,SDA连接P00,SCL连接P01。
2.注册新设备。使用i2c_new _device方法。文件保存为mpu6050_dev.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <loongson1.h>
#include <linux/slab.h>
static struct i2c_board_info mpu6050_info = {
I2C_BOARD_INFO("mpu6050",0x68),
};static struct i2c_client *mpu6050_client;
static int mpu6050_dev_init(void)
{
struct i2c_adapter *i2c_adap;
//打开第2复用gpio00,01,必须做
__raw_writel(readl(LS1X_CBUS_SECOND0) | 1 ,LS1X_CBUS_SECOND0);
__raw_writel(readl(LS1X_CBUS_SECOND0) |( 1 << 1 ) ,LS1X_CBUS_SECOND0);
//使用i2c-0设备
i2c_adap = i2c_get_adapter(0);
mpu6050_client = i2c_new_device(i2c_adap, &mpu6050_info);
i2c_put_adapter(i2c_adap);
return 0;
}static void mpu6050_dev_exit(void)
{
i2c_unregister_device(mpu6050_client);
}
module_init(mpu6050_dev_init);
module_exit(mpu6050_dev_exit);
MODULE_LICENSE("GPL");
i2c-*设备通过iic工具查询。
3.注册新驱动。文件保存为mpu6050_drv.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
//#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
static int major;
static struct class *class;
static struct i2c_client *mpu6050_client;/* 传入: buf[0] : addr
* 输出: buf[0] : data
*/
static ssize_t mpu6050_read(struct file *