规范解读

看完了代码才发现有这个规范文档arrow-up-right。不过也好,正好印证一下我对代码的理解。

按照我的理解,讲清楚两个东西就可以理解这个规范:

  • 接口

  • 数据结构

接口

在文档的开头就描述了两个东西:

  • Selector (Control) Register

  • Data Register

说白了就是有两个寄存器/通道,分别对应了控制面和数据面。

扯多了,直白的解释就是:

用户使用时,先通过Selector Register选定需要访问的单元,再通过Data Register来获取实际的数据。

好了,接口这部分其实就这么些,没多大花头。

在规范中还定义了这两个接口的地址。

  === x86, x86_64 Register Locations ===

  Selector Register IOport: 0x510
  Data Register IOport:     0x511
  DMA Address IOport:       0x514

  === ARM Register Locations ===

  Selector Register address: Base + 8 (2 bytes)
  Data Register address:     Base + 0 (8 bytes)
  DMA Address address:       Base + 16 (8 bytes)

我猜大家到这里一定感觉啥都不知道,不着急,等看到数据结构就清楚了。

数据结构

好了,这里要上一个巨大的数据结构了。嗯,其实呢和某些结构相比也不算大,主要是这里面有数组,所以显得大了。

让偶来稍做解释,估计你可以看懂一些:

  • comb_iomem: 这个就是规范中定义的接口。看这个地址FW_CFG_IO_BASE就是0x510

  • entries: 这是整个数据的核心。fw_cfg用编号(key)作为关键字访问各种配置。而每个配置都有一个FWCfgEntry数据结构表示,并保存在entries数组上。

  • files: fw_cfg的配置可以是简单的数据类型,如int, double。也可以是一个文件。所以在entries上可以看到分成了两端。从FW_CFG_FILE_FIRST开始保存的是文件信息。而且都有一个对应的FWCfgFile记录文件信息,并保存在files数组上。

  • cur_entry/offset: 因为接口简单,在每次访问配置之前先要指定访问的是哪个entry,且每次读写的位移取决于上一次的操作。所以这两个分别保存了当前的entry和偏移。

好了,其实展开就这么点内容了。除了长得丑,别的也没啥了。

相关代码

大的概念讲完了,还是要落到实际代码。

先看看这个高级货在哪里创建的。

创建完了之后,分别有两大类添加配置的方式:

  • fw_cfg_add_bytes()

  • fw_cfg_add_file_callback()

前者就是添加普通配置的,而后者就是添加带有文件的配置的。

Last updated

Was this helpful?