I2C 设备驱动编写流程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、修改设备树

AP3216C 是连接到 I2C1 上的,因此需要在 i2c1 节点下添加 ap3216c 的设备子节点,
在这里插入图片描述

1、 IO 修改或添加

首先肯定是要修改 IO, AP3216C 用到了 I2C1 接口,在core电路图中,I.MX6U-ALPHA 开发板上的 I2C1 接口使用到了 UART4_TXD 和 UART4_RXD,因此肯定要在设备树里面设置这两个 IO。
在这里插入图片描述

2、在 i2c1 节点追加 ap3216c 子节点

如果内核中没有&I2C1,自己添加一个节点就行,如:&GPIO等,然后再补充子节点信息。之前学习历程都是在spi4里添加的节点,如:led、beep、key等等
在这里插入图片描述

&i2c1 {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c1>;
	status = "okay";
};

clock-frequency 属性为 I2C 频率,这里设置为 100KHz。
pinctrl-0 属性指定 I2C 所使用的 IO 为 pinctrl_i2c1 子节点

查看pinctrl_i2c1 子节点,查看将 UART4_TXD 和 UART4_RXD 这两个 IO 分别复用为 I2C1_SCL 和 I2C1_SDA,电气属性设置为0x4001b8b0
pinctrl_i2c1 就是 I2C1 的 IO 节点,这里将 UART4_TXD 和 UART4_RXD 这两个 IO 分别复用为 I2C1_SCL 和 I2C1_SDA,电气属性都设置为 0x4001b8b0。
在这里插入图片描述

在这里插入图片描述
如果新添加的设备不是将 UART4_TXD 和 UART4_RXD 这两个 IO 分别复用为 I2C1_SCL 和 I2C1_SDA,需要自己重新设置PAD复用值和电气属性

在imx6ul-pinfun.c 查找将接口复用为什么 , 比如将GPIO复用为I2C1

在这里插入图片描述
设置新的复用功能和电气属性,如下:

		pinctrl_i2c1: i2c1grp {
			fsl,pins = <
				MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
				MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
				/* 将I2C1复用为GPIO
				MX6UL_PAD_GPIO1_IO02__I2C1_SCL 0x4001b8b0
				MX6UL_PAD_GPIO1_IO03__I2C1_SDA 0x4001b8b0
				*/
			>;
		};

将 i2c1 节点里面原有的 mag3110 和 fxls8471 这两个 I2C 子节点删除,然后添加 ap3216c子节点信息,完成以后的 i2c1 节点内容如下所示:

&i2c1 {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c1>;
	status = "okay";
	// 2024/5/11 
	ap3216c@1e {
		compatible = "alientek,ap3216c";
		reg = <0x1e>;
	};
	}

ap3216c 子节点, @后面的“1e”是 ap3216c 的器件地址。
设置 compatible 值为“alientek,ap3216c”。
reg 属性也是设置 ap3216c 器件地址的,因此 reg 设置为 0x1e。

注释:器件地址也就是i2c的从机地址,在ap3216c芯片数据手册中查找,有的芯片会直接给出地址,有的需要计算从机地址(8位地址中的前7位,第8位1表读、0表写)
在这里插入图片描述

3、查看设备树节点创建是否成功

设备树修改完成以后使用“make dtbs”重新编译一下,然后使用新的设备树启动 Linux 内核。 /sys/bus/i2c/devices 目录下存放着所有 I2C 设备,如果设备树修改正确的话,会在/sys/bus/i2c/devices 目录下看到一个名为“0-001e”的子目录,如图所示中的“0-001e”就是 ap3216c 的设备目录,“1e”就是 ap3216c 器件地址。进入0-001e 目录,可以看到“name”文件, name 问价就保存着此设备名字,在这里就是“ap3216c”,

make
sudo cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb /home/zero/linux/tftpboot/ -f

二、AP3216C 驱动编写

驱动框架 , i2c_driver 的注册


static int ap3216c_probe (struct i2c_client  *client,const struct i2c_device_id *id)
{

    return 0 ;
}

static int ap3216c_remove (struct i2c_client *client)
{

    return 0 ;
}
/* 传统匹配方式 ID 列表 */
static struct i2c_device_id ap3216c_id[] = {
    {"alientek,ap3216c",0},
    { }
};
/* 设备树匹配列表 */
static struct of_device_id ap3216c_of_match[] = {
    {.compatible = "alientek,ap3216c"},
    {}
};
/* i2c_driver */
static struct i2c_driver ap3216c_driver = {
    .probe = ap3216c_probe,
    .remove = ap3216c_remove,
    .driver = {
        .name = "ap3216c",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(ap3216c_of_match),
    },
    .id_table = ap3216c_id,
};


static int __init ap3216c_init(void)
{
    int ret = 0;

    ret = i2c_add_driver(&ap3216c_driver); // 注册i2c
    return ret;
}

static void __exit ap3216_exit(void)
{
	i2c_del_driver(&ap3216c_driver); // 卸载I2C
}
module_init(ap3216c_init);
module_exit(ap3216_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ZERO");

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值