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:/ #