iTop-4418的GPIO初始化配置文件位于kernel/arch/arm/plat-s5p4418/topeet/include/cfg_gpio.h,每个GPIO脚通过5组在头文件kernel/arch/arm/plat-s5p4418/topeet/include/cfg_type.h中的宏定义的或运算组合实现配置。
同时,在uBoot代码仓库u-boot/board/s5p4418/drone2/include/cfg_gpio.h中,也有格式相同的、用于GPIO配置的头文件。
第一组:PAD_MODE_XXX,用于设置GPIO为对应模式(复用功能/输入/输出/中断)。
第二组:PAD_FUNC_ALT[0:3],用于配置GPIO的复用功能。
第三组:PAD_LEVEL_XXX,用于配置GPIO输出电平或中断条件。
第四组:PAD_PULL_XX,用于配置输入模式的内部上拉或者下拉。
第五组:PAD_STRENGTH_[0..3],用于设置GPIO的驱动能力。
第一组:PAD_MODE_XXX
用于设置GPIO为对应模式,可选参数包括:
PAD_MODE_ALT配置GPIO引脚使用S5P4418手册定义的复用功能,此时GPIO引脚的功能选择由第二组宏定义选择。
PAD_MODE_IN配置GPIO引脚为输入模式。
PAD_MODE_OUT配置GPIO引脚为输出模式。
PAD_MODE_INT配置GPIO引脚为中断模式。
/* gpio mode, altfunction, gpio in/out or interrput */ enum { PAD_MODE_ALT = (0 << PAD_MODE_SHIFT), PAD_MODE_IN = (1 << PAD_MODE_SHIFT), PAD_MODE_OUT = (2 << PAD_MODE_SHIFT), PAD_MODE_INT = (3 << PAD_MODE_SHIFT), };
第二组:PAD_FUNC_ALT[0:3]
用于配置GPIO的复用功能。这些复用功能由S5P4418手册I/O Function Description一节定义。可选参数包括:
PAD_FUNC_ALT0配置引脚使用手册定义的Alternate Function 0。
PAD_FUNC_ALT1配置引脚使用手册定义的Alternate Function 1。
PAD_FUNC_ALT2配置引脚使用手册定义的Alternate Function 2。
PAD_FUNC_ALT3配置引脚使用手册定义的Alternate Function 3。
/* gpio altfunction, refer to NX_GPIO_PADFUNC in nx_gpio.h */ enum { PAD_FUNC_ALT0 = (0 << PAD_FUNC_SHIFT), PAD_FUNC_ALT1 = (1 << PAD_FUNC_SHIFT), PAD_FUNC_ALT2 = (2 << PAD_FUNC_SHIFT), PAD_FUNC_ALT3 = (3 << PAD_FUNC_SHIFT), };
第三组:PAD_LEVEL_XXX
用于配置GPIO输出电平或中断条件。可选参数包括:
PAD_LEVEL_LOW输出低电平或低电平中断,Alive GPIO使用异步中断。
PAD_LEVEL_HIGH输出高电平或高电平中断,Alive GPIO使用异步中断。
PAD_LEVEL_FALLINGEDGE下降沿中断,Alive GPIO使用异步中断。
PAD_LEVEL_RISINGEDGE上升沿中断,Alive GPIO使用异步中断。
PAD_LEVEL_LOW_SYNC同步低电平中断,适用于Alive GPIO,普通GPIO不支持。
PAD_LEVEL_HIGH_SYNC同步高电平中断,适用于Alive GPIO,普通GPIO不支持。
PAD_LEVEL_BOTHEDGE下降沿-上升沿中断,Alive GPIO不支持。
PAD_LEVEL_ALTGPIO使用复用功能。
/* ouput level or interrupt detect mode, refer to NX_GPIO_INTMODE in nx_gpio.h */ enum { PAD_LEVEL_LOW = (0 << PAD_LEVEL_SHIFT), /* if alive, async lowlevel */ PAD_LEVEL_HIGH = (1 << PAD_LEVEL_SHIFT), /* if alive, async highlevel */ PAD_LEVEL_FALLINGEDGE = (2 << PAD_LEVEL_SHIFT), /* if alive, async fallingedge */ PAD_LEVEL_RISINGEDGE = (3 << PAD_LEVEL_SHIFT), /* if alive, async eisingedge */ PAD_LEVEL_LOW_SYNC = (4 << PAD_LEVEL_SHIFT), /* if gpio , not support */ PAD_LEVEL_HIGH_SYNC = (5 << PAD_LEVEL_SHIFT), /* if gpio , not support */ PAD_LEVEL_BOTHEDGE = (4 << PAD_LEVEL_SHIFT), /* if alive, not support */ PAD_LEVEL_ALT = (6 << PAD_LEVEL_SHIFT), /* if pad function is alt, not set */ };
第四组:PAD_PULL_XX
用于配置输入模式的内部上拉或者下拉。可选参数包括:
PAD_PULL_DN下拉。
PAD_PULL_UP上拉。
PAD_PULL_OFF无。
enum { PAD_PULL_DN = (0 << PAD_PULLUP_SHIFT), /* Do not support Alive-GPIO */ PAD_PULL_UP = (1 << PAD_PULLUP_SHIFT), PAD_PULL_OFF = (2 << PAD_PULLUP_SHIFT), };
第五组:PAD_STRENGTH_[0..3]
用于设置GPIO的驱动能力。可选参数为PAD_STRENGTH_0到PAD_STRENGTH_3四个等级。
enum { PAD_STRENGTH_0 = (0 << PAD_STRENGTH_SHIFT), PAD_STRENGTH_1 = (1 << PAD_STRENGTH_SHIFT), PAD_STRENGTH_2 = (2 << PAD_STRENGTH_SHIFT), PAD_STRENGTH_3 = (3 << PAD_STRENGTH_SHIFT), };