드라이버 포함 파일을 Linux 폴더에 복사합니다.

드라이버 포함 파일을 Linux 폴더에 복사합니다.

내 임베디드 socfpga 시스템에 buildroot를 사용하고 있습니다. 다음과 같이 드라이버와 테스트용 애플리케이션을 성공적으로 작성했습니다.BR 사용 설명서:

  • my_driver_dma: 드라이버
  • my_dma: 신청

내가 겪고 있는 문제는 개인 드라이버 기능을 사용하려면 "my_dma.c"에 "my_driver_dma.h"를 포함해야 한다는 것입니다.

"my_driver_dma.h" 파일을 자동으로 찾는 방법을 찾지 못했습니다. 컴파일하고 테스트 목적으로 "my_dma" 폴더에 복사했지만 이는 신뢰할 수 없습니다.

"/build/linux-socfga-4.16/include/linux/" 폴더와 같은 곳에 포함 파일을 복사해야 한다고 가정하고 있지만 방법을 모르겠습니다.

my_dma 애플리케이션 소스 파일 "my_dma.c"의 포함 파일 "my_driver_dma.h"를 자동으로 보려면 파일에서 어떤 변경을 해야 합니까?

이것은 내 파일입니다:

my_apps/my_dma/Makefile
my_apps/my_dma/my_dma.c

my_drivers/my_driver_dma/Makefile
my_drivers/my_driver_dma/my_driver_dma.c
my_drivers/my_driver_dma/my_driver_dma.h

BR/package/my_apps/my_apps.mk
BR/package/my_apps/Config.in
BR/package/my_apps/my_dma/my_dma.mk
BR/package/my_apps/my_dma/Config_in

BR/package/my_drivers/my_drivers.mk
BR/package/my_drivers/Config.in
BR/package/my_drivers/my_driver_dma/my_driver_dma.mk
BR/package/my_drivers/my_driver_dma/Config_in

my_apps/my_dma/my_dma.c

#include <my_driver_dma.h>
[...]

my_apps/my_dma/Makefile

#
# sample Makefile for my_dma
#

SRC=my_dma.c
OBJ = my_dma.o
CFLAGS = -Wall -Wextra
TARGET=my_dma


# rules
all: $(TARGET)

$(TARGET): $(OBJ)
    $(CC) $^ -o $@

%.o: %.c
    $(CC) -c $(CFLAGS) $^ -o $@

.PHONY: clean
clean:
    rm -f $(OBJ)

install:
    cp my_dma $(DESTDIR)/bin/my_dma

my_drivers/my_driver_dma/Makefile

ifneq (${KERNELRELEASE},)

    obj-m  = my_driver_dma.o
else

    KERNELDIR        ?= /lib/modules/$(shell uname -r)/build
    MODULE_DIR       ?= $(shell pwd)
    ARCH             ?=
    CROSS_COMPILE    ?=
    INSTALL_MOD_PATH ?= /

all: modules

modules:
    export ARCH=$(ARCH)
    export CROSS_COMPILE=$(CROSS_COMPILE)
    ${MAKE}  -C ${KERNELDIR} SUBDIRS=${MODULE_DIR}  modules

modules_install:
    export ARCH=$(ARCH)
    export CROSS_COMPILE=$(CROSS_COMPILE)
    ${MAKE} INSTALL_MOD_PATH=${INSTALL_MOD_PATH} -C ${KERNELDIR} SUBDIRS=${MODULE_DIR}  modules_install

clean:
    rm -f *.o *.ko *.mod.c .*.o .*.ko .*.mod.c .*.cmd *~
    rm -f Module.symvers Module.markers modules.order
    rm -rf .tmp_versions
endif

BR/패키지/my_drivers/my_drivers.mk

include package/my_drivers/*/*.mk

BR/package/my_apps/my_apps.mk

include package/my_apps/*/*.mk

BR/패키지/my_apps/my_dma/my_dma.mk

MY_DMA_VERSION = 1.0.0
MY_DMA_SITE = $(TOPDIR)/my_apps/my_dma
MY_DMA_SITE_METHOD = local
MY_DMA_INSTALL_TARGET = YES
MY_DMA_INSTALL_STAGING = YES

define MY_DMA_BUILD_CMDS
    $(MAKE) CC="$(TARGET_CC)" -C $(@D) all 
endef

define MY_DMA_INSTALL_STAGING_CMDS
    $(MAKE) DESTDIR=$(STAGING_DIR) -C $(@D) install
endef

define MY_DMA_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/my_dma $(TARGET_DIR)/usr/bin/my_dma
endef

$(eval $(generic-package))

BR/패키지/my_drivers/my_driver_dma/my_driver_dma.mk

MY_DRIVER_DMA_VERSION = 1.0.0
MY_DRIVER_DMA_SITE = $(TOPDIR)/my_drivers/my_driver_dma
MY_DRIVER_DMA_SITE_METHOD = local
MY_DRIVER_DMA_DEPENDENCIES = linux

define MY_DRIVER_DMA_BUILD_CMDS
    $(MAKE) -C $(@D) $(LINUX_MAKE_FLAGS) KERNELDIR=$(LINUX_DIR) modules
endef

define MY_DRIVER_DMA_INSTALL_TARGET_CMDS
    $(MAKE) -C $(@D) $(LINUX_MAKE_FLAGS) KERNELDIR=$(LINUX_DIR) modules_install
endef

$(eval $(kernel-module))
$(eval $(generic-package))

답변1

빌드루트 makefile(.mk)의 설치 섹션에 다음을 추가하세요.

define MY_DRIVER_DMA_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 644 $(@D)/my_driver_dma.h $(LINUX_DIR)/include/my_driver_dma.h
endef

이렇게 하면 문제가 해결됩니다.

관련 정보