2012-02-03 55 views
1

我正在編寫一個內核模塊來操作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屬於內核本身,但我把它當作外部處理。

什麼是正確的方法來做到這一點?

非常感謝。

回答

1

如果符號未標記爲EXPORT_SYMBOLEXPORT_SYMBOL_GPL,則不能在內核模塊中使用它。這個符號似乎沒有以這種方式標記。

+0

sharth:我做了一個搜索,看起來omap_mux_set_gpio沒有標記爲EXPORT_SYMBOL。但它出現在內核符號列表中。如果這是原因。我能做些什麼呢? – yiqi 2012-02-03 17:16:34

+0

@yiqi:根據我的經驗,您需要將EXPORT_SYMBOL應用於構建到內核中的.c文件中的該符號。 – 2012-02-03 17:31:41

相關問題