linux下mpu6050驱动 i2c

10 篇文章 3 订阅
7 篇文章 0 订阅

环境介绍

  1. imx6ull
  2. mpu6050模块(i2c接口)
  3. ubuntu 18.04

大致流程

  1. 接线,对照原理图,找到i2c的资源,这里我们用的i2c2的接口
  2. 修改设备树,在对应i2c2控制器下增加节点
  3. 增加驱动文件,对读写的实现

接线

修改设备树

  • 在i2c控制器下追加节点
&i2c2 {
	clock_frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	status = "okay";
	mpu6050:mpu6050@68 {
	    compatible = "dar,mpu6050";
	    reg = <0x68>;
	    status = "okay";
	};
};

增加驱动文件

  • 使用i2c总线框架,按照标准流程

dev struct

struct mpu6050_dev {
	dev_t devid;				/* 设备号 	 */
	struct cdev cdev;			/* cdev 	*/
	struct class *class;		/* 类 		*/
	struct device *device;		/* 设备 	 */
	struct device_node	*nd; 	/* 设备节点 */
	int major;					/* 主设备号 */
	void *private_data;			/* 私有数据 		*/
	signed int gyro_x_adc;		/* 陀螺仪X轴原始值 	 */
	signed int gyro_y_adc;		/* 陀螺仪Y轴原始值		*/
	signed int gyro_z_adc;		/* 陀螺仪Z轴原始值 		*/
	signed int accel_x_adc;		/* 加速度计X轴原始值 	*/
	signed int accel_y_adc;		/* 加速度计Y轴原始值	*/
	signed int accel_z_adc;		/* 加速度计Z轴原始值 	*/
	signed int temp_adc;		/* 温度原始值 			*/
};

open

static int mpu6050_open(struct inode *inode, struct file *filp)
{
	filp->private_data = &mpu6050dev; /* 设置私有数据 */
	return 0;
}

release

static int mpu6050_release(struct inode *inode, struct file *filp)
{
	return 0;
}

read

static ssize_t mpu6050_read(struct file *filp, char __user *buf, size_t cnt, loff_t *off)
{
	signed int data[7];
	long err = 0;
	struct mpu6050_dev *dev = (struct mpu6050_dev *)filp->private_data;
	mpu6050_readdata(dev);
	data[0] = dev->gyro_x_adc;
	data[1] = dev->gyro_y_adc;
	data[2] = dev->gyro_z_adc;
	data[3] = dev->accel_x_adc;
	data[4] = dev->accel_y_adc;
	data[5] = dev->accel_z_adc;
	data[6] = dev->temp_adc;
	err = copy_to_user(buf, data, sizeof(data));
	return 0;
}

ops

static const struct file_operations mpu6050_ops = {
	.owner = THIS_MODULE,
	.open = mpu6050_open,
	.read = mpu6050_read,
	.release = mpu6050_release,
};

match

static const struct of_device_id mpu6050_of_match[] = {
	{ .compatible = "xxx,mpu6050" },
	{ /* Sentinel */ }
};

probe

static int mpu6050_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	int ret = 0;
	if (mpu6050dev.major) {
		mpu6050dev.devid = MKDEV(mpu6050dev.major, 0);
		register_chrdev_region(mpu6050dev.devid, MPU6050_CNT, MPU6050_NAME);
	} else {
		alloc_chrdev_region(&mpu6050dev.devid, 0, MPU6050_CNT, MPU6050_NAME);
		mpu6050dev.major = MAJOR(mpu6050dev.devid);
	}
	cdev_init(&mpu6050dev.cdev, &mpu6050_ops);
	cdev_add(&mpu6050dev.cdev, mpu6050dev.devid, MPU6050_CNT);
	mpu6050dev.class = class_create(THIS_MODULE, MPU6050_NAME);
	if (IS_ERR(mpu6050dev.class)) {
		return PTR_ERR(mpu6050dev.class);
	}
	mpu6050dev.device = device_create(mpu6050dev.class, NULL, mpu6050dev.devid, NULL, MPU6050_NAME);
	if (IS_ERR(mpu6050dev.device)) {
		return PTR_ERR(mpu6050dev.device);
	}
	mpu6050dev.private_data = client;
	mpu6050_reginit();		
	return 0;
}

remove

static int mpu6050_remove(struct i2c_client *client)
{
	cdev_del(&mpu6050dev.cdev);
	unregister_chrdev_region(mpu6050dev.devid, MPU6050_CNT);
	device_destroy(mpu6050dev.class, mpu6050dev.devid);
	class_destroy(mpu6050dev.class);
	return 0;
}

i2c driver

static struct i2c_driver mpu6050_driver = {
	.probe = mpu6050_probe,
	.remove = mpu6050_remove,
	.driver = {
			.owner = THIS_MODULE,
		   	.name = "mpu6050",
		   	.of_match_table = mpu6050_of_match, 
		   },
	.id_table = mpu6050_id,
};

misc

  1. init入口
  2. exit出口
  3. read具体函数
  4. name,cnt之类
  5. 以上不再赘述,比较简单

完整代码示例

仓库地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机,又称单片微控制器,并非仅完成某一逻辑功能的芯片,而是将整个计算机系统集成到一个芯片上。其相当于一个微型计算机,与标准计算机相比,单片机仅缺少I/O设备。简而言之,一块芯片即构成了一台计算机。单片机具有体积小、质量轻、价格便宜的特点,为学习、应用和开发提供了便利条件。学习使用单片机是了解计算机原理与结构的最佳选择。 单片机的使用领域十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。一旦产品用上了单片机,就能实现产品的升级换代,使产品具有更高的智能化水平,常在产品名称前冠以“智能型”形容词,如智能型洗衣机等。此外,单片机在国防、电子玩具、厨房和家居设备等领域也有广泛的应用。 单片机技术还在不断发展,其在智能家居和智能城市、物联网设备和系统、边缘计算和边缘人工智能等领域的应用日益广泛。例如,通过单片机与传感器、执行器等设备的连接,可以实现智能家居设备的远程控制、自动化调节和智能化管理;作为物联网设备的核心控制单元,单片机能够实现物联网设备之间的互联互通,为物联网系统的运行提供基础支持;在边缘计算和边缘人工智能方面,单片机可以与人工智能技术结合,实现设备端数据的实时处理和智能分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值