一步一步教你构建一个MPU6050(I2C类)驱动(一)

1 i2c基本协议和时序

i2c基础的知识这里就不提了,直接从时序开始,直接来看看i2c的波形

一步一步教你构建一个MPU6050(I2C类)驱动(一)_第1张图片

一步一步教你构建一个MPU6050(I2C类)驱动(一)_第2张图片

2 i2c子系统软件框架

先来看看i2c总线的分层思想:

一步一步教你构建一个MPU6050(I2C类)驱动(一)_第3张图片

在分层图中我们可以看到,driver和device在核心层中分别成为了2条链表,核心层会按一定的规则匹配两条链表中的元素。

查看内核源码 i2c-core.c ,找到了匹配的函数如下:

static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
	struct i2c_client	*client = i2c_verify_client(dev);
	struct i2c_driver	*driver;

	if (!client)
		return 0;

	/* Attempt an OF style match */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 1;

	driver = to_i2c_driver(drv);
	/* match on an id table if there is one */
	if (driver->id_table)
		return i2c_match_id(driver->id_table, client) != NULL;

	return 0;
}

在这个函数中我们很清楚的看到I2c有三种匹配规则。第一种是按设备树匹配,第二种是按ACPT匹配,第三种则是按id_table匹配(实际上id_table匹配就是匹配dev和drv的名字)。

3  I2c子系统中涉及到的设备树文件

这次我们按设备树来匹配,首先进入内核的设备树源码,添加我们的硬件

linux@ubuntu:~/Myfile/linux-3.14-fs4412$ vi arch/arm/boot/dts/exynos4412-fs4412.dts

一步一步教你构建一个MPU6050(I2C类)驱动(一)_第4张图片

图中的i2c@138B0000部分就是我们这次要手动添加的。可以通过:/i2c来搜索别的i2c设备写在哪个位置,在它的附近添加我们的代码。图中代码在 pinctrl-0 = <&i2c5_bus>; 这句中写错了,应该是挂载在5号i2c总线上。

这次我们添加的代码如下:

i2c@138B0000{
            #address-cells = <1>;
            #size-cells = <0>;
            samsung,i2c-sda-delay = <100>;
            samsung,i2c-max-bus-freq = <20000>;
            pinctrl-0 = <&i2c5_bus>;
            pinctrl-names = "default";
            status = "okay";

            //板子电路原理图上,6050的挂载总线是低电平,因此是0x68,若是高电平就是0x69
            mpu6050@68 {
                    compatible = "InvenSense,mpu6050";
                    reg = <0x68>;
                    };
    };

添加完后输入   make dtbs   命令生成新的设备树文件,然后烧写到我们板子上。

这样,i2c类驱动的前期准备工作就做好了。

 

 

你可能感兴趣的:(嵌入式驱动开发)