高通DRM显示框架中panel_list在哪里定义
时间: 2024-03-08 17:50:55 浏览: 138
在高通DRM显示框架中,`panel_list`通常是作为`drm_panel`结构体的成员来定义的。这个结构体定义在`include/drm/drm_panel.h`头文件中。 `panel_list`是一个指向`drm_panel`结构体的指针,用于维护一个已注册面板的列表。在`drm_panel`结构体中,`panel_list`的定义如下:
```
struct drm_panel {
struct device dev;
const struct drm_display_mode *fixed_mode;
const struct drm_display_mode *cur_mode;
struct drm_panel_funcs *funcs;
struct drm_connector *connector;
struct list_head list_entry;
void *private;
struct backlight_device *backlight;
/* ... other members ... */
};
```
可以看到,`panel_list`是通过`list_head`结构体来实现的,这是一个双向链表结构,用于将多个`drm_panel`结构体链接在一起,形成一个已注册面板的列表。在面板注册和注销时,可以通过`list_add`和`list_del`等函数来添加和删除`panel_list`中的元素。
相关问题
高通的DRM显示框架中drm_of_find_panel_or_bridge怎么和设备树一起使用
在高通的DRM显示框架中,`drm_of_find_panel_or_bridge`函数的使用与标准的DRM框架类似,需要结合设备树进行操作。
在使用该函数之前,需要先加载设备树和相关的驱动模块,以及对应的显示控制器驱动。接着,可以使用`of_find_node_by_name`函数来获取设备树中与该显示控制器相关的节点,然后使用`of_find_device_by_node`函数获取该节点对应的设备对象。接下来,可以使用`drm_of_find_panel_or_bridge`函数来查找面板或桥接器节点,并将返回的指针转换成对应的结构体类型,以便后续操作。最后需要注意,在使用完相关的设备对象和结构体后,需要进行相应的释放操作,以免内存泄漏。
以下是一个简单的示例代码:
```c
// 加载设备树和相关的驱动模块
...
// 获取设备树节点对应的设备对象
struct device_node *node = of_find_node_by_name(NULL, "panel-node");
struct device *dev = of_find_device_by_node(node);
if (dev) {
// 查找面板或桥接器节点
struct drm_panel *panel = drm_of_find_panel_or_bridge(node);
if (panel) {
// 对面板进行相关操作
...
// 释放面板对象
drm_panel_detach(panel);
drm_panel_destroy(panel);
}
}
// 释放相关的设备对象和节点
if (dev)
put_device(dev);
of_node_put(node);
```
需要注意的是,具体的操作步骤和函数调用方式可能会因具体的驱动实现而有所不同。因此,在使用`drm_of_find_panel_or_bridge`函数前,建议先查看对应的驱动文档和示例代码,以便更好地理解和使用该函数。
高通的DRM显示框架drm_of_find_panel_or_bridge指定port参数为1,设备树应该怎么配置
在高通的 DRM 显示框架中,`drm_of_find_panel_or_bridge` 函数的 `port` 参数仍然表示要查找的设备节点的索引,但是它的用法可能会根据具体的驱动实现而有所不同。通常情况下,如果要查找的是第 1 个设备节点,那么在设备树中应该按照如下方式配置:
```
...
|
+-- disp {
| ...
| ports {
| port@0 {
| ...
| }
| port@1 {
| ...
| endpoint {
| remote-endpoint = <&panel_in>;
| };
| }
| ...
| };
| ...
| panel@0 {
| ...
| panel_in: endpoint {
| remote-endpoint = <&port_1>;
| };
| };
| ...
| }
...
```
其中,`disp` 节点是整个显示子系统的根节点,它下面包含了各种各样的子节点,比如显示端口(`ports`)、显示控制器(`controllers`)等等。在 `ports` 子节点下,可以配置各种不同的显示端口,比如 HDMI 端口、LVDS 端口等等。在这里,我们假设要查找的是第 1 个端口(即 `port@1`),它的 `endpoint` 子节点表示它的连接端点,这里通过 `remote-endpoint` 属性指定了它连接的是 `panel_in` 节点。
`panel_in` 节点表示显示设备的输入端点,它通过 `endpoint` 子节点的 `remote-endpoint` 属性指定了它连接的是 `port_1` 节点。这个 `port_1` 节点实际上就是 `port@1` 节点的别名,它定义了这个端口的一些属性,比如传输协议、分辨率等等。最终,通过 `drm_of_find_panel_or_bridge` 函数可以找到 `panel_in` 节点,从而对显示设备进行控制和配置。
阅读全文
相关推荐
















