Android-Amlogic-GPIO

问题

显示外设供电电压是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里看到过。

参考文档

https://blog.csdn.net/u012787604/article/details/115647961

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值