devm_regmap_init_i2c
2016-08-05 14:31
1211 查看
本文有此处转载http://blog.csdn.net/luckywang1103/article/details/47091817
3.0linux内核版本中,codec driver是直接调用i2c的i2c_master_send函数与i2c_transfer函数来实现i2c的读写,
3.3版本,codec driver通过调用snd_soc_read和snd_soc_write函数来实现i2c的读写,这两个函数内部包裹了codec->read和codec->write,而codec->read和codec->write的赋值是在snd_soc_codec_set_cache_io中,最终也是调用了i2c_master_send函数与i2c_transfer函数
3.10版本开始出现了regmap的接口,这个regmap将i2c、spi、mmio、irq都抽象出统一的接口regmap_read、regmap_write、regmap_update_bits等接口
例如对于i2c接口
devm_regmap_init_i2c(i2c, ®map_i2c);或者使用
devm_regmap_init(&i2c->dev, ®map_i2c, &i2c->dev, config)
|
regmap_init(struct device *dev, struct regmap_bus *bus, void *bus_content, struct regmap_config *config);
1)注册方法regmap_bus和对象i2c:
通过把struct regmap_bus regmap_i2c和i2c->dev注册到regmap模块中去,而regmap_bus中已经实现了read和write函数(调用的就是i2c_master_send与i2c_transfer)
2)使用注册的对象和方法
当调用regmap_read或者regmap_write的时候,这两个函数会取出struct regmap中的content即i2c,并调用之前注册的regmap_bus中的read和write函数来实现读和写。
regmap_update_bit内部调用了regmap_read和regmap_write
我觉得以上的原理挺重要的,我们可以自己实现类似的接口:提供注册的机制,能够将对象以及对象的方法注册进去;当需要调用的时候,取出对应的对象和方法。
3.0linux内核版本中,codec driver是直接调用i2c的i2c_master_send函数与i2c_transfer函数来实现i2c的读写,
3.3版本,codec driver通过调用snd_soc_read和snd_soc_write函数来实现i2c的读写,这两个函数内部包裹了codec->read和codec->write,而codec->read和codec->write的赋值是在snd_soc_codec_set_cache_io中,最终也是调用了i2c_master_send函数与i2c_transfer函数
3.10版本开始出现了regmap的接口,这个regmap将i2c、spi、mmio、irq都抽象出统一的接口regmap_read、regmap_write、regmap_update_bits等接口
例如对于i2c接口
devm_regmap_init_i2c(i2c, ®map_i2c);或者使用
devm_regmap_init(&i2c->dev, ®map_i2c, &i2c->dev, config)
|
regmap_init(struct device *dev, struct regmap_bus *bus, void *bus_content, struct regmap_config *config);
1)注册方法regmap_bus和对象i2c:
通过把struct regmap_bus regmap_i2c和i2c->dev注册到regmap模块中去,而regmap_bus中已经实现了read和write函数(调用的就是i2c_master_send与i2c_transfer)
2)使用注册的对象和方法
当调用regmap_read或者regmap_write的时候,这两个函数会取出struct regmap中的content即i2c,并调用之前注册的regmap_bus中的read和write函数来实现读和写。
regmap_update_bit内部调用了regmap_read和regmap_write
我觉得以上的原理挺重要的,我们可以自己实现类似的接口:提供注册的机制,能够将对象以及对象的方法注册进去;当需要调用的时候,取出对应的对象和方法。
相关文章推荐
- devm_regmap_init_i2c【转】
- qcom 8916平台的i2c init部分
- uboot下init_sequence_f函数之init_func_i2c
- i2c子系统之i2c bus初始化——i2c_init()
- i2c子系统之platfor_device初始化——smdk2440_machine_init()
- i2c子系统之platform_driver初始化——i2c_adap_s3c_init()
- i2c子系统之 adapter driver注册——i2c_dev_init()
- 协议[I2C]_I2C子系统之I2C bus初始化——I2C_init()
- 协议[I2C]_I2C子系统之platfor_device初始化——smdk2440_machine_init()
- linux i2c子系统代码分析2 ---操作函数i2c_init介绍
- I2C子系统之I2C bus初始化——I2C_init()
- 协议[I2C]_I2C子系统之platform_driver初始化——I2C_adap_s3c_init()
- I2C子系统之 adapter driver注册——I2C_dev_init()
- 协议[I2C]_I2C子系统之 adapter driver注册——I2C_dev_init()
- linux设备驱动init中死机问题
- MTK6592 GPIO模拟I2C
- i2c 驱动编程接口 i2c_master_send 和 i2c_master_recv i2c_transfer
- I2C设备没有响应的可能的原因
- apache源码编译时报错ssl_engine_init.c:546: error: 'STACK' undeclared (first use in this function)
- 可以接上面I2C驱动