mstar 平台I2C 配置

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

  1. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置;
    // 如LED,屏的电源,背光的开关,功放的静音等等。 除了控制设置之外,还需要和外部设置传输数据。
  2. pin 作为GPIO 设置为IN时,是获取外设的高低来判断外设的状态,最常用的一些source 通道的detect,及一些wakeup 功能。
  3. pin 作为SAR 口,获取ADC值; // 如按键板,参照“mstar平台SAR口使用”
  4. pin 作为UART / SPI /SD 口;
  5. 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

特殊口配置

  1. 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 。这样就配置完成了。

  1. 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的功能定义。

使用的话,可以参考“Mstar平台TCA9539 移植

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值