2012-02-03 2 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/아치/ARM/마하 omap2/mux.h에 선언된다. 그래서 그것을 소스 파일에 포함시킵니다.

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

내가 컴파일받을 수 있지만이 경고한다 :

경고 : "omap_mux_set_gpio은"[/home/me/projects/tld.ko] 정의되지!

내가 insmod 명령을 실행하면 dmesg 명령에 오류가 :

TLD : 알 수없는 기호 omap_mux_set_gpio (ERR 0)

내가들이받은하여 커널 기호 목록을 확인했다 :

고양이/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 : 제 경험상, 커널에 내장 된 .c 파일의 심볼에 EXPORT_SYMBOL을 적용해야합니다. –

관련 문제