• mstar 平台I2C 配置


    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换。

    最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置;
    // 如LED,屏的电源,背光的开关,功放的静音等等。 除了控制设置之外,还需要和外部设置传输数据。
    pin 作为GPIO 设置为IN时,是获取外设的高低来判断外设的状态,最常用的一些source 通道的detect,及一些wakeup 功能。
    pin 作为SAR 口,获取ADC值; // 如按键板,参照“mstar平台SAR口使用”
    pin 作为UART / SPI /SD 口;
    pin 作为I2C 口;
    一般来说,大部分有特殊功能的Pin脚其实都可以作为GPIO使用,但是当我们将其配置成特殊功能后,就不能同时配为GPIO。
    所以当我们发现某个Pin脚我们想将其配成GPIO后,却没办法改变它的高低状态时,就要留意一下该Pin脚是否已经被误配为特殊功能了,这时就需要我们先DISABLE 掉这个特殊功能之后,才能设置成GPIO及其状态设定。每个chip有对应一个init GPIO配置,BD_MST{$Board}.h, drvpadconf.c.

    标准GPIO口配置
    总共时钟状态

    #define GPIO_NONE 0 // Not GPIO pin (default)
    #define GPIO_IN 1 // GPI
    #define GPIO_OUT_LOW 2 // GPO output low
    #define GPIO_OUT_HIGH 3 // GPO output high

    特殊口配置
    uart 口配置
    特殊功能的pin 需要在BD_MST{$Board}.h 中配置。

    #define DISABLE 0
    #define ENABLE 1

    #define CONFIG_PADMUX_MODE0 0x00
    #define CONFIG_PADMUX_MODE1 0x01
    #define CONFIG_PADMUX_MODE2 0x02
    #define CONFIG_PADMUX_MODE3 0x03
    #define CONFIG_PADMUX_MODE4 0x04
    #define CONFIG_PADMUX_MODE5 0x05
    #define CONFIG_PADMUX_MODE6 0x06
    #define CONFIG_PADMUX_MODE7 0x07
    #define CONFIG_PADMUX_MODE8 0x08
    #define CONFIG_PADMUX_MODE9 0x09
    #define CONFIG_PADMUX_UNKNOWN 0xFF

    例如UART3,UART4 配置成了CONFIG_PADMUX_MODE1,其实也是ENABLE。接着在drvPadConf.c 文件中设置寄存器值。

    针对UART3,UART4 设置了寄存器0x1e05 的bit2,0x1e04的bit6 。这样就配置完成了。

    I2C 总线功能配置
    下面我们以I2C2 为例

    I2C 的clk,data 脚分别连接在AD16,AC16 两个pin 上面。比较特殊的是这两个pin 都是有复用功能的。所以我们需要disable掉其特殊功能LED/tcon。在BD_MST160D_AH_M7221.h中我们可以关闭LED功能

    #define PADS_LED_MODE DISABLE
    Tcon[11],Tcon[12], 未找到,属于备用的暂不处理

    寄存器设置

    #ifdef PADS_LED_MODE
    #if (PADS_LED_MODE != CONFIG_PADMUX_UNKNOWN)
    #define _CONFIG_LED_MODE ((PADS_LED_MODE == ENABLE) ? BIT4 : 0)
    _RVM1(0x1eb4, _CONFIG_LED_MODE, BIT4),

    #if (PADS_LED_MODE == DISABLE)
    _MEMMAP_PM_,
    //reg_seperate_wol_led_is_gpio
    _RVM1(0x0e39, BIT7, BIT7),
    //reg_led_is_gpio
    _RVM1(0x0e39, 0, BIT0),
    _MEMMAP_nonPM_,
    #endif
    #endif
    #endif
    disable 掉特殊功能之后,开始配置I2C 功能

    //SWI2C
    #define PAD_DDCR_CK_IS_GPIO GPIO_IN //I2C-SCL (EEPROM)
    #define PAD_DDCR_DA_IS_GPIO GPIO_IN //I2CM-SDA (EEPROM)

    #define PAD_TGPIO0_IS_GPIO GPIO_IN //TUNER_SCL
    #define PAD_TGPIO1_IS_GPIO GPIO_IN //TUNER_SDA

    *#define PAD_GPIO19_IS_GPIO GPIO_IN //I2C2-SCL
    #define PAD_GPIO20_IS_GPIO GPIO_IN //I2C2-SDA*

    将GPIO19,GPIO20 配置成了GPIO_IN,接着进行寄存器配置。如下:

    #if(PAD_GPIO19_IS_GPIO != GPIO_NONE)
    #define PAD_GPIO19_OEN (PAD_GPIO19_IS_GPIO == GPIO_IN ? BIT1: 0)
    #define PAD_GPIO19_OUT (PAD_GPIO19_IS_GPIO == GPIO_OUT_HIGH ? BIT0: 0)
    _RVM1(0x2b08, PAD_GPIO19_OUT, BIT0),
    _RVM1(0x2b08, PAD_GPIO19_OEN, BIT1),
    //reg_tconconfig11
    _RVM1(0x1ea1, 0, BIT3), //reg[101ea1]#3 = 0b
    //reg_agc_dbg
    _RVM1(0x1e9e, 0, BIT7), //reg[101e9e]#7 = 0b
    //reg_led_mode
    _RVM1(0x1eb4, 0, BIT4), //reg[101eb4]#4 = 0b
    //reg_seconduartmode
    _RVM1(0x1e05, 0, BIT1 | BIT0), //reg[101e05]#1 ~ #0 = 00b
    //reg_od2nduart
    _RVM1(0x1ea9, 0, BIT1 | BIT0), //reg[101ea9]#1 ~ #0 = 00b
    //reg_miic_mode0
    _RVM1(0x1edc, 0, BIT0), //reg[101edc]#0 = 0b
    #endif

    #if(PAD_GPIO20_IS_GPIO != GPIO_NONE)
    #define PAD_GPIO20_OEN (PAD_GPIO20_IS_GPIO == GPIO_IN ? BIT1: 0)
    #define PAD_GPIO20_OUT (PAD_GPIO20_IS_GPIO == GPIO_OUT_HIGH ? BIT0: 0)
    _RVM1(0x2b09, PAD_GPIO20_OUT, BIT0),
    _RVM1(0x2b09, PAD_GPIO20_OEN, BIT1),
    //reg_tconconfig12
    _RVM1(0x1ea1, 0, BIT4), //reg[101ea1]#4 = 0b
    //reg_agc_dbg
    _RVM1(0x1e9e, 0, BIT7), //reg[101e9e]#7 = 0b
    //reg_led_mode
    _RVM1(0x1eb4, 0, BIT4), //reg[101eb4]#4 = 0b
    //reg_seconduartmode
    _RVM1(0x1e05, 0, BIT1 | BIT0), //reg[101e05]#1 ~ #0 = 00b
    //reg_od2nduart
    _RVM1(0x1ea9, 0, BIT1 | BIT0), //reg[101ea9]#1 ~ #0 = 00b
    //reg_vx1gpi_mode
    _RVM1(0x1e4a, 0, BIT1 | BIT0), //reg[101e4a]#1 ~ #0 = 00b
    //reg_miic_mode0
    _RVM1(0x1edc, 0, BIT0), //reg[101edc]#0 = 0b
    //reg_extint5
    _RVM1(0x1ea5, 0, BIT5), //reg[101ea5]#5 = 0b
    #endif

    其实配置成GPIO_IN 容易和 标准GPIO IN 模式产生误解。应该区别一下定义成IIC_MODE等其他宏,然后drvpadconf.c 文件中,设置寄存器即可。寄存器值的设置才是pin 的功能设置的本质。这样就完成mboot里面pin的功能定义。
    ————————————————

  • 相关阅读:
    min25筛
    ngnix安装
    Sublime Text 添加到右键菜单 带菜单图标
    临界区与竟态条件
    cscope 支持C++项目
    内网信息收集
    域权限维持-Hook PasswordChangeNotify
    域权限维持-SID History
    域权限维持-DSRM
    ZooKeeper
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/11811949.html
Copyright © 2020-2023  润新知