以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
在第2、3季的内容中,在板载系统的配置脚本即/etc/profile文件中,都有如下这句代码:
./load3518e -i -sensor ar0130 -osmem 32 -total 64
在第4季1:将AR0130摄像头更换为OV9712摄像头中提到,Hi3518E_SDK_V1.0.3.0/mpp/ko目录下的load3518e文件是一个shell脚本,主要用来设置Hi3518E的引脚中那些与sensor有关的引脚的复用。
本文将详细分析 load3518e 这个脚本文件的内容,尤其是设置引脚复用的方法。
一、分析load3518e文件
(1)首先定义了一些变量:
#!/bin/shSNS_TYPE=ar0230 # sensor type
mem_total=64; # 64M, total mem
mem_start=0x80000000; # phy mem start
os_mem_size=32; # 32M, os mem
mmz_start=0x82000000; # mmz start addr
mmz_size=32M; # 32M, mmz size
(2)然后定义了一些函数:
(3)然后通过判断一些变量的值来决定是否执行(2)中的某些函数:
重点关注一下insert_ko函数,当在板载系统的/etc/profile文件中执行load3518e脚本时,如果参数中有“ -i ”选项,则“for arg in $@”这段代码会将变量b_arg_insmod赋值为1,则会执行insert_ko函数。
我们来看一下insert_ko函数中的内容,主要完成一些驱动模块即ko文件的安装。在安装这些驱动模块的时候,会显示一些安装信息,这也就是为啥执行load3518e脚本时,SCRT上显示诸多信息的原因,“==== Your input Sensor type is ar0130 ====”也是在这函数中打印的。
insert_ko()
{# sys configsys_config;# driver loadinsmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_errorinsmod hi_media.koinsmod hi3518e_base.koinsmod hi3518e_sys.ko vi_vpss_online=$b_arg_online sensor=$SNS_TYPEif [[ $? -ne 0 ]]; then exit;fi insmod hi3518e_tde.koinsmod hi3518e_region.koinsmod hi3518e_vgs.koinsert_isp;insmod hi3518e_viu.ko detect_err_frame=10;insmod hi3518e_vpss.ko rfr_frame_comp=1;insmod hi3518e_vou.ko#insmod hi3518e_vou.ko transparentTransmit=1 #enable transparentTransmitinsmod hifb.ko video="hifb:vram0_size:1620" # default palinsmod hi3518e_rc.koinsmod hi3518e_venc.ko insmod hi3518e_chnl.ko ChnlLowPower=1insmod hi3518e_h264e.koinsmod hi3518e_jpege.koinsmod hi3518e_ive.ko save_power=0;
# insmod hi3518e_ive.ko insmod extdrv/sensor_i2c.koecho "==== Your input Sensor type is $SNS_TYPE ===="insmod extdrv/pwm.koinsmod extdrv/piris.ko#insert_sns > /dev/null
#重点关注一些insert_sns这个函数insert_snsinsert_audioinsmod hi_mipi.koecho "==== Your input Sensor type is $SNS_TYPE ===="
}
(4)在insert_ko函数的内容中,我们重点关注一下insert_sns这个函数,因为它涉及到本文主题即如何设置引脚复用的内容。insert_sns函数的内容如下所示。从中可知,该函数会根据sensor的不同型号来执行不同的操作,这里的操作主要是设置Hi3518e和sensor之间的引脚复用,其中用到了海思自己的设置工具himm,比如“himm 0x200f0040 0x2”表示将地址为0x200f0040的寄存器的值设置为0x2。
insert_sns()
{case $SNS_TYPE inar0130|9m034)himm 0x200f0040 0x2; # I2C0_SCLhimm 0x200f0044 0x2; # I2C0_SDA#cmos pinmuxhimm 0x200f007c 0x1; # VI_DATA13himm 0x200f0080 0x1; # VI_DATA10himm 0x200f0084 0x1; # VI_DATA12himm 0x200f0088 0x1; # VI_DATA11himm 0x200f008c 0x2; # VI_VShimm 0x200f0090 0x2; # VI_HShimm 0x200f0094 0x1; # VI_DATA9himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz;;#省略部分代码ov9712)himm 0x200f0040 0x2; # I2C0_SCLhimm 0x200f0044 0x2; # I2C0_SDA#cmos pinmuxhimm 0x200f007c 0x1; # VI_DATA13himm 0x200f0080 0x1; # VI_DATA10himm 0x200f0084 0x1; # VI_DATA12himm 0x200f0088 0x1; # VI_DATA11himm 0x200f008c 0x2; # VI_VShimm 0x200f0090 0x2; # VI_HShimm 0x200f0094 0x1; # VI_DATA9himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz;;#省略部分代码
}
二、设置引脚复用的方法
引脚资源是有限的,需要根据情况进行引脚复用,即一个引脚可能具备诸多功能,需要根据实际情况来设置这个引脚的功能。如何设置引脚复用呢?不同的SoC可能有不同的设置方法,比如S5PV210使用专门的控制寄存器来配置某个引脚的作用,其实Hi3518E也是如此。
一般设置引脚复用的步骤如下。
(1)查看引脚定义框图
比如在《Hi3518EV20X/Hi3516CV200经济型HD IP Camera Soc用户指南》文档中,大概第37页的地方有如下的内容。这图是这样理解的:物理引脚A1的功能(之一)是VSS;物理引脚C4的功能(之一)是JTAG_TDO……
接下来我们看一下Hi3518E的开发板原理图。比如在开发板原理图中查看引脚C4,如下所示。该引脚功能之一是JTAG_TDO,其他的功能有SPI1_SDO、I2C1_SDA、GPIO7_0。
(2)找到配置这个引脚功能的设置寄存器
比如我们想配置C4引脚的复用功能。我们在《Hi3518EV20X/Hi3516CV200经济型HD IP Camera Soc用户指南》文档中搜索“C4”或者“JTAG_TDO”,找到相关的描述如下,可以得知设置C4这个引脚复用功能的寄存器是PADCTRL_REG67 。
我们在文档中搜索“PADCTRL_REG67 ”,可以得知这个寄存器的地址(基址+偏移地址)为0x200F_090C。
我们点击该寄存器的页码,可以得知这个寄存器的bit设置含义。
(3)利用himm工具设置寄存器的值
在步骤(2)中,我们得知设置C4这个引脚复用功能的寄存器的信息,包括寄存器的名字、寄存器的地址、寄存器的bit含义。根据这些信息,我们可以利用海思提供的himm命令(这个命令已经部署在根文件系统中,直接使用即可)对寄存器进行赋值操作,进而配置这个引脚起什么作用。
比如load3518e文件中的insert_sns函数里,就利用himm命令对相关引脚的复用功能进行了配置。