I2C驱动框架(五)
参考:I2C子系统之 adapter driver注册——I2C_dev_init()
i2c的操作在内核中是当做字符设备来操作的,相关初始化在由i2c_dev_init函数来初始化。
static int __init i2c_dev_init(void)
{
int res;
printk(KERN_INFO "i2c /dev entries driver\n");
register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);//注册字符设备 主设备号89
i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
/* Keep track of adapters which will be added or removed later */
res = bus_register_notifier(&i2c_bus_type, &i2cdev_notifier);
/* Bind to already existing adapters right away */
i2c_for_each_dev(NULL, i2cdev_attach_adapter);
return ;
}
i2c_for_each_dev(NULL, i2cdev_attach_adapter)遍历i2c_bus_type总线上的设备,对找到的设备执行i2cdev_attach_adapter()函数绑定adapter并在/dev/目录下创建设备节点。
i2c_for_each_dev(NULL, i2cdev_attach_adapter);
-->i2cdev_attach_adapter(struct device *dev, void *dummy)
-->if (dev->type != &i2c_adapter_type) return ; //只操作i2c_adapter_type类型的设备
-->struct i2c_adapter *adap = to_i2c_adapter(dev); //找到对应的i2c_adapter结构体
-->struct i2c_dev *i2c_dev = get_free_i2c_dev(adap);
-->struct i2c_dev *i2c_dev->adap = adap;
-->list_add_tail(&i2c_dev->list, &i2c_dev_list);
-->i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, MKDEV(I2C_MAJOR, adap->nr), NULL,"i2c-%d", adap->nr);
因为分析的代码中只注册了一个i2c_adapter设备,所以只生成一个设备节点/dev/i2c-0
读设备的流程,最终调用的是i2c_adapter结构体中的成员函数master_xfer。
static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,loff_t *offset)
-->ret = i2c_master_recv(client, tmp, count);
-->i2c_transfer(adap, &msg, );
-->adap->algo->master_xfer(adap, msgs, num);
-->s3c24xx_i2c_xfer
--> copy_to_user(buf, tmp, count)
I2C驱动框架(五)的更多相关文章
- I2C驱动框架 (kernel-3.4.2)
先用韦老师的图: 注: 新版本内核的i2c驱动框架采用了 i2c_client -------> i2c_bus_type <-------- i2c_driver 框架 如 ...
- I2C驱动框架(四)
参考:I2C子系统之platform_driver初始化——I2C_adap_s3c_init() 在完成platform_device的添加之后,i2c子系统将进行platform_driver的注 ...
- I2C驱动框架(三)
参考:I2C子系统之platform_device初始化——smdk2440_machine_init() I2C驱动框架还应用了另一种总线-设备-驱动模型,平台设备总线platform_bus_ty ...
- I2C驱动框架(kernel-2.6.22.6)
以用i2c通信的实时时钟为例 框架入口源文件:i2c_m41t11.c (可根据入口源文件,再按着框架到内核走一遍) 内核版本:linux_2.6.22.6 硬件平台:JZ2440 以下是驱动框架 ...
- Linux 驱动框架---i2c驱动框架
i2c驱动在Linux通过一个周的学习后发现i2c总线的驱动框架还是和Linux整体的驱动框架是相同的,思想并不特殊比较复杂的内容如i2c核心的内容都是内核驱动框架实现完成的,今天我们暂时只分析驱动开 ...
- 【Linux高级驱动】I2C驱动框架分析
1.i2c-dev.c(i2c设备驱动组件层) 功能:1)给用户提供接口 i2c_dev_init //入口函数 /*申请主设备号*/ register_chrdev(I2C_MAJOR(), &q ...
- I2C驱动框架(二)
参考:I2C子系统之I2C bus初始化——I2C_init() 在linux内核启动的时候最先执行的和I2C子系统相关的函数应该是driver/i2c/i2c-core.c文件中的i2c_init( ...
- Linux I2C驱动框架
Linux的I2C体系结构分为3个组成部分: I2C核心( i2c-core.c ): I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法.I2C通信方法("algorithm&qu ...
- I2C驱动框架(一)
参考:I2C子系统之内核中I2C子系统的结构 结合vmlinux.lds和Makefile可确定i2c初始化函数的执行顺序如下: 1./dricer/i2c/i2c-core.c中的函数:i2c_in ...
随机推荐
- __enter__,__exit__上下文管理协议
上下文管理协议__enter__,__exit__ 用途或者说好处: 1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预 2.在需要管理一些资源比 ...
- 2017浙江工业大学-校赛决赛 小M和天平
Description 小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,石子可以放左边也可以放右边.他现在知道每个石子的重量.问能不能根据上述条件,能不能测出所问的重量. ...
- ruby字符串处理
1. str="abc123"puts str[0].chr => a puts str[0] =>a的ascii码 2.中文字符串的正则 ...
- kafka java api消费者
import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Properties; imp ...
- window.close() 关闭当前浏览器页
function eseFun() { var browserName = navigator.appName; //获取浏览器名称 if(browserName == "Netscape& ...
- [Ubuntu]“ubuntu.sh: 113: ubuntu.sh:Syntax error: "(" unexpected ”报错解决方法
原因:有可能是兼容性问题 解决方法: 1.sudo dpkg-reconfigure dash 2.在弹出的窗口选择no
- IOS生成UUID
/** * 生成GUID */ + (NSString *)generateUuidString{ // create a new UUID which you own CFUUIDRef uuid ...
- java httpclient 跳过证书验证
import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.Unknow ...
- C++和ASM文件的互相调用
1. C++调用ASM中的函数,需要在ASM源文件中指定.model flat, c 就是指定以C的形式编译,然后在头文件中用EXTERN_C声明这个头文件就可以了 2. ASM中调用C++函数,需要 ...
- C++遍历文件及文件夹代码
可以遍历目录包含的文件及文件夹 #include <string> #include <vector> #include <io.h> using std::vec ...