I2C结点讨论

3658阅读 0评论2012-08-31 wibnmo
分类:LINUX

问题是这样的:
sys/bus/i2c
├── devices
│   ├── 2-0056 -> ../../../devices/legacy/i2c-2/2-0056    # 2-0056父节点就是它的adapter设备名 对应 /dev/i2c-2 文件 ;


可是自己电脑上,显示i2c设备名本身就是i2c-%d,而且位置在PCI总线下面;而不是在i2c adapter下面; 对硬件不熟悉,这差别在哪里,能否解释下???
/sys/bus/i2c
├── devices
│   ├── i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0



# tree /sys/bus/i2c
/sys/bus/i2c
├── devices
│   ├── i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0
│   ├── i2c-1 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-1
│   ├── i2c-2 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DisplayPort-1/i2c-2
. . . . . .
[root@crafts y]# cat /sys/bus/i2c/devices/i2c-0/name
intel drm CRTDDC_A
[root@crafts y]# cat /sys/bus/i2c/devices/i2c-1/name
intel drm LVDSDDC_C
[root@crafts y]# cat /sys/bus/i2c/devices/i2c-3/name
SMBus I801 adapter at 1c60
[root@crafts y]# cat /sys/bus/i2c/devices/i2c-3/name

最近学I2C,以为I2C设备都挂在相应的I2C adapter下面; 而且每个I2C adapter会在/dev/下面生成一个i2c-%d的设备文件。
可是看到上面这些,,晕菜了 PCI下面也可以挂I2C设备吗???
------------------------------------------------------------------------------------------------------------------------------
这区别在拓扑结构上。说简单点,cpu直接通过local address bus相连的device在/sys下面看到的都是属于legacy bus或者platform bus。如果通过北桥pci/e相连而映射到cpu的phsyical address space的device在/sys下面看到都是属于pci0000:00 bus。
你的板子应该没用pci/e,所有device都是静态定址的,电路设计好了,所有device的地址就都固定了。你的i2c adapter同你的内存、按键、lcd地位一样。这里不要把我说的cpu理解成那颗焊在你板子上的'cpu',那其实是块soc,对于i2c adpater来说,肯定是soc片内的设备,我说的cpu就是指你soc里面的arm core,soc芯片设计好后(相当于电路设计好后),你的arm core同所有片内的外设的地址关系肯定也固定了,这点你肯定理解。我们叫这种设备挂在cpu的local总线上。
pc机是用了pci/e的,除了一些legacy设备,比如串口,仍然是直接和cpu的local地址线相连的(你看你的/sys/device/platform下面应该有个device叫serial,这些设备和你的北桥桥接芯片本身的地位一样,都是直接连在cpu的地址线上,固定定址的。)而其他绝大部分设备都是直接和pci总线相连的,是作为pci bus的一个子设备而存在。而你的i2c adapter就是这么一个属于pci的一个device(其实并不是一个单独的i2c bus 桥接器而存在,往往是属于其他设备的一部分,比如显卡)。

你的device都在/sys/bus/i2c下面,说明他们都知道自己是挂在i2c总线下面的。
sysfs输出的意思表明链接和目标指的都是同一个设备,只是大家的出发点(视图)不同而已。前者是通过总线类型来找到设备,后者是通过从cpu出发的物理连接(拓扑)来找到设备,就像windows的设备管理器的'连接'视图和'类别'视图所对应的树状结构是不一样的,但最后字节点都是指的同样的实体:
embedded box:
/sys/bus/i2c
├── devices
│   ├── 2-0056 -> ../../../devices/legacy/i2c-2/2-0056   
                                                                 |         |
                                                                 |         |
                                                              [i2c      [挂在这个i2c adapter上面的i2c设备]
                                                               adapter
                                                               fix in
                                                               arm soc]
pc:
/sys/bus/i2c
├── devices
│   ├── i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0
                                                                            |           |
                                                                            |           |
                                                                  [i2c adapter    [标记挂在这个i2c adapter上面的设备1,
                                                                    在pci总线下的  是i2c设备的抽象
                                                                    id,这是你i2c
                                                                    adapter的抽
                                                                    象]
│   ├── i2c-1 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-1
                                                                                          |
                                                                                          |
                                                                                      [标记挂在这个i2c adapter上面的设备2,
                                                                                        和i2c-0都是挂在同一个i2c adapter
                                                                                        上面]
│   ├── i2c-2 -> ../../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-DisplayPort-1/i2c-2
                                                                                          |
                                                                                          |
                                                                                    [同上,都是挂在同一个i2c adapter下
                                                                                      面的i2c device]
│   └── i2c-3 -> ../../../devices/pci0000:00/0000:00:1f.3/i2c-3
                                                                           |            |
                                                                           |            |
                                                                [这是挂在pci    [挂在这个i2c adapter上面的i2c设备]
                                                                  总线上的另一
                                                                  个i2c adapter
                                                                  的抽象]

其实挂在你的pci总线上的i2c adapter应该都不是单独的i2c总线扩展器,比如我觉得你的0000:00:02.0就是你的显卡。0000:00:1f是smbus controller。

所以,并不是i2c设备直接挂在PCI总线上的,仍然是挂在I2c总线上的,只是i2c adpater不再直接挂载cpu的local bus上了,而是挂在pci总线上。

至于‘每个I2C adapter会在/dev/下面生成一个i2c-%d的设备文件。’这个还真不一定。"这里有一个i2c设备"这件事一定需要让用户程序知道么?比如你的
"intel drm CRTDDC_A"
"intel drm LVDSDDC_C"
分别是你的电脑上连的lcd monitor向显卡报告它的一些video informantion的通道(信息通过i2c传递),这个通道细节根本没有必要让用户程序知道。显卡抽象给上层的设备就是一个字符设备/dev/drm/card。就算用户程序想知道这些video information的信息可以用ioctl通过这个字符设备来获得。所以用户根本不需要知道这么底层的i2c的detail。
在举个ide/scsi硬盘的例子,用户程序访问硬盘时,他需要知道‘这是个ide/scsi设备’么?他只需要知道,这是一个可以随机寻址读写的块设备就行了。
再说,在/dev下面创建设备节点本来就不是driver的责任。driver只需要'抽象'出一个设备,定义访问这个'设备'的抽象接口(read, write, ioctl, fcnt...)。而创建设备节点是系统集成者、udev即插即用策略甚至用户程序自个儿的事情。

分析是snail_314写的。
他的CSDN博客是 http://blog.csdn.net/redredbird
------------------------------------------------------------------------------------------------------------------------------
通过上面这位大侠的分析,我看了下手头设备的sys结点:
#cd /sys/bus/i2c/devices
#ls -l
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-4 -> ../../../devices/i2c-4
lrwxrwxrwx root     root              1980-01-07 03:33 4-0068 -> ../../../devices/i2c-4/4-0068
lrwxrwxrwx root     root              1980-01-07 03:33 4-0018 -> ../../../devices/i2c-4/4-0018
lrwxrwxrwx root     root              1980-01-07 03:33 4-000c -> ../../../devices/i2c-4/4-000c
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-6 -> ../../../devices/i2c-6
lrwxrwxrwx root     root              1980-01-07 03:33 6-0055 -> ../../../devices/i2c-6/6-0055
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-7 -> ../../../devices/i2c-7
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-8 -> ../../../devices/platform/i2c-gpio.8/i2c-8
lrwxrwxrwx root     root              1980-01-07 03:33 8-0039 -> ../../../devices/platform/i2c-gpio.8/i2c-8/8-0039
lrwxrwxrwx root     root              1980-01-07 03:33 8-0070 -> ../../../devices/platform/i2c-gpio.8/i2c-8/8-0070
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-9 -> ../../../devices/platform/i2c-gpio.9/i2c-9
lrwxrwxrwx root     root              1980-01-07 03:33 9-0036 -> ../../../devices/platform/i2c-gpio.9/i2c-9/9-0036
lrwxrwxrwx root     root              1980-01-07 03:33 9-0042 -> ../../../devices/platform/i2c-gpio.9/i2c-9/9-0042
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-0 -> ../../../devices/i2c-0
lrwxrwxrwx root     root              1980-01-07 03:33 0-0058 -> ../../../devices/i2c-0/0-0058
lrwxrwxrwx root     root              1980-01-07 03:33 0-0039 -> ../../../devices/i2c-0/0-0039
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-1 -> ../../../devices/i2c-1
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-2 -> ../../../devices/i2c-2
lrwxrwxrwx root     root              1980-01-07 03:33 2-000c -> ../../../devices/i2c-2/2-000c
lrwxrwxrwx root     root              1980-01-07 03:33 2-000d -> ../../../devices/i2c-2/2-000d
lrwxrwxrwx root     root              1980-01-07 03:33 i2c-3 -> ../../../devices/i2c-3
lrwxrwxrwx root     root              1980-01-07 03:33 8-0028 -> ../../../devices/platform/i2c-gpio.8/i2c-8/8-0028
lrwxrwxrwx root     root              1980-01-07 03:33 2-0077 -> ../../../devices/i2c-2/2-0077
lrwxrwxrwx root     root              1980-01-07 03:33 2-0066 -> ../../../devices/i2c-2/2-0066
lrwxrwxrwx root     root              1980-01-07 03:33 7-0055 -> ../../../devices/i2c-7/7-0055
lrwxrwxrwx root     root              1980-01-07 03:33 0-0038 -> ../../../devices/i2c-0/0-0038

目前的结论是:

4-0068 -> ../../../devices/i2c-4/4-0068
6-0055 -> ../../../devices/i2c-6/6-0055
2-000c -> ../../../devices/i2c-2/2-000c
等等这些i2c-x adapter都是硬件上实际存在的。"adapter fix in arm soc",也就是说嵌在片上系统里面的。

8-0028 -> ../../../devices/platform/i2c-gpio.8/i2c-8/8-0028
9-0036 -> ../../../devices/platform/i2c-gpio.9/i2c-9/9-0036
这种是gpio模拟的i2c,所以这些结点的形成就不一样。
从sys系统中我们也可以得知哪些是模拟的i2c,哪些是真实存在的i2c,以及在此i2c上挂载哪些设备。

#cd /sys/devices/i2c-4/4-000c/
#ls -l
-rw-r--r-- root     root         4096 1980-01-07 00:00 uevent
-r--r--r-- root     root         4096 1980-01-07 04:12 name
-r--r--r-- root     root         4096 1980-01-07 04:13 modalias
lrwxrwxrwx root     root              1980-01-07 04:13 subsystem -> ../../../bus/i2c
drwxr-xr-x root     root              1980-01-07 00:00 power
lrwxrwxrwx root     root              1980-01-07 04:13 driver -> ../../../bus/i2c/drivers/akm8975

从最后一行我们可以知道这个4-000c i2c设备是akm8975。

整理自CU一个关于I2C节点的讨论,时间久,忘记帖子地址了
上一篇:usb2uart 焊接方法
下一篇:Linux常用命令