根据客户的驱动程序生成ko档案步骤,在内核树形结构中添加自己的驱动模块

如果客户需要实现某一个功能,自己写驱动程序,他们希望能单独编译他们的驱动程序,然后动态的insmod 和 rmmod,插入内核和从内核卸掉掉对应的ko档。

步骤如下(拿hello_world_ko举例):

1、    先把我们的release.tgz解压开,然后在sys build目录下面,保证build过一次,这样会在内核根目录下面生成相关的配置文件.config 文件,其实内核该导入哪些配置.所以以后我们要裁剪内核,比如要让平台支持游戏杆,就要让CONFIG_INPUT_JOYSTICK=y 或者 CONFIG_INPUT_JOYSTICK=m,前者表示编译进内核,后者表示编译成模块,即ko档。

2、    在 dtv_linux/mak/customer.mak 最后一行, 加入include $(DTVLINUX)/mak/hello_world_ko.mak (hello_world_ko 换成他们的 ko name 即可)


3、    在  dtv_linux/mak/ 加入一个 hello_world_ko.mak ,内容如下:

THIRD_PARTY_ROOT = $(LINUX_ROOT)/third_party/source

hello_world_ko:
        $(MAKE) -C $(THIRD_PARTY_ROOT)/$@  O=$(O)

clean_hello_world_ko:
        $(MAKE) -C $(THIRD_PARTY_ROOT)/$(subst clean_,,$@) clean O=$(O)

4、    请注意 dtv_linux/mak/customer.mak 需有以下的宣告
ifndef O
export O = $(KERNEL_OBJ_ROOT)/$(KERNEL_VER)/$(KERNEL_CONFIG)
endif

5、    把 他們 Ko 的 source code, 放入以下地方  third_party/source/hello_world_ko/ ,另外需要自己写个makefile,内容如下:
 

6、    等所有的东西完成后,再到sysbuild底下,做make hello_world_ko 即可产生相应的ko档了。


另外,如果需要添加某个驱动到内核中去,自己执行make menuconfig来在图形界面上来动态的选择内核配置, 
 

然后能在图形界面上直接选择是否将某个驱动模块编译进内核就很方便,步骤如下:

假设我们要在内核源代码 drivers 目录下如下用于 test driver 的树型目录:
|----test
      |---- cpu
      |---- cpu.c
      |---- test.c
      |---- test_client.c
      |---- test_ioctl.c
      |---- test_proc.c
      |---- test_queue.c

在内核中增加目录和子目录,我们需为相应的新增目录创建 Kconfig 和 Makefile 文件,而新增目录的父目录中的 Kconfig 和 Makefile 文件也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用.
在新增的 test 目录下,应包含如下 Kconfig 文件:
#
# TEST driver configuration
#
menu "Test Driver "
comment "Test Driver"
config TEST
 bool "TEST suport" 
config TEST_USER
 tristate "TEST user-space interface"
 depends on TEST 
endmenu

由于 TEST driver 对于内核来说是新的功能,所以首先需要创建一个菜单 TEST Driver ;然后显示 "TEST  support " ,等待用户选择;接下来判断用户是否选择了 TEST Driver ,如果是 (CONFIG_TEST=y),则进一步显示子功能:用户接口与CPU功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate.
为了使这个 Kconfig 文件能起作用,需要修改 drivers/Kconfig 文件,增加以下内容:
source "drivers/test/Kconfig" 
脚本中的 source 意味着引用新的 Kconfig 文件.在新增的 test 目录下,应该包含如下 Makefile 文件:
#drivers/test/Makefile
#
#Makefile for the TEST
#
obj-$(CONFIG_TEST) += test.o test_queue.o test_client.o
obj-$(CONFIG_TEST_USER) += test_ioctl.o
obj-$(CONFIG_PROC_FS) += test_proc.o 
obj-$(CONFIG_TEST_CPU) += cpu/

该脚本根据配置变量的取值构建 obj-* 列表.由于 test 目录中包含一个子目录 cpu ,当CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表.
test 目录中的 cpu 目录也需包含如下的 Makefile 文件:
# drivers/test/cpu/Makefile
#
# Makefile for the TEST cpu
#
obj-$(CONFIG_TEST_CPU) += cpu.o 
为了使得整个 test 目录能够被编译命令作用到,  test 目录父目录中的 Makefile 文件也需新增如下脚本:
obj-$(CONFIG_TEST) += test/
增加了 Kconfig 和 Makefile 文件之后的新的 test 树型目录如下所示:
|----test
      |---- cpu
      |---- cpu.c
      |---- Makefile
      |---- test.c
      |---- test_client.c
      |---- test_ioctl.c
      |---- test_proc.c
      |---- test_queue.c
      |---- Makefile
      |---- Kconfig 
  
这样整个工作就算完成了。


以后如果大家碰到类似问题,希望对大家用帮助。有错误请指正,多谢!
 

猜你喜欢

转载自blog.csdn.net/u011961033/article/details/83027403