当前位置:网站首页>内核判断i2c地址上是否挂载外设
内核判断i2c地址上是否挂载外设
2022-07-06 04:38:00 【永不秃头的程序员】
记录一个方法去判断i2c地址上是否挂载外设。
使用场景,两个驱动使用同一个复位脚和中断脚,使用同一个外设接口,不允许同时使用,只是挂载的i2c地址不一样,思路为注册驱动的时候去读取这个寄存器的值,通过返回值去判断是存在对因的外设。
一、代码修改
dits配置
i2c4{
[email protected]2a {
reg = <0x2a>;
compatible = "eeti,egalax_i2c";
interrupt-parent = <&gpio4>;
interrupts = <13 2>;
int-gpios = <&gpio4 13 0>;
reset-gpios = <&gpio4 12 0>;
};
[email protected]5d {
compatible = "goodix,gt928_ts";
reg = <0x5d>;
irq-gpios = <&gpio4 13 0>;
reset-gpios = <&gpio4 12 0>;
};
};
再对应的peobe函数里添加如下判断:
使用函数为i2c_smbus的读取接口:
/*相关函数再 kernel的 inlcude/linux/i2c.h中 *s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command); *const struct i2c_client *client 是你外设指定的i2c总线 *u8 command 8位地址 */
/*vol是返回值,如果不存在那么就返回一个负数*/
/*使用这个函数之前需要将client的值先赋予这样才能通过I2C接口函数去读取*/
vol = i2c_smbus_read_byte_data(p_egalax_i2c_dev->client, p_egalax_i2c_dev->client->addr);
if (vol < 0) {
printk("cluo---> vol 0x%x = %d", client->addr, vol);
return -ENODEV;
}
通过插入不同的外设,可以看到不同的打印信息。
[ 3.430773] cluo---> vol 0x2a = -6
[ 3.434279] cluo---> eglax_tp probe error
[ 4.542063] cluo---> vol 0x5d = 0
[ 4.596902] cluo---> goodix probe success
[ 3.448004] cluo---> nret 0x2a = -6
[ 3.451509] cluo---> eglax_tp probe error
[ 4.571818] cluo---> vol 0x5d = -6
[ 4.575928] cluo---> goodix probe error
[ 3.455065] cluo---> nret 0x2a = 2
[ 3.466904] cluo---> egalax probe success
[ 4.592851] cluo---> vol 0x5d = -6
[ 4.596902] cluo---> goodix probe error
二、实现原理
因为驱动都能单独加载成功,目的是避免驱动去对gpio进行操作,因为他们使用的都是同一个gpio,所以不能让他们再驱动中对gpio进行申请,因为一旦申请后就会导致宁外一个gpio不能对该gpio进行操作。所以需要将这个判断函数添加再gpio申请之前。
边栏推荐
- Redis - redis in action - redis actual combat - actual combat Chapter 1 - SMS login function based on redis - redis + token shared session application - with code
- [detailed steps of FreeRTOS shift value for the first time]
- Yyds dry goods inventory OSI & tcp/ip
- CADD course learning (7) -- Simulation of target and small molecule interaction (flexible docking autodock)
- 团队协作出了问题,项目经理怎么办?
- 2328. 网格图中递增路径的数目(记忆化搜索)
- Selection of slow motion function
- Database - MySQL storage engine (deadlock)
- 捷码赋能案例:专业培训、技术支撑,多措并举推动毕业生搭建智慧校园毕设系统
- How to realize automatic playback of H5 video
猜你喜欢
Recommendation system (IX) PNN model (product based neural networks)
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
Database - MySQL storage engine (deadlock)
Unity screen coordinates ugui coordinates world coordinates conversion between three coordinate systems
During pycharm debugging, the view is read only and pause the process to use the command line appear on the console input
[Zhao Yuqiang] deploy kubernetes cluster with binary package
[detailed steps of FreeRTOS shift value for the first time]
几种RS485隔离通讯的方案介绍
Delete subsequence < daily question >
1291_ Add timestamp function in xshell log
随机推荐
Dry goods collection | Vulkan game engine video tutorial
1008 circular right shift of array elements (20 points)
Redis - redis in action - redis actual combat - actual combat Chapter 1 - SMS login function based on redis - redis + token shared session application - with code
Sorting out the latest Android interview points in 2022 to help you easily win the offer - attached is the summary of Android intermediate and advanced interview questions in 2022
我想问一下 按照现在mysql-cdc的设计,全量阶段,如果某一个chunk的binlog回填阶段,
2327. Number of people who know secrets (recursive)
Lombok原理和同时使⽤@Data和@Builder 的坑
Etcd database source code analysis -- etcdserver bootstrap initialization storage
npm命令--安装依赖包--用法/详解
canal同步mysql数据变化到kafka(centos部署)
ue5 小知识点 开启lumen的设置
Redis 排查大 key 的4种方法,优化必备
Luogu deep foundation part 1 Introduction to language Chapter 2 sequential structure programming
Crawler notes: improve data collection efficiency! Use of proxy pool and thread pool
P3500 [poi2010]tes intelligence test (two points & offline)
几种RS485隔离通讯的方案介绍
解决“C2001:常量中有换行符“编译问题
Can CDC pull the Oracle table in full
捷码赋能案例:专业培训、技术支撑,多措并举推动毕业生搭建智慧校园毕设系统
Figure application details