高通平台在lk里识别的屏之后,会通过cmdline向内核传递参数
1 cat /proc/cmdline
mdss_mdp.panel=1:dsi:0:qcom,mdss_dsi_nt35532_fhd_video:1:none:cfg:single_dsi
2 drivers\video\msm\mdss\Mdss_mdp.c
在这个函数中用module_param_string来注册参数
module_param_string(panel, mdss_mdp_panel, MDSS_MAX_PANEL_LEN, 0);展开这个宏定义
#define module_param_string(name, string, len, perm) \
static const struct kparam_string __param_string_##name \
= { len, string }; \
__module_param_call(MODULE_PARAM_PREFIX, name, \
¶m_ops_string, \
.str = &__param_string_##name, perm, -1, 0);\
__MODULE_PARM_TYPE(name, "string")
__module_param_call的宏定义为
#define __module_param_call(prefix, name, ops, arg, perm, level, flags) \
/* Default value instead of permissions? */ \
static const char __param_str_##name[] = prefix #name; \
static struct kernel_param __moduleparam_const __param_##name \
__used \
__attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
= { __param_str_##name, ops, VERIFY_OCTAL_PERMISSIONS(perm), \
level, flags, { arg } }根据这些宏,最终展开的为static const char __param_str_panel[] = MODULE_PARAM_PREFIX panel; \
static struct kernel_param __moduleparam_const __param_panel \
__used __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) = {
.name = __param_str_panel,
.ops = ¶m_ops_string,
.perm = VERIFY_OCTAL_PERMISSIONS(0),
.level = -1,
.flags = 0,
.str = &__param_string_panel }kernel连接时会将param放到_param段中MODULE_PARAM_PREFIX的宏定义为
#ifdef MODULE
#define MODULE_PARAM_PREFIX /* empty */
#else
#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
#endif是模块编译的为空,不是模块编译的话为 "模块名."查看Makefile
obj-$(CONFIG_FB_MSM_MDSS) += mdss-mdp.o
可知模块名为mdss-mdp
所以kernel传参数的时候,参数名为 mdss-mdp.panel
3 kernel对cmdline的解析
请参考http://blog.csdn.net/skyflying2012/article/details/41142801

本文介绍高通平台如何在LK阶段识别屏幕,并通过cmdline向内核传递屏幕参数的过程。详细解析了mdss_mdp.panel参数的注册及内核对cmdline的处理方式。

1638

被折叠的 条评论
为什么被折叠?



