qiuri2008

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

芯片的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的功能定义。
————————————————

posted on 2019-11-07 14:40  江召伟  阅读(1077)  评论(0编辑  收藏  举报