我正在编写一个内核模块来操作GPIO。在初始化时,模块需要更改GPIO的多路复用。加载内核模块时出现未知符号,但符号在内核中导出
[tld.c]
#include <mach-omap2/mux.h>
。 。 。
int open_gpio(void){
int result;
result = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios));
if(result != 0) {
printk("tld: cannot request gpio ports\n");
}
result = gpio_direction_output(LED_LE_PIN, 0);
omap_mux_set_gpio(OMAP_MUX_MODE7, LED_LE_PIN);
if(result != 0) {
printk("tld: cannot change GPIO muplex.\n");
gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios));
}
return result;
}
static int tld_init(void) {
.
.
/* open gpio ports */
result = open_gpio();
.
.
}
.
module_init(tld_init);
.
功能omap_mux_set_gpio()在Kernel_Source /拱/臂/马赫 - OMAP2/mux.h声明。所以我把它包含在源文件中。
Makefile也是自定义的。
[Makefile文件]
CONFIG_CROSS_COMPILE =
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH ?= arm
SOURCE_DIR ?= /home/me/kerner_source
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
obj-m += tld.o
ccflags-y += -I$(SOURCE_DIR)/arch/arm
all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(SOURCE_DIR) M=$(PWD) modules
clean:
rm *.o *.ko *.mod.*
我可以把它编译但有警告:
警告:[/home/me/projects/tld.ko]未定义 “omap_mux_set_gpio”!
当我运行insmod的,有错误的dmesg:
TLD:未知符号omap_mux_set_gpio(ERR 0)
我已经乳宁检查内核符号列表:
猫/ proc/kallsyms | grep omap_mux_set_gpio
确实存在名为omap_mux_set_gpio的函数。
我想我包括头文件的方式可能是导致问题。 mux.h属于内核本身,但我把它当作外部处理。
什么是正确的方法来做到这一点?
非常感谢。
sharth:我做了一个搜索,看起来omap_mux_set_gpio没有标记为EXPORT_SYMBOL。但它出现在内核符号列表中。如果这是原因。我能做些什么呢? – yiqi 2012-02-03 17:16:34
@yiqi:根据我的经验,您需要将EXPORT_SYMBOL应用于构建到内核中的.c文件中的该符号。 – 2012-02-03 17:31:41