mtk下添加关机充电图片流程,以及与kernel通信

mtk平台下的关机充电有两种情况

1、充电只启动bootloader程序,即启动lk,不启动kernel

2、充电启动bootloader、kernel、kernel上层的应用程序

以第2种为例说明

1、添加图片资源

(1)通过vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk里面的$(BOOT_LOGO_DIR)  $(BASE_LOGO)来获取当前所用的图片位置,可以在rules.mk对应的位置来添加调试信息,$(warning "chenwenmin" $(BOOT_LOGO_DIR)  $(BASE_LOGO));图片格式为bmp文件,例如在文件位置vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/hdplus1600下添加图片名为hdplus1600_no_standard.bmp的文件

(2)在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update最后一个带数据索引的raw文件下添加图片的转换

a、./tool/bmp_to_raw ./temp38.raw ./$p/"${p}_no_standard".bmp用于把bmp文件转换为raw格式的文件;bmp_to_raw工具的实现在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/tool路径下

b、./tool/zpipe -l 9 ./"${p}.raw" temp0.raw temp1.raw temp2.raw temp3.raw temp4.raw temp5.raw temp6.raw temp7.raw temp8.raw temp9.raw temp10.raw temp11.raw temp12.raw temp13.raw temp14.raw temp15.raw temp16.raw temp17.raw temp18.raw temp19.raw temp20.raw temp21.raw temp22.raw temp23.raw temp24.raw temp25.raw temp26.raw temp27.raw temp28.raw temp29.raw temp30.raw temp31.raw temp32.raw temp33.raw temp34.raw temp35.raw temp36.raw temp37.raw temp38.raw用于把所有的raw文件转换为一个raw文件"${p}.raw" ;zpipe工具实现的路径在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/tool/libz下

c、rm -rf ./temp0.raw ./temp1.raw ./temp2.raw ./temp3.raw ./temp4.raw ./temp5.raw ./temp6.raw ./temp7.raw ./temp8.raw ./temp9.raw ./temp10.raw ./temp11.raw ./temp12.raw ./temp13.raw ./temp14.raw ./temp15.raw ./temp16.raw ./temp17.raw ./temp18.raw ./temp19.raw ./temp20.raw ./temp21.raw ./temp22.raw ./temp23.raw ./temp24.raw ./temp25.raw ./temp26.raw ./temp27.raw ./temp28.raw ./temp29.raw ./temp30.raw ./temp31.raw ./temp32.raw ./temp33.raw ./temp34.raw ./temp35.raw ./temp36.raw ./temp37.raw ./temp38.raw ./bootlogo.raw删除 ./temp38.raw文件

raw文件是按照顺序生成,在代码中通过索引来使用图片资源

2、调用图片资源(此时是已经启动了kernel,在应用层调用图片,不是在bootloaer,bootloader的后续分析)

(1)在vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp文件末尾添加函数实现,注意此时使用的图片索引值为38,与第1步的位置对应

/*
 * Show charging no standard logo
 *
 */
void show_charger_no_standard_logo(void)
{
    if (MTK_LOG_ENABLE == 1) {
        SLOGD("[libshowlogo: %s %d]show charger_ov logo, index = 3 \n",__FUNCTION__,__LINE__);
    }
    if (error_flag == 0)
    {
        anim_show_logo(38);
    }
}

 (2)在vendor/mediatek/proprietary/external/libshowlogo/charging_animation.h文件末尾添加函数实现

void show_charger_no_standard_logo(void);

 (3)在vendor/mediatek/proprietary/external/charger/bootlogo.cpp文件中的函数void bootlogo_show_charging(int capacity, int cnt)内部调用函数show_charger_no_standard_logo();//说明show_charger_no_standard_logo的调用根据自己的需求来调用,此处只是举例,确保生效,直接return的

void bootlogo_show_charging(int capacity, int cnt)
{
    KPOC_LOGI("[ChargingAnimation: %s %d]%d, %d\n",__FUNCTION__,__LINE__, capacity, cnt);
	show_charger_no_standard_logo();
	return;


    if (get_battnotify_status())
    {
        KPOC_LOGI("[ChargingAnimation: %s %d] show_charger_error_logo, get_battnotify_status()= %d \n",__FUNCTION__,__LINE__, get_battnotify_status());
        show_charger_ov_logo();
        return;
    }
    if (showLowBattLogo)
    {
        KPOC_LOGI("[ChargingAnimation: %s %d] show_low_battery , showLowBattLogo = %d \n",__FUNCTION__,__LINE__,showLowBattLogo);
        show_low_battery();
        return;
    }
    show_battery_capacity(capacity);
}

此时已经完成在关机状态下(kernel有启动)图片的显示情况

3、应用层与kernel的通信(如果有需要可以查看此步骤)

以获取电池充电的充电类型为需求,有两种获取充电类型的方法,一种是通过ioctl的系统调用,第二种是通过系统节点信息来获取;由于只是获取属性,建议使用系统节点来获取,ioctl相对繁琐

(1)在kernel-4.9/drivers/power/supply/mediatek/charger/mtk_charger.c文件中添加系统节点,

static ssize_t show_charge_type(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	enum charger_type chr_type = mt_get_charger_type();

	return sprintf(buf, "%d\n", chr_type);
}

static DEVICE_ATTR(charge_type, 0444, show_charge_type, NULL);

#define DEVICE_ATTR(_name, _mode, _show, _store) \
    struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

通过宏DEVICE_ATTR来定义变量,变量名为dev_attr_charge_type

kernel-4.9/drivers/power/supply/mediatek/charger/mtk_charger.c

下的函数static int mtk_charger_setup_files(struct platform_device *pdev)调用

 

手机的kernel启动后,对应的节点路径以及文件名为 sys/devices/platform/charger/charge_type

(2)为sys/devices/platform/charger/charge_type添加权限,如果不加的话,应用层会open文件失败

(3)应用层读取节点数据

在vendor/mediatek/proprietary/external/charger/bootlogo.cpp文件中添加读取节点的实现


static const char *bat_notify_path[] = {
    "/sys/devices/platform/charger/BatteryNotify",
};

/*
 * return value:
 *     1: abnormal status
 *     0: normal status
 *     If path is not found, return 0
 */
static int get_charge_type()
{
    int i = 0;
    int bat_status = 0;

    /* Find path for battery status */
    for (i = 0; i < ARRAY_SIZE(bat_notify_path); i++) {
        bat_status = get_int_value(bat_notify_path[i]);
        if (bat_status != -1)
            break;
    }
    KPOC_LOGI("charger battStatus=%d, idx=%d\n", bat_status, i);

    if (bat_status > 0)
        return 1;

    return 0;
}

 充电类型的映射关系在kernel-4.9/drivers/misc/mediatek/include/mt-plat/charger_type.h文件中

enum charger_type {
	CHARGER_UNKNOWN = 0,
	STANDARD_HOST,		/* USB : 450mA */
	CHARGING_HOST,
	NONSTANDARD_CHARGER,	/* AC : 450mA~1A */
	STANDARD_CHARGER,	/* AC : ~1A */
	APPLE_2_1A_CHARGER, /* 2.1A apple charger */
	APPLE_1_0A_CHARGER, /* 1A apple charger */
	APPLE_0_5A_CHARGER, /* 0.5A apple charger */
	WIRELESS_CHARGER,
};

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值