MTK6762 gpio控制

1.内核dws保存文件路径

kernel-4.9/drivers/misc/mediatek/dws\mt6765/k62v1_64_bsp.dws

2.lk dws 保存文件路径

vendor/mediatek/proprietary/bootable/bootloader/lk/target/k62v1_64_bsp/dct/dct/codegen.dws

3.preloader dws 保存文件路径

vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/k62v1_64_bsp/dct/dct/codegen.dws

4.DrvGen.exe工具配置路径

vendor/mediatek/proprietary/scripts/dct/DrvGen.exe

5.配置dws gpio解析

 

 

(1)解析各选项的作用

EintMode: 指示是否当作中断引脚来使用,例如GPIO0就可以当作ENTI0,如果选中了该模式,其它模式是不可见的。
Def.Mode: GPIO默认的模式,什么意思呢,就是在系统启动过程中GPIO口的模式,GPIO口启动模式是定义在文件cust_gpio_boot.h文件中的,例如,GPIO3的启动模式就是作为普通的GPIO口来使用,即模式为GPIO_MODE_00,稍后会为大家讲解cust_gpio_boot.h文件是怎么生成的。
M0~M7: 由于GPIO口是复用的,也就说除了作为普通的GPIO口使用之外,还有其它用途,所以这里会在cust_gpio_usage.h文件中产生一些宏定义,可能某些驱动中会用到这些宏定义。这里是没有这选项的,有些同系列的芯片有这些选项。
InPull En: 是指GPIO是否使能上拉或下拉。
InPull SelHigh: 上面只是只是指示是否使能上拉或下拉,但是并没有指出到底是上拉还是下拉,那么就由这里来指定,如果勾选了那么就表示上拉,否则就是下拉。
Def.Dir: 指示GPIO默认的数据传输方向,是输入还是输出,都需要设置的。
In、Out: In和Out这两个选项暂时不知道有何用处,根据字面意思呢,应该是允许输入或输出的。
OutHigh: 指示GPIO口作为普通IO时输出电平高低。
VarName1: 变量的名字,有些驱动中可能会使用到一些GPIO口,那么这里就是为GPIO口定义一个别名,那么在驱动中只需要这个别名就可以了,而这个GPIO口是可以换的,所以这里也是为了可移植性。

SMT:使能施密特触发器
IES:输入使能(默认1)

在GPIO口配置完成之后,首先是需要点击Save来保存这个配置,可以点击Gen Code去生成新的代码,新的代码就生成在和codegen.dws同一个目录下。

前面说了在系统启动过程中会初始化这些GPIO口,那么什么地方在做初始化呢,有两个地方preloader和lk,preloader初始化代码流程如下:
mt_gpio_set_default()->mt_gpio_set_default_chip()
而该部分代码在mediatek/platform/mt6762/preloader/src/drivers/gpio_init.c中,在该文件中首先就是包含文件cust_gpio_boot.h。

而lk部分初始化流程都是差不多的,流程如下:
mt_gpio_set_default()->mt_gpio_set_default_chip()
lk部分代码在mediatek/platform/mt6582/lk/mt_gpio_init.c中。

(2)获取gpio的值,或则电平的高低

int getLcd_index_from_gpio_switch()
{
    int ret = 0;
	int bit0,bit1,bit2,bit3;

	bit3 = mt_get_gpio_value(0x80000000+GPIO168)> 0 ? 1:0; //switch1 67 4
	bit2 = mt_get_gpio_value(0x80000000+GPIO12)> 0 ? 1:0; //switch2 69 3
	bit1 = mt_get_gpio_value(0x80000000+GPIO8)> 0 ? 1:0;  //switch3 70  2
	bit0 = mt_get_gpio_value(0x80000000+GPIO10)> 0 ? 1:0; //switch4 72 1


	 ret = (bit3<<0x3)|(bit2<<0x2)|(bit1<<0x1)|bit0;
	printf("ZQ9008 use switch_gpio val %d,%d,%d,%d,%d  \n",ret,bit0,bit1,bit2,bit3);

	return ret;
}

位操作取值 。

    bit3 = (mt_get_gpio_value(6)&0x2) >> 0x01 ; 
    bit2 = mt_get_gpio_value(12)&0x01 ;     
    bit1 = mt_get_gpio_value(8)&0x01;       
    bit0 = mt_get_gpio_value(10)&0x01;  

(3)代码手动配置gpio 模式,输入或输出方向,高低电平。

//设置gpio0为GPIO模式
mt_set_gpio_mode(GPIO18, GPIO_MODE_GPIO);
//设置gpio0方向为out
mt_set_gpio_dir(GPIO0, GPIO_DIR_OUT);
//设置gpio0高
mt_set_gpio_out(GPIO0, GPIO_OUT_ONE); //低是ZERO


vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6762/uart.c
mt_set_gpio_mode(GPIO0, GPIO_MODE_00);
mt_set_gpio_dir(GPIO0, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO0, GPIO_OUT_ONE);
vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6762/src/drivers/platform.c
mt_set_gpio_mode(GPIO0, GPIO_MODE_00);
mt_set_gpio_dir(GPIO23, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO0, GPIO_OUT_ZERO);

6.内核配置路径

kernel-4.9/arch/arm64/boot/dts/mediatek/k62v1_64_bsp.dts

	zdong_pins_LcdPowerState_input: LcdPowerState_input {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO45__FUNC_GPIO45>;
			slew-rate = <0>; //in 0输入默认填0
			bias-disable;
		};
	};
	zdong_pins_BoardLed_output0: BoardLed_output0 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO11__FUNC_GPIO11>;
			slew-rate = <1>; //out  1 输出默认填1
			output-low;
		};
	};

	      gpio0:    gpio@0    {
            pins_cmd_dat {
                pins = <PINMUX_GPIO0__FUNC_IDDIG>;    //模式
                slew-rate = <0>;                  //方向0--in    1--out
                bias-pull-down = <11>;   //pull使能,并且pull-down【<11>功能保留,写<00>也行】
                bias-disable;         //pull失能,与bias-pull-down/up冲突
                output-low;           //设置输出low,可以output-high【方向为out才有效】
                input-schmitt-enable = <0>;
            };
        };

查看pinctrl是否被占用

ZQ9008:/ # cat /sys/kernel/debug/pinctrl/pinctrl-maps                          
Pinctrl maps:
device ziqigpio
state state_LcdPowerState_input
type MUX_GROUP (2)
controlling device 1000b000.pinctrl
group GPIO45
function func0

device ziqigpio
state state_LcdPowerState_input
type CONFIGS_GROUP (4)
controlling device 1000b000.pinctrl
group GPIO45
config 00000001
config 00000011

device ziqigpio
state state_BoardLed_output0
type MUX_GROUP (2)
controlling device 1000b000.pinctrl
group GPIO11
function func0

device ziqigpio
state state_BoardLed_output0
type CONFIGS_GROUP (4)
controlling device 1000b000.pinctrl
group GPIO11
config 0000000f
config 00010011

config 配置的值的意义

 

查看一些gpio用途 

ZQ9008:/ # cat /sys/kernel/debug/gpio                                          
gpiochip0: GPIOs 332-511, parent: platform/1000b000.pinctrl, 1000b000.pinctrl:
 gpio-332 (                    |cd                  ) in  hi IRQ
 gpio-337 (                    |xr117x_irq_gpio     ) in  hi IRQ
 gpio-345 (                    |ziqi-encrypt        ) out hi    
 gpio-346 (                    |ziqi-encrypt        ) out hi    
 gpio-347 (                    |icn6211_power       ) out hi    
 gpio-491 (                    |GPIO_ICN6211_RST    ) out hi    
 gpio-495 (                    |xr117x_rst_gpio     ) out hi    
 gpio-500 (                    |GPIO_LCD_3V3        ) out lo    
ZQ9008:/ # 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值