提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、修改设备树
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");