Rockchip开发系列 - 3.3.GPIO扩展芯片AW95xx和PCA953X(1)

By: fulinux
E-mail: [email protected]
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

rk3568

返回总目录Rockchip开发系列 - 总目录

概述

记录RK平台上移植AW95016 GPIO扩展芯片的Linux内核驱动和Uboot驱动。期间遇到的主要问题时Uboot无法控制AW95016的GPIO引脚,和内核中的中断异常。

硬件信息

平台:RK3562
GPIO扩展板:AW95016_EVB_V1.1 demo板
Kernel: linux-5.10
U-boot: 2017.09

先介绍下这个AW95016_EVB_V1.1 demo板,他是艾为16路I/O扩展功能评估的展示板,每一路均可配置成输出或者输入,当配置成输出模式时,可以直接驱动LED,当配置成输入输入模式时,可以获取按键的输入状态。如图所示:

### PCA953X 设备探针相关的驱动程序初始化 对于PCA953X设备,其I2C子系统的驱动程序设计遵循Linux内核的标准模式。当`i2c_driver``i2c_client`成功匹配之后,驱动的probe函数将会被调用以开始初始化过程[^3]。 #### 探测与初始化流程 在探测阶段,系统会尝试识别连接至总线上的硬件是否存在以及是否可以正常通信。这通常通过向特定地址发送请求并等待响应来完成。如果一切顺利,则意味着找到了兼容的设备,并触发相应的初始化逻辑: ```c static int pca953x_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct pca953x_chip *chip; chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL); if (!chip) return -ENOMEM; /* 设置客户端数据 */ i2c_set_clientdata(client, chip); // 初始化GPIO或其他资源... } ``` 这段代码展示了如何创建一个新的芯片实例并将它关联到当前的I2C客户端上。接着可以根据具体需求进一步配置该器件的功能特性,比如设置方向寄存器、极性反转寄存器等操作。 #### 驱动注册 为了使上述功能生效,还需要确保此驱动已正确地加入到了内核中,并能够自动加载或手动插入模块时被执行。一般情况下,这是通过定义一个静态数组来实现的,其中包含了所有支持的设备ID列表: ```c static const struct i2c_device_id pca953x_id[] = { { "pca9534", 0 }, { } }; MODULE_DEVICE_TABLE(i2c, pca953x_id); static struct i2c_driver pca953x_driver = { .driver = { .name = "pca953x", .owner = THIS_MODULE, }, .probe = pca953x_probe, .remove = pca953x_remove, .id_table = pca953x_id, }; module_i2c_driver(pca953x_driver); ``` 这里声明了一个名为`pca953x_driver`的对象,指定了名称、拥有者以及其他必要的回调函数(如`.probe`)。最后一步则是利用宏`module_i2c_driver()`来进行实际的注册工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fulinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值