社区
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()函数主要完成些什么功能呢?
望大侠们指教一二,小弟不胜感激!
...全文
301
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
芯片的功能及其在RTT实时操作系统中的驱动设计过程,包括
I2C
总线设备注册、
PCA
9539
设备初始化、读写控制操作等关键步骤。
PCA
9539
R双向电平转换兼容多种逻辑
PCA
9539
R是一款支持双电源域的16位I/O扩展器,具备自动双向电平转换功能,适用于多电压系统间的信号兼容。其无需方向控制、超低功耗及中断机制,广泛应用于工业控制、物联网和消费电子中,有效简化设计并提升系统可靠性。
STM32HAL库硬件IIC驱动IO扩展
PCA
9539
芯片
博客介绍了
PCA
9539
芯片,其由两个8位配置、输入端口、输出端口和极性反转寄存器组成,加电时I/O为输入,可配置。还提及引脚、驱动编写,根据A0和A1口电平确定地址为0x74<<1,并给出控制寄存器位与命令字节对应表,最后提供完整头
文件
和C
文件
,且经实测有效。
pca
9557,
i2c
转gpio,按键和三色灯
本文介绍如何利用
PCA
9557 芯片通过
I2C
总线扩展 GPIO 引脚,并详细讲解了 Linux 驱动的实现过程,包括驱动的加载、GPIO 初始化、按键与 LED 控制等。
PCA
9632/
PCA
9633四通道I²C PWM LED驱动器技术解析
本文深入剖析NXP
PCA
9632/
PCA
9633四通道I²C PWM LED驱动芯片的技术特性,涵盖硬件架构(4×8位PWM、开漏输出、SUBCALL/ALLCALL协同机制)、关键参数(400kHz I²C、25mA灌电流)、Arduino库API设计(单/批量通道控制、分组PWM、
模式
寄存器配置)及工程实践要点(PCB布局、I²C信号完整性、多设备同步控制)。重点突出其在RGBW LED高精度亮度与色彩调控中的嵌入式应用价值。
Linux_Kernel
4,469
社区成员
17,458
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章