2012-02-03 20 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もカスタマイズされています。

[Makeファイル]

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.* 

私はそれがコンパイルされ得ることができますが、そこに警告している:

WARNING: "omap_mux_set_gpioは" [/home/me/projects/tld.ko]未定義を!

私はinsmodのを実行すると、エラーがdmesgの中にあります:

TLD:

猫:不明なシンボルomap_mux_set_gpio(ERR 0)

私はruningて、カーネルのシンボルリストをチェックしています/ proc/kallsyms | grep omap_mux_set_gpio

omap_mux_set_gpioという関数が存在します。

私はおそらく問題を引き起こしているヘッダーファイルを含める方法だと思います。 mux.hはカーネル自体に属しますが、私はそれを外部のもののように扱います。

これは正しい方法ですか?

ありがとうございました。

答えて

1

シンボルにEXPORT_SYMBOLまたはEXPORT_SYMBOL_GPLとマークされていない場合、カーネルモジュールでは使用できません。このシンボルはそのようにマークされていないようです。

+0

sharth:私は検索を行い、omap_mux_set_gpioがEXPORT_SYMBOLとしてマークされていないようです。しかし、それはカーネルシンボルリストに現れます。それが理由なら。それについて私は何ができますか? – yiqi

+0

@ yiqi:私の経験上、EXPORT_SYMBOLをカーネルに組み込まれた.cファイルのそのシンボルに適用する必要があります。 –

関連する問題