EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order)还是不能被其余函数引用
时间: 2023-09-14 09:15:21 浏览: 47
这个问题可能是因为在你的代码中没有正确导出该符号。在使用 EXPORT_SYMBOL_GPL 宏时,需要注意以下几点:
1. 确保该符号在模块的可访问性范围内。
2. 确保该符号被正确定义,包括正确的函数签名、返回值类型等。
3. 在 Makefile 中正确编写模块的链接规则,以确保模块能够正确链接并加载。
如果你已经确认了以上几点,仍然无法引用该符号,可以尝试以下几个解决方案:
1. 使用 EXPORT_SYMBOL 或 EXPORT_SYMBOL_GPL 代替 EXPORT_SYMBOL_GPL。
2. 确保你的内核版本支持该符号的导出。
3. 确保你的模块代码没有其他语法错误或逻辑错误。
如果以上几个解决方案都不能解决问题,建议你参考内核源代码中其他类似符号的导出方式,或者向内核社区寻求帮助。
相关问题
linux kernel 符合GPL协议的驱动文件怎么使用drm_of.c中定义的EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order);
EXPORT_SYMBOL_GPL是一个宏,用于将符号(symbol)暴露给其他模块使用。在Linux内核中,符号是指函数、变量或常量等。EXPORT_SYMBOL_GPL的作用是将符号标记为只能由GPL协议模块使用,这意味着只有使用GPL协议的模块才能使用该符号。
在使用EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order)之前,需要确保该符号已经被定义。在drm_of.c文件中,该符号已经被定义为一个函数。如果你想在其他GPL协议的模块中使用该函数,可以在模块代码中使用extern声明该符号,然后就可以像使用其他函数一样使用它了。例如:
```c
#include <linux/module.h>
#include <linux/drm/drmP.h>
extern int drm_of_lvds_get_dual_link_pixel_order(struct device_node *np);
static int my_module_init(void)
{
struct device_node *np;
int pixel_order;
/* 获取设备节点 */
np = of_find_node_by_name(NULL, "lvds");
if (!np) {
pr_err("Failed to find lvds node\n");
return -ENODEV;
}
/* 调用drm_of_lvds_get_dual_link_pixel_order函数 */
pixel_order = drm_of_lvds_get_dual_link_pixel_order(np);
pr_info("Dual link pixel order: %d\n", pixel_order);
/* 释放设备节点 */
of_node_put(np);
return 0;
}
static void my_module_exit(void)
{
/* 模块退出时的清理工作 */
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("My Linux kernel module");
```
linux kernel 在drm_of.c中定义了EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order);那其他符合GPL协议的驱动文件怎么调用drm_of_lvds_get_dual_link_pixel_order吗?
其他符合GPL协议的驱动文件可以通过在自己的驱动代码中包含头文件`<drm/drm_of.h>`来调用`drm_of_lvds_get_dual_link_pixel_order`函数。
使用方法如下:
1. 在驱动代码中包含头文件`<drm/drm_of.h>`:
```c
#include <drm/drm_of.h>
```
2. 在需要使用`drm_of_lvds_get_dual_link_pixel_order`函数的地方调用该函数即可。
```c
u32 order = drm_of_lvds_get_dual_link_pixel_order(dev->of_node);
```