我是靠谱客的博主 热情红酒,最近开发中收集的这篇文章主要介绍DRM驱动代码分析:uboot和kernel之间屏幕是如何匹配的,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

uboot与kernel之间参数的传递:

dsi_display.c
static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN];
module_param_string(dsi_display0, dsi_display_primary, MAX_CMDLINE_PARAM_LEN,
0600);
MODULE_PARM_DESC(dsi_display0,
"msm_drm.dsi_display0=<display node>:<configX> where <display node> is 'primary dsi display node name' and <configX> where x represents index in the topology list");

MODULE_PARM_DESC:对参数进行说明

includelinuxmoduleparam.h
/**
* module_param_string - a char array parameter
* @name: the name of the parameter
* @string: the string variable
* @len: the maximum length of the string, incl. terminator
* @perm: visibility in sysfs.
*
* This actually copies the string when it's set (unlike type charp).
* @len is usually just sizeof(string).
*/
#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,

&param_ops_string,

.str = &__param_string_##name, perm, -1, 0);
__MODULE_PARM_TYPE(name, "string")
/* You can override this manually, but generally this should match the
module name. */
#ifdef MODULE
#define MODULE_PARAM_PREFIX /* empty */
#else
#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
#endif
vendorqcomopensourcedisplay-driversmsmAndroid.mk
KBUILD_OPTIONS += MODNAME=msm_drm
注:msm_drm.dsi_display0应该就是这么来的

name:参数名字
string:驱动代码里的变量名

**
* dsi_display_parse_boot_display_selection()- Parse DSI boot display name
*
* Return:	returns error status
*/
static int dsi_display_parse_boot_display_selection(void)
{
char *pos = NULL;
char disp_buf[MAX_CMDLINE_PARAM_LEN] = {''};
int i, j;
for (i = 0; i < MAX_DSI_ACTIVE_DISPLAY; i++) {
strlcpy(disp_buf, boot_displays[i].boot_param,
MAX_CMDLINE_PARAM_LEN);
pos = strnstr(disp_buf, ":", strlen(disp_buf));
/* Use ':' as a delimiter to retrieve the display name */
if (!pos) {
DSI_DEBUG("display name[%s]is not validn", disp_buf);
continue;
}
for (j = 0; (disp_buf + j) < pos; j++)
boot_displays[i].name[j] = *(disp_buf + j);
boot_displays[i].name[j] = '';
boot_displays[i].boot_disp_en = true;
}
return 0;
}

将Uboot传递过来的屏幕名字解析出来(通过cmdline的方法)。

dsi_display.c
int dsi_display_dev_probe(struct platform_device *pdev)
{
boot_disp = &boot_displays[index];
node = pdev->dev.of_node;
if (boot_disp->boot_disp_en) {
/* The panel name should be same as UEFI name index */
panel_node = of_find_node_by_name(mdp_node, boot_disp->name);
if (!panel_node)
DSI_WARN("%s panel_node %s not foundn", display->display_type,
boot_disp->name);
} else {
panel_node = of_parse_phandle(node,
"qcom,dsi-default-panel", 0);
if (!panel_node)
DSI_WARN("%s default panel not foundn", display->display_type);
}
}

通过屏幕名字在设备树中查找屏幕节点。

参考资料:
[1]OnePlusOSS/android_kernel_modules_and_devicetree_oneplus_sm8475
[2]Kernel: Xiaomi kernel changes for Mi 10S and Redmi K40 Android R
[3]Linux驱动代码中MODULE_PARM_DESC的作用
[4]驱动模块传参

最后

以上就是热情红酒为你收集整理的DRM驱动代码分析:uboot和kernel之间屏幕是如何匹配的的全部内容,希望文章能够帮你解决DRM驱动代码分析:uboot和kernel之间屏幕是如何匹配的所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部