社区
Linux_Kernel
帖子详情
i2c/pca9539.c文件的新模式probe疑问
ydd19881005ydd
2010-10-15 02:40:11
linux内核是2.6.28的
新模式下client从哪里来的,我在网站上看到有人说是在i2c_register_info()函数调用过程中注册的,可是我仔细看了下i2c_register_info()函数,没有涉及到client额,还有新模式下pca9539_detect()函数主要完成些什么功能呢?
望大侠们指教一二,小弟不胜感激!
...全文
311
2
打赏
收藏
i2c/pca9539.c文件的新模式probe疑问
linux内核是2.6.28的 新模式下client从哪里来的,我在网站上看到有人说是在i2c_register_info()函数调用过程中注册的,可是我仔细看了下i2c_register_info()函数,没有涉及到client额,还有新模式下pca9539_detect()函数主要完成些什么功能呢? 望大侠们指教一二,小弟不胜感激!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xxx8686
2010-11-02
打赏
举报
回复
http://www.embedu.org/Column/Column213.htm
看到现在我们应该会有这样的疑问,在Adapter模式中,i2c_client是我们自己构造出来的,而现在的i2c_client是从哪来的呢?看看下面的解释
● 注册i2c_board_info
对于Probe模式,通常在平台代码中要完成i2c_board_info的注册。方法如下:
static struct i2c_board_info __initdata test_i2c_devices[] = {
{
I2C_BOARD_INFO("pca9555", 0x27),//pca9555为芯片名称,0x27为芯片地址
.platform_data = &pca9555_data,
}, {
I2C_BOARD_INFO("mt9v022", 0x48),
.platform_data = &iclink[0], /* With extender */
}, {
I2C_BOARD_INFO("mt9m001", 0x5d),
.platform_data = &iclink[0], /* With extender */
},
};
i2c_register_board_info(0, test_i2c_devices,ARRAY_SIZE(test_i2c_devices)); //注册
i2c_client就是在注册过程中构建的。但有一点需要注意的是i2c_register_board_info并没有EXPORT_SYMBOL给模块使用。
我也在弄,还不是很清楚,这个也许对你有用。
充电宝111
2010-10-15
打赏
举报
回复
看i2c-core.c里面的内容
struct i2c_client *
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
{
struct i2c_client *client;
int status;
client = kzalloc(sizeof *client, GFP_KERNEL);
if (!client)
return NULL;
client->adapter = adap;
client->dev.platform_data = info->platform_data;
if (info->archdata)
client->dev.archdata = *info->archdata;
client->flags = info->flags;
client->addr = info->addr;
client->irq = info->irq;
strlcpy(client->name, info->type, sizeof(client->name));
/* Check for address business */
status = i2c_check_addr(adap, client->addr);
if (status)
goto out_err;
client->dev.parent = &client->adapter->dev;
client->dev.bus = &i2c_bus_type;
client->dev.type = &i2c_client_type;
dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),
client->addr);
status = device_register(&client->dev);
if (status)
goto out_err;
dev_dbg(&adap->dev, "client [%s] registered with bus id %s\n",
client->name, dev_name(&client->dev));
return client;
out_err:
dev_err(&adap->dev, "Failed to register i2c client %s at 0x%02x "
"(%d)\n", client->name, client->addr, status);
kfree(client);
return NULL;
}
上面注册到dev,这里面通过总线的probe找到自己的probe
static int i2c_device_probe(struct device *dev)
{
struct i2c_client *client = i2c_verify_client(dev);
struct i2c_driver *driver;
int status;
if (!client)
return 0;
driver = to_i2c_driver(dev->driver);
if (!driver->probe || !driver->id_table)
return -ENODEV;
client->driver = driver;
if (!device_can_wakeup(&client->dev))
device_init_wakeup(&client->dev,
client->flags & I2C_CLIENT_WAKE);
dev_dbg(dev, "probe\n");
status = driver->probe(client, i2c_match_id(driver->id_table, client));
if (status)
client->driver = NULL;
return status;
}
rtthread-IO扩展
PCA
9539
芯片
一、芯片介绍
PCA
9539
是NXP推出用于扩展芯片引脚的芯片,当主芯片控制引脚不够时,可以通过添加
PCA
9539
芯片来进行扩展,
PCA
9539
具有中断输出和复位配置的远程 16 位
I2C
和 SMBus 低功耗 I/O 扩展器 寄存器。
PCA
9539
由两个8位配置(输入或输出选择),输入端口,输出端口和极性反转(高电平有效或低电平有效操作)寄存器组成。上电时,I /O配置为输入。系统主机可以通过写入I /O配置位将I /O用作输入或输出。每个输入或输出的数据保存在相应的输入或输出寄存...
PCA
9539
R双向电平转换兼容多种逻辑
PCA
9539
R是一款支持双电源域的16位I/O扩展器,具备自动电平转换、双向通信无需方向控制、低功耗和高ESD防护等特性,适用于混合电压系统的接口设计,有效解决逻辑电平不匹配与GPIO资源不足问题。
STM32HAL库硬件IIC驱动IO扩展
PCA
9539
芯片
PCA
9539
是一款通过
I2C
接口控制的16位I/O扩展芯片,包含两个8位可配置端口。芯片地址由A0/A1引脚决定(本文设为0x74)。上电默认所有I/O为输入,可通过配置寄存器设置为输入或输出。驱动程序实现了寄存器读写、引脚方向设置、电平控制等功能,包括初始化(默认输入)、写寄存器(0x00-0x07)、读寄存器、设置引脚方向(输入/输出)、控制输出电平、读取输入电平等操作。经实测验证功能正常。
pca
9557,
i2c
转gpio,按键和三色灯
芯片平台的可用GPIO太少了,可以用
PCA
9557来增加GPIO,挂到
I2C
上,然后一下增加8个GPIO,不要太爽。接下来就要准备
PCA
9557的驱动。有三种方式,1.问原厂要驱动;2.自己写驱动;3.从linux源码里找对应驱动。个人认为消费级的嵌入式开发非常不适合自己写外设驱动,非常耗时间还容易出bug,基本功不牢的话一不小心就来个crash。如果既不能在kernel中找到对应驱动,也不能从原...
PCA
9632/
PCA
9633四通道I²C PWM LED驱动器技术解析
PWM(脉宽调制)是嵌入式系统中实现LED亮度与色彩精确控制的核心技术,其原理基于占空比调节平均输出电流,从而在恒流驱动下线性映射人眼感知亮度。高分辨率PWM(如8位256级)显著提升RGBW混色精度与渐变平滑度,支撑CIE色度空间精准定位。在IoT照明、智能面板及电池供电设备中,I²C接口的低引脚占用与多设备协同能力(如ALLCALL/SUBCALL)成为工程落地关键。本文围绕
PCA
9632/
PCA
9633芯片展开,深入解析其4通道独立PWM架构、寄存器配置逻辑、Arduino库API设计及多设备同步控制
Linux_Kernel
4,469
社区成员
17,458
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章