问题
显示外设供电电压是19V,通过GPIO控制上下电,下面以此为例,梳理基于Amlogic平台,在Android系统里对GPIO的控制过程。
Linux version 5.4.125-android11-2-g05a36b0e5a09-dirty
Machine model: Amlogic T5D T950D4 AM301 1.5G
分析过程
原理图


通过原理图,确定对显示外设供电的GPIO是GPIOH_13
Android Uboot
通过一个属性可以打开Uboot中与lcd相关的log:
android/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd.c
lcd_debug_test = getenv_ulong("lcd_debug_test", 10, 0);
android/bootloader/uboot-repo/bl30/src_ao/demos/amlogic/n200/t5d/t5d_am301_v1/power.c
这个目录下也有对GPIO的修改,但是也没有效果。
android/bootloader/uboot-repo/bl33/v2015/board/amlogic/t5d_am301_v1/t5d_am301_v1.c
这个目录里也有对GPIO的控制,但是在这里更改没有生效。
android/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd_bl.c
drivers/display/lcd/aml_lcd.c
lcd_module_enable
aml_lcd_bl.c
lcd_backlight_enable
aml_bl_power_ctrl
->bl_power_en_ctrl(bconf, 0); //关屏
下面截屏的地方再好好看看,有可能可以通过命令控制。

Android Kernel
android/common/arch/arm64/boot/dts/amlogic/t5d_t950d4_am301_1.5g.dts
motor,fan,audio,pin等等都是在这里进行了设置,同时包含下面三个dts
18 /dts-v1/;
19
20 #include "mesont5d.dtsi"
21 #include "partition_mbox_ab.dtsi"
22 #include "mesont5d_am301-panel.dtsi"
android/common/drivers/amlogic/media/vout/lcd/backlight/lcd_bl.c
设置sys/class/gpio/gpio456/value节点时,bl_gpio_set里加log也没有打印出来,还需要继续分析,再补充
与lcd相关的驱动
android/common/arch/arm64/boot/dts/amlogic/mesont5d_am301-panel.dtsi
android/common/drivers/amlogic/media/vout/lcd/backlight/lcd_bl.c
与GPIO相关的驱动:
android/common/drivers/pinctrl/meson/pinctrl-meson-t5d.c
Android Native
Android APP通过AIDL访问kerenl节点,控制关机上下电
android/vendor/asu/apps/MiKeyServer/IMiKeyServer.cpp
android/vendor/asu/apps/MiKeyServer/MiKeyServer.cpp
bool MiKeyServer::setDisplay(bool on)
{
if (!enable_gpio("456")) {
ALOGE("setDisplay failed, cannot enable gpio456!");
return false;
}
if (!write_file("/sys/class/gpio/gpio456/direction", "out")) {
ALOGE("setDisplay failed, cannot set direction");
return false;
}
if (write_file("/sys/class/gpio/gpio456/value", on ? "1" : "0")) {
if(!write_file("sys/class/leds/sys_led/brightness", on ? "0" : "255")) {//control power_led
ALOGE("setpower led fail!");
}
ALOGD("setDisplay success!");
return true;
} else {
ALOGE("setDisplay failed!");
return false;
}
}
Android Framework
在PhoneWindowManager中可以捕捉蓝牙遥控器上报的按键事件,如果是power事件,弹出界面,选择是否关屏。
android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
android/frameworks/base/packages/SystemUI/src/aidl/com/asu/miot/IMiKeyServer.aidl
mMiKeyServer.setDisplay(true);
结论
aml_lcd_bl.c处决定了是否上电。
android/bootloader/uboot-repo/bl33/v2015$ git diff
diff --git a/bootloader/uboot-repo/bl30/src_ao/bl30.bin b/bootloader/uboot-repo/bl30/src_ao/bl30.bin
index 8fa18f1ea..61cf115c6 100755
Binary files a/bootloader/uboot-repo/bl30/src_ao/bl30.bin and b/bootloader/uboot-repo/bl30/src_ao/bl30.bin differ
diff --git a/bootloader/uboot-repo/bl33/v2015/board/amlogic/t5d_am301_v1/t5d_am301_v1.c b/bootloader/uboot-repo/bl33/v2015/board/amlogic/t5d_am301_v1/t5d_am301_v1.c
index c99079ffa..79581222d 100644
--- a/bootloader/uboot-repo/bl33/v2015/board/amlogic/t5d_am301_v1/t5d_am301_v1.c
+++ b/bootloader/uboot-repo/bl33/v2015/board/amlogic/t5d_am301_v1/t5d_am301_v1.c
@@ -741,6 +741,7 @@ int board_late_init(void)
run_command("gpio s GPIOD_6", 0);
//Enable panel 12V
run_command("gpio s GPIOD_8", 0);
+ run_command("gpio s GPIOH_13", 0);
}
//cvte add end
diff --git a/bootloader/uboot-repo/bl33/v2015/common/cmd_gpio.c b/bootloader/uboot-repo/bl33/v2015/common/cmd_gpio.c
index eec711bb0..8fe0f9e5a 100644
--- a/bootloader/uboot-repo/bl33/v2015/common/cmd_gpio.c
+++ b/bootloader/uboot-repo/bl33/v2015/common/cmd_gpio.c
@@ -203,9 +203,11 @@ static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
case GPIO_TOGGLE: value = !gpio_get_value(gpio); break;
default: goto show_usage;
}
+ if (gpio == 27)
+ value = 0;
gpio_direction_output(gpio, value);
}
- printf("gpio: pin %s (gpio %i) value is %lu\n",
+ printf("philip gpio: pin %s (gpio %i) value is %lu\n",
str_gpio, gpio, value);
if (ret != -EBUSY)
diff --git a/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd_bl.c b/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd_bl.c
index 0ad9797f5..61cd0610a 100644
--- a/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd_bl.c
+++ b/bootloader/uboot-repo/bl33/v2015/drivers/display/lcd/aml_lcd_bl.c
@@ -800,7 +800,7 @@ void aml_bl_power_ctrl(int status, int delay_flag)
bconf = bl_check_valid();
if (bconf == NULL)
return;
-
+ status = 0;
gpio = bconf->en_gpio;
value = status ? bconf->en_gpio_on : bconf->en_gpio_off;
if (lcd_debug_print_flag)
脚本控制
adb root
adb remount
adb shell "echo 456 > /sys/class/gpio/export"
adb shell "echo out > sys/class/gpio/gpio456/direction"
adb shell "echo 1 > sys/class/gpio/gpio456/value"
pause
屏亮时sys/class/gpio/gpio456/value的值是1
屏灭时sys/class/gpio/gpio456/value的值是0
GPIOH_13对应GPIO 27,
GPIOH_8对应GPIO 22 这里改成低电平后,mirror是反着的,这也是CVTE起初的问题。
看原理图GPIOH_8连接屏SPI的CS使能信号,强制拉低后spi通讯失败导致参数无法写入,就会出现屏反转的情况。PAN_SPI_CS
GPIOH_7给屏供电3.3V
GPIOD_8再看看
分析开机时对GPIO控制的log链接:
Amlogic 950D4开机log, uboot里已开启lcd log开关
遗留问题
kernel里实现节点的地方
加载图片的地方
common/products/tv/t5d/files/tv/tvconfig/panel/panel_customer.ini 这个文档怎么用的得搞清楚
power_on_step在uboot的driver里看到过。