指定pin脚做复用功能的方法

因机型多,产品形态丰富,但为了软件方便控管需要使用同一套固件,本文介绍如何将各个pin脚初始化为指定的复用功能。软件能自行识别不同机型,根据机型的产品形态将pin初始化成不同功能,而非在dts里写死。

可以提供的资料:

《SSC335 IO_definition,xls》《SSC337DE IO_definition.xls》//各pin脚可复用功能列表

《iNfinity6b0_reg_chiptop.xls》//详细说明register各个bit的意义

《iNfinity6b0__reg_pad_top_pm.xls》//详细说明register各个bit的意义

《iNfinity6b0_GPIO_Mapping_Table(8bit reg mode).xls》//各pin脚复用功能,优先级从高到低(从上到下)。

需要注意:

《IO_definityion》里3_MISC_Table页有说明各个pin脚可以复用的功能。但并非可以随意组合,例如PAD_SPI0_DI/DO/CK做了spi功能,就不支持PAD_SPI0_CZ另外做GPIO,或者用其他GPIO与PAD_SPI0_DI/DO/CK组合做spi功能。

打板画图纸时需要与原厂硬件工程师沟通,原理图没有经过原厂硬件工程师review导致打板之后发现软件实现不了,从而影响研发进度及资源浪费的,责任由客户自行负责。

图1自《iNfinity6b0_GPIO_Mapping_Table(8bit reg mode).xls》

图2自《kernel/drivers/sstar/gpio/infinity6b0/mhal_pinmux.c》,图2即对应《iNfinity6b0_GPIO_Mapping_Table(8bit reg mode).xls》,复用关系优先级从高到低,GPIO功能的优先级最低。

建议指定pin脚本的PadMode使用mdrv_gpio.c里已经封装好的接口:

int MDrv_GPIO_PadVal_Set(U8 u8IndexGPIO, U32 u32PadMode);

以PAD_GPIO1做SPI1功能为例:

  1. 高于SPI1的复用功能对应的register bits清0:

    寄存器[CHIPTOP_BANK, REG_TEST_IN_MODE]的bit[REG_TEST_IN_MODE_MASK]置0;

    寄存器[CHIPTOP_BANK, REG_TEST_OUT_MODE]的bit[REG_TEST_OUT_MODE_MASK]置0;

  2. SPI1功能对应的register bits设置成指定value:

    寄存器[CHIPTOP_BANK, REG_SPI1_MODE]的bit[REG_SPI1_MODE_MASK]设置为BIT6;

以PAD_GPIO1做GPIO功能为例:

  1. 将所有复用功能对应的register bits清0,即为GPIO mode。