平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
文章目录
edp
驱动被分成两个文件
analogix_dp-rockchip.c | rk驱动文件 |
analogix_dp_core.c | drm驱动文件 |
1 、analogix_dp_bind
的定义
首先查看:
目录kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL);
的使用达到的目的是:不用考虑只要任意一种资源申请失败,就要回滚释放之前申请的所有资源,咱们只管申请就行了,设备模型帮咱们释放了。
EXPORT_SYMBOL_GPL(analogix_dp_bind);
Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏。 如果你的模块需要输出符号给其他模块使用,应当使用下面的宏定义:
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
这两个宏均用于将给定的符号导出到模块外. _GPL版本的宏定义只能使符号对GPL许可的模块可用。 符号必须在模块文件的全局部分导出,不能在函数中导出,这是因为上述这两个宏将被扩展成一个特殊用途的声明,而该变量必须是全局的。这个变量存储于模块的一个特殊的可执行部分(一个"ELF
段" ),在装载时,内核通过这个段来寻找模块导出的变量(感兴趣的读者可以看<linux/module.h>
获知更详细的信息)。
2、 analogix_dp_bind
的使用
目录/kernel/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
2.1、rockchip-dp
platform
驱动的注册:
2.2、设备树对应信息:
有了设备树,实现device
与 driver
的匹配利用"compatible"
来匹配的,即设备树加载之后,内核会自动把设备树节点转换成platform_device
这种格式,同时把名字放到of_node
这个地方。
目录:kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
目录:kernel/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi
2.3、 查看:sysfs
文件系统
目录 /sys/bus/platform/drivers/rockchip-dp
2.3 rockchip_dp_probe
入口函数的分析:
这里最后调用了component_add
看一下rockchip_dp_component_ops
2.4 components
的创建
首先介绍下componentised subsystemes
分析下component
的相关函数:
component_add() is called to add a component
https://lkml.org/lkml/2016/2/15/646
This calls try_to_bring_up_masters() which calls
try_to_bring_up_master() for each master in the system
try_to_bring_up_masters
try_to_bring_up_master
master->ops->bind(master->dev);
此时会调用:kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
rockchip_drm_bind
函数
目录:kernel/drivers/base/component.c
中component_bind
我的日志:
kernel/drivers/gpu/drm$ vim rockchip/analogix_dp-rockchip.c
rockchip_dp_bind将会执行:
最后就是使用到return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
分析一下:rockchip_dp_bind