zoukankan      html  css  js  c++  java
  • linux内核中把自己写的驱动添加到make menuconfig

    linux驱动调试的时候,可以自己写的驱动作为modules  ,然后手动加载到内核  ,但是最终为了方便,还是需要把写好的驱动添加到内核的meke menuconfig里面,这里记录一个很有用的比较详细的文档。

    linux内核中Kconfig文档的作用


    2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。

    上面的内容说明:Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。

    因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)

    *Kconfig
    *Makefile

    要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

    First:   Kconfig


     

    每个菜单项都有一个关键字标识,最常见的就是config。

    语法:
    config symbol

    options


    symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项

    其中options部分有:

    1、类型定义:


      每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型

    例如config HELLO_MODULE
    bool "hello test module"

    bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.

    2、依赖型定义depends on或requires
    指此菜单的出现是否依赖于另一个定义

    config HELLO_MODULE
    bool "hello test module"
    depends on ARCH_PXA
        这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA, 该菜单才可见(可配置)。

    3、帮助性定义
    只是增加帮助用关键字help或---help---


    更多详细的Kconfigconfig语法可参考:


    Second:  内核的Makefile

    内核的Makefile分为5个组成部分:
    Makefile     最顶层的Makefile
    .config        内核的当前配置文档,编译时成为顶层Makefile的一部分
    arch/$(ARCH)/Makefile 和体系结构相关的Makefile
    s/ Makefile.*    一些Makefile的通用规则
    kbuild Makefile      各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。

    顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。

    (其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)


    在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。

    最后举个例子:
    假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:

    第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。

    第二:修改/driver/mtd/maps目录下的kconfig文档:
    config MTD_flashtest
    tristate “ap71 flash"

    这样当make menuconfig时 ,将会出现 ap71 flash选项。

    第三:修改该目录下makefile文档。
    添加如下内容:obj-$(CONFIG_MTD_flashtest)    += flashtest.o

    这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。该选择就会保存在.config文档中。当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。

    参考    https://blog.csdn.net/aaronychen/article/details/2946740

  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/ChenChangXiong/p/11211420.html
Copyright © 2011-2022 走看看