为什么要引脚复用
CPU的引脚数量有限,但外设所需要的引脚非常多。不管是简单的单片机还是复杂的CPU,引脚的复用都是不可避免的。
复用需要用软件去设置,让复用工作在某种特定的条件下,一般是有一些寄存器。
每个平台的复用方法不尽相同,本片分析海思平台的复用方法
但复用的思路都是一样的
- 查看引脚对应框图
- 找到相应设置的寄存器
- himm工具
如果引脚较少,四五个功能都复用在同一个引脚上,这个时候就会很麻烦。
这个时候就需要去查看引脚定义的框图,CPU的定义手册里都会给出这么一张图。这样就能知道设计的功能和物理的引脚是怎么对应的。
比如能够了解,谁和谁是兼容,谁和谁是抵触的。
看完之后,就去找控制引脚复用的寄存器,比如一些三星的板子,设计是在ctl寄存器里放几个位来进行复用;而海思有一个专门的控制复用的寄存器。各个平台有差异,需要看手册
找到对应寄存器后,需要有读写的方法去配置寄存器。如何读取寄存器,不同平台也是不一样的。有的是用C写代码,有的可能是配置脚本,海思的平台提供了一个himm的工具来进行操作。
查看引脚定义框图
有的平台会把引脚定义框图放在data sheet里边,海思放在了IP Camera Soc用户指南.pdf
当中
先查看芯片手册
比如R5是引脚的物理名称,MIPI_CKM/VI_DATA3
是会被复用的网络名称
再看复用图
C4是被用作JTAG_TDO
,当然也会有其他功能,写在了其他地方
有些其他平台的复用图写的很清晰,将一个引脚的复用写的很清晰,海思写的不是特别好
找到相应设置寄存器
海思的文档在这一方面写的不是很清晰
在上面比较难看出一个引脚一共复用了哪些功能
用寄存器控制复用功能,无非就是先找到寄存器,再找到寄存器的位定义
就以这个首地址为例,控制SENSOR_CLK
的复用
可以看到只有1位有用,其他都作为保留
说明这个引脚只有两个功能
这里可以看出海思的逻辑是先给管脚起一个名字,比如这个管脚的名字是SENSOR_CLK
然后再查看其对应寄存器,才能知道其他复用的功能
海思这样的设计是因为,海思是一个专用性非常强的平台,每个管脚怎么用都是设计好的,在设计的时候就已经决定了用什么功能。
himm
himm工具在sdk编译的时候就已经生成了,生成之后会cp到我们的根文件系统的环境中
在load3518e
中就已经调用himm做了很多事情
这个工具一看就知道很好用
第一个参数是寄存器地址,第二个参数是要写的值
在load3518e
中,比较重要的是insert_sns
函数,sns就是sensors
如上图,这些配置寄存器的操作就是对引脚的配置,#后面的注释都可以在对应sensor的原理图中找到相应的引脚,如下图
下图是hi3518E的引脚图,如果接入的sensor是MIPI接口,那么就需要把它设置为MIPI
这里就可以看出,如果使用的是一个新的sensor,那么还是有很多事情要做的。
以AR0130分析sensor引脚复用
再以这张图为例进行分析
第一个配置的寄存器基地址为0x200f0040
查看相关手册
我们将0x2写入寄存器,让其工作在I2C状态下
再来分析一组
007c
,用于配置VI_DATA13