• 第4季3:Hi3518e的sensor接口引脚复用设置


    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

    在第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)首先定义了一些变量:

    1. #!/bin/sh
    2. SNS_TYPE=ar0230 # sensor type
    3. mem_total=64; # 64M, total mem
    4. mem_start=0x80000000; # phy mem start
    5. os_mem_size=32; # 32M, os mem
    6. mmz_start=0x82000000; # mmz start addr
    7. 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 ====”也是在这函数中打印的。

    1. insert_ko()
    2. {
    3. # sys config
    4. sys_config;
    5. # driver load
    6. insmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error
    7. insmod hi_media.ko
    8. insmod hi3518e_base.ko
    9. insmod hi3518e_sys.ko vi_vpss_online=$b_arg_online sensor=$SNS_TYPE
    10. if [[ $? -ne 0 ]]; then
    11. exit;
    12. fi
    13. insmod hi3518e_tde.ko
    14. insmod hi3518e_region.ko
    15. insmod hi3518e_vgs.ko
    16. insert_isp;
    17. insmod hi3518e_viu.ko detect_err_frame=10;
    18. insmod hi3518e_vpss.ko rfr_frame_comp=1;
    19. insmod hi3518e_vou.ko
    20. #insmod hi3518e_vou.ko transparentTransmit=1 #enable transparentTransmit
    21. insmod hifb.ko video="hifb:vram0_size:1620" # default pal
    22. insmod hi3518e_rc.ko
    23. insmod hi3518e_venc.ko
    24. insmod hi3518e_chnl.ko ChnlLowPower=1
    25. insmod hi3518e_h264e.ko
    26. insmod hi3518e_jpege.ko
    27. insmod hi3518e_ive.ko save_power=0;
    28. # insmod hi3518e_ive.ko
    29. insmod extdrv/sensor_i2c.ko
    30. echo "==== Your input Sensor type is $SNS_TYPE ===="
    31. insmod extdrv/pwm.ko
    32. insmod extdrv/piris.ko
    33. #insert_sns > /dev/null
    34. #重点关注一些insert_sns这个函数
    35. insert_sns
    36. insert_audio
    37. insmod hi_mipi.ko
    38. echo "==== Your input Sensor type is $SNS_TYPE ===="
    39. }

    (4)在insert_ko函数的内容中,我们重点关注一下insert_sns这个函数,因为它涉及到本文主题即如何设置引脚复用的内容。insert_sns函数的内容如下所示。从中可知,该函数会根据sensor的不同型号来执行不同的操作,这里的操作主要是设置Hi3518e和sensor之间的引脚复用,其中用到了海思自己的设置工具himm,比如“himm 0x200f0040 0x2”表示将地址为0x200f0040的寄存器的值设置为0x2。

    1. insert_sns()
    2. {
    3. case $SNS_TYPE in
    4. ar0130|9m034)
    5. himm 0x200f0040 0x2; # I2C0_SCL
    6. himm 0x200f0044 0x2; # I2C0_SDA
    7. #cmos pinmux
    8. himm 0x200f007c 0x1; # VI_DATA13
    9. himm 0x200f0080 0x1; # VI_DATA10
    10. himm 0x200f0084 0x1; # VI_DATA12
    11. himm 0x200f0088 0x1; # VI_DATA11
    12. himm 0x200f008c 0x2; # VI_VS
    13. himm 0x200f0090 0x2; # VI_HS
    14. himm 0x200f0094 0x1; # VI_DATA9
    15. himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz
    16. ;;
    17. #省略部分代码
    18. ov9712)
    19. himm 0x200f0040 0x2; # I2C0_SCL
    20. himm 0x200f0044 0x2; # I2C0_SDA
    21. #cmos pinmux
    22. himm 0x200f007c 0x1; # VI_DATA13
    23. himm 0x200f0080 0x1; # VI_DATA10
    24. himm 0x200f0084 0x1; # VI_DATA12
    25. himm 0x200f0088 0x1; # VI_DATA11
    26. himm 0x200f008c 0x2; # VI_VS
    27. himm 0x200f0090 0x2; # VI_HS
    28. himm 0x200f0094 0x1; # VI_DATA9
    29. himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz
    30. ;;
    31. #省略部分代码
    32. }

    二、设置引脚复用的方法

    引脚资源是有限的,需要根据情况进行引脚复用,即一个引脚可能具备诸多功能,需要根据实际情况来设置这个引脚的功能。如何设置引脚复用呢?不同的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命令对相关引脚的复用功能进行了配置。

  • 相关阅读:
    新手面试官需要做好哪些工作
    一文了解Python中的while循环语句
    40个高质量SSM毕设项目分享【源码+论文】(一)
    怒刷LeetCode的第7天(Java版)
    【PAT甲级】1006 Sign In and Sign Out
    Linux学习笔记——文件的查找与检索
    ThreadGroup
    网络编程学习part1
    CEPH-2:rbd功能详解及普通用户应用ceph集群
    俄罗斯方块
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/128140904