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는 커널 자체에 속하지만 외부의 것처럼 취급합니다.
옳은 방법은 무엇입니까?
대단히 감사합니다.
sharth : 검색을 수행하면 omap_mux_set_gpio가 EXPORT_SYMBOL로 표시되지 않은 것으로 보입니다. 그러나 커널 심볼 목록에 나타납니다. 그 이유가 있다면. 그것에 대해 무엇을 할 수 있습니까? – yiqi
@yiqi : 제 경험상, 커널에 내장 된 .c 파일의 심볼에 EXPORT_SYMBOL을 적용해야합니다. –