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はカーネル自体に属しますが、私はそれを外部のもののように扱います。
これは正しい方法ですか?
ありがとうございました。
sharth:私は検索を行い、omap_mux_set_gpioがEXPORT_SYMBOLとしてマークされていないようです。しかし、それはカーネルシンボルリストに現れます。それが理由なら。それについて私は何ができますか? – yiqi
@ yiqi:私の経験上、EXPORT_SYMBOLをカーネルに組み込まれた.cファイルのそのシンボルに適用する必要があります。 –