Linux DRM那些事-内核代码
ahcoder 2025-01-04 16:50 18 浏览
一、内核代码
掀开DRM基本概念的面纱后,我们把“罪恶”的小手伸向DRM内核代码。
注:本文和后续DRM驱动系列基于Linux4.4内核、Rockchip RK3399进行介绍。
Linux DRM内核代码路径:drivers/gpu/drm。 使用ls命令查看该目录,显示如下:
root@ubuntu:/home/run/code/rockchip-bsp/kernel/drivers/gpu/drm# ls
amd drm_atomic.c drm_crtc_internal.h drm_fb_cma_helper.c drm_internal.h drm_modes.c drm_rect.c exynos mga rcar-du ttm
armada drm_atomic_helper.c drm_debugfs.c drm_fb_helper.c drm_ioc32.c drm_modeset_lock.c drm_scatter.c fsl-dcu mgag200 rockchip udl
ast drm_auth.c drm_dma.c drm_flip_work.c drm_ioctl.c drm_of.c drm_scdc_helper.c gma500 msm savage vc4
ati_pcigart.c drm_bridge.c drm_dp_helper.c drm_fops.c drm_irq.c drm_panel.c drm_sync_helper.c i2c nouveau shmobile vgem
atmel-hlcdc drm_bufs.c drm_dp_mst_topology.c drm_gem.c drm_legacy.h drm_pci.c drm_sysfs.c i810 omapdrm sis via
bochs drm_cache.c drm_drv.c drm_gem_cma_helper.c drm_lock.c drm_plane_helper.c drm_trace.h i915 panel sti virtio
bridge drm_context.c drm_edid.c drm_global.c drm_memory.c drm_platform.c drm_trace_points.c imx qxl tdfx vmwgfx
cirrus drm_crtc.c drm_edid_load.c drm_hashtab.c drm_mipi_dsi.c drm_prime.c drm_vma_manager.c Kconfig r128 tegra
drm_agpsupport.c drm_crtc_helper.c drm_encoder_slave.c drm_info.c drm_mm.c drm_probe_helper.c drm_vm.c Makefile radeon tilcdc
在Linux 内核中,通过Makefile、Kconfig和SOC厂商对应的*defconfig文件配合完成DRM代码编译。在DRM驱动程序中,主要涉及到的文件有:
- drivers/gpu/Makefile
在Makefile中可以看到:obj-y += drm/,说明直接编译drm目录。
A.小知识点:
obj-y、obj-m 是Makefile变量。在Makefile中为这些变量赋值后,Kbuild会自动把对象编译到内核或者编译成模块。
obj-y:表示编译进内核;obj-m:表示编译成模块。
后续会专门介绍Linux内核Kbuild系统。
2.drivers/gpu/drm/Makefile、Kconfig
在Makefile中区分了DRM core和SOC DRM driver的编译。
1)DRM core对应的部分文件
drm-y := drm_auth.o drm_bufs.o drm_cache.o \
drm_context.o drm_dma.o \
drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
drm_lock.o drm_memory.o drm_drv.o drm_vm.o \
drm_scatter.o drm_pci.o \
drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \
drm_crtc.o drm_modes.o drm_edid.o \
drm_info.o drm_debugfs.o drm_encoder_slave.o \
drm_trace_points.o drm_global.o drm_prime.o \
drm_rect.o drm_vma_manager.o drm_flip_work.o \
drm_modeset_lock.o drm_atomic.o drm_bridge.o \
drm_sync_helper.o drm_scdc_helper.o
2)SOC DRM driver对应的部分文件
obj-$(CONFIG_DRM_TTM) += ttm/
obj-$(CONFIG_DRM_R128) += r128/
obj-$(CONFIG_HSA_AMD) += amd/amdkfd/
obj-$(CONFIG_DRM_RADEON)+= radeon/
obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
obj-$(CONFIG_DRM_MGA) += mga/
obj-$(CONFIG_DRM_I810) += i810/
obj-$(CONFIG_DRM_I915) += i915/
obj-$(CONFIG_DRM_MGAG200) += mgag200/
obj-$(CONFIG_DRM_VC4) += vc4/
obj-$(CONFIG_DRM_CIRRUS_QEMU) += cirrus/
obj-$(CONFIG_DRM_SIS) += sis/
obj-$(CONFIG_DRM_SAVAGE)+= savage/
obj-$(CONFIG_DRM_VMWGFX)+= vmwgfx/
obj-$(CONFIG_DRM_VIA) +=via/
obj-$(CONFIG_DRM_VGEM) += vgem/
obj-$(CONFIG_DRM_NOUVEAU) +=nouveau/
obj-$(CONFIG_DRM_EXYNOS) +=exynos/
obj-$(CONFIG_DRM_ROCKCHIP) +=rockchip/
obj-$(CONFIG_DRM_GMA500) += gma500/
obj-$(CONFIG_DRM_UDL) += udl/
obj-$(CONFIG_DRM_AST) += ast/
obj-$(CONFIG_DRM_ARMADA) += armada/
obj-$(CONFIG_DRM_ATMEL_HLCDC) += atmel-hlcdc/
obj-$(CONFIG_DRM_RCAR_DU) += rcar-du/
obj-$(CONFIG_DRM_SHMOBILE) +=shmobile/
obj-$(CONFIG_DRM_OMAP) += omapdrm/
obj-$(CONFIG_DRM_QXL) += qxl/
obj-$(CONFIG_DRM_BOCHS) += bochs/
obj-$(CONFIG_DRM_VIRTIO_GPU) += virtio/
obj-$(CONFIG_DRM_MSM) += msm/
obj-$(CONFIG_DRM_TEGRA) += tegra/
obj-$(CONFIG_DRM_STI) += sti/
obj-$(CONFIG_DRM_IMX) += imx/
在每个文件夹中的Kconfig文件中可以看到对应文件夹实现的功能。
以RK3399为例,在drivers/gpu/drm/rockchip/Kconfig中:
config DRM_ROCKCHIP
tristate "DRM Support for Rockchip"
depends on DRM
depends on RESET_CONTROLLER
select DRM_KMS_HELPER
select DRM_KMS_FB_HELPER
select DRM_PANEL
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
select VIDEOMODE_HELPERS
help
Choose this option if you have a Rockchip soc chipset.
This driver provides kernel mode setting and buffer
management to userspace. This driver does not provide
2D or 3D acceleration; acceleration is performed by other
IP found on the SoC.
对drivers/gpu/drm/中非SOC DRM driver做个简单说明,见下表。
文件夹 | 简介 |
bridge | 接口转换驱动 |
i2c | I2C接口的encoder或transmitter芯片驱动 |
ttm | GEM和TTM是DRM的两套内存管理子系统 |
vgem | 非硬件支持的GEM服务 |
3.drivers/gpu/drm/rockchip/Makefile、Kconfig
在Makefile文件中,区分了RK3399 DRM驱动和RK3399 各种接口(hdmi、lvds、dp、mipi等)驱动,例:
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
rockchip_drm_gem.o rockchip_drm_vop.o
rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o
obj-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp.o
cdn-dp-objs := cdn-dp-core.o cdn-dp-reg.o cdn-dp-link-training.o
obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o
obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o
obj-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o
obj-$(CONFIG_ROCKCHIP_LVDS) += rockchip_lvds.o
obj-$(CONFIG_ROCKCHIP_RGB) += rockchip_rgb.o
obj-$(CONFIG_ROCKCHIP_DRM_BACKLIGHT) += rockchip_drm_backlight.o
obj-$(CONFIG_DRM_ROCKCHIP) += rockchip_vop_reg.o rockchipdrm.o
obj-$(CONFIG_ROCKCHIP_DRM_TVE) += rockchip_drm_tve.o
obj-$(CONFIG_ROCKCHIP_RK3066_HDMI) += rk3066_hdmi.o
obj-$(CONFIG_DRM_ROCKCHIP_RK618) += rk618/
4.arch/arm64/configs/rockchip_linux_defconfigrockchip_linux_defconfig
文件在内核开始编译时会生成.config文件,在该文件中定义的宏,配合2和3进行编译。例:CONFIG_DRM=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_DMA_SYNC=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_DW_HDMI=y
注:使用其它SOC厂商的DRM驱动时,3和4选择对应SOC厂商目录下的Makefile、Kconfig和*_defcofig。
B.小知识点:
在defconfig文件中,配置宏的值只有y和m。如果不定义配置宏,使用# CONFIG_* is not set。
前文中提到:Linux DRM包括: DRM core和DRM Driver。DRM core提供基础框架,为不同SOC DRM driver提供注册接口,同时也给用户态提供一个硬件无关的ioctl调用。DRM driver实现硬件相关部分,负责硬件相关的ioctl调用。下篇文章开始介绍RK3399 DRM driver。
注:本文仅在简书、OSCHINA和今日头条发布过,转载请标注原作者和链接。
相关推荐
- PC也能装MAX OS X
-
MACBOOK向来以其时尚的外观以及易用的OSX操作系统成为了时(zhuang)尚(bi)人士的最爱。但是其动不动就上万元的昂贵价格,也将一批立志时(zhuang)尚(bi)人士的拒之门外。但是最近...
- 一千多元的笔记本能买吗?英特尔11代+大屏幕,豆小谷值得选吗?
-
前言:有很多粉丝都问过本人,一千多元到底能买到什么样的笔记本?在此笔者只想说,这样的资金预算真的太低了!如果想买全新的,那大概率买的就是性能比较拉垮的上网本,比如搭载英特赛扬N系列、J系列处理器的轻薄...
- 首款配备骁龙X Elite处理器的Linux笔记本:采用KDE Plasma桌面环境
-
德国Linux硬件供应商TUXEDOComputers宣布正在开发一款配备高通骁龙XElite处理器(SnapdragonXEliteSoC)的ARM笔记本电脑,内部将该...
- System76推出Gazelle Linux笔记本:配酷睿i9-13900H处理器
-
IT之家3月30日消息,主打Linux硬件的厂商System76于今天发布了新一代Gazelle笔记本电脑,共有15英寸和17英寸两个版本,将于3月30日接受预订,...
- Kubuntu Focus Xe Gen 2笔记本发布,预装Linux系统
-
IT之家3月25日消息,KubuntuFocusXeGen2笔记本于近日发布,这是一款预装Kubuntu22.04LTSGNU/Linux发行版的轻薄本。上一代Kub...
- 这台Linux笔记本已用上英特尔12代酷睿,最高可选i7-1255U、卖1149美元起
-
Linux笔记本可能因为比较小众,一般都是拿Windows笔记本换个系统而来,硬件上也会落后同期Windows笔记本一两代,不过现在专门做Linux电脑的System76,推出了一款名为LemurP...
- 戴尔Inspiron 14 Plus骁龙笔记本迎新补丁,支持启动Linux
-
IT之家4月25日消息,科技媒体phoronix今天(4月25日)发布博文,报道称最新发布的Linux内核补丁,针对骁龙芯片的戴尔Inspiron14Plus笔记本,让其...
- TUXEDO推出InfinityFlex 14二合一Linux笔记本,配i5-1335U
-
IT之家8月12日消息,Linux硬件企业TUXEDO当地时间本月2日推出了InfinityFlex14二合一Linux笔记本。该笔记本搭载2+8核的英特尔酷睿i5-...
- 登月探测器嫦娥使用什么操作系统,是Linux还是其它自主研发?
-
这是不是国家机密啊。事实什么样的不知道,但是从美国的探测器来看,就算不是也是相似的东西。下面我来说说我知道的。龙芯已经随北斗卫星上天了.就算登月探测器嫦娥是用"龙芯+Linux"也不出奇.没必要...
- DNS分离解析实验
-
如果本文对你有帮助,欢迎关注、点赞、收藏、转发给朋友,让我有持续创作的动力目录一、分离解析概述二、实验需求三、实验步骤3.1双网卡服务器配置3.1.1添加两张网卡(内外网)3.1.2对两个网卡进...
- 一个小实验巩固下进程管理
-
先回顾下之前的三篇文章:Linux进程在内核眼中是什么样子的?Linux进程线程是如何创建的?Linux是如何调度进程的?通过这三篇文章的学习我们知道,无论内核进程还是用户进程,都是可以用task...
- VMware Kali无线WIFI密码破解
-
WIFI破解前准备工作一张支持Kali系统监听的无线网卡VMware虚拟机安装好Kali系统(本实验用的是Kali2022版本)Kali系统下载、安装官方网站:https://www.kali.or...
- python多进程编程
-
forkwindows中是没有fork函数的,一开始直接在Windows中测试,直接报错importosimporttimeret=os.fork()ifret==0:...
- 拔电源十台电脑藏后门!德国实验惊曝Windows致命漏洞
-
2025年4月15日,央视突然曝出一个超级大新闻!原来美国国家安全局通过黑龙江,往微软Windows系统里发送加密信息,激活了系统里藏着的后门程序,想破坏哈尔滨亚冬会!这消息一出来,大家才发现,竟然已...
- 深度探索RK3568嵌入式教学平台实战案例:设备驱动开发实验
-
一、产品简介TL3568-PlusTEB人工智能实验箱国产高性能处理器64位4核低功耗2.0GHz超高主频1T超高算力NPU兼容鸿蒙等国产操作系统二、实验目的1、熟悉基本字符设备的驱动程序...
- 一周热门
- 最近发表
-
- PC也能装MAX OS X
- 一千多元的笔记本能买吗?英特尔11代+大屏幕,豆小谷值得选吗?
- 首款配备骁龙X Elite处理器的Linux笔记本:采用KDE Plasma桌面环境
- System76推出Gazelle Linux笔记本:配酷睿i9-13900H处理器
- Kubuntu Focus Xe Gen 2笔记本发布,预装Linux系统
- 这台Linux笔记本已用上英特尔12代酷睿,最高可选i7-1255U、卖1149美元起
- 戴尔Inspiron 14 Plus骁龙笔记本迎新补丁,支持启动Linux
- TUXEDO推出InfinityFlex 14二合一Linux笔记本,配i5-1335U
- 登月探测器嫦娥使用什么操作系统,是Linux还是其它自主研发?
- DNS分离解析实验
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux mac (32)
- linux ip地址 (34)