1. MODULE_DEVICE_TABLE (usb, skel_table);
该宏生成一个名为__mod_pci_device_table的局部变量,该变量指向第二个参数。内核构建时,depmod程序会在所有模块中搜索符号__mod_pci_device_table,把数据(设备列表)从模块中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/modules.pcimap中,当depmod结束之后,所有的PCI设备连同他们的模块名字都被该文件列出。当内核告知热插拔系统一个新的PCI设备被发现时,热插拔系统使用modules.pcimap文件来找寻恰当的驱动程序。

MODULE_DEVICE_TABLE的第一个参数是设备的类型,如果是USB设备,那自然是usb(如果是PCI设备,那将是pci,这两个子系统用同一个宏来注册所支持的设备)。后面一个参数是设备表,这个设备表的最后一个元素是空的,用于标识结束。例:假如代码定义了USB_SKEL_VENDOR_ID是 0xfff0,USB_SKEL_PRODUCT_ID是0xfff0,也就是说,当有一个设备接到集线器时,usb子系统就会检查这个设备的 vendor ID和product ID,如果他们的值是0xfff0时,那么子系统就会调用这个模块作为设备的驱动。

1、MODULE_DEVICE_TABLE(mdio, realtek_tbl);
    该宏定义在文件中,原型为:

点击(此处)折叠或打开

  1. #define MODULE_GENERIC_TABLE(gtype,name)            \
  2. extern const struct gtype##_id __mod_##gtype##_table        \
  3. __attribute__ ((unused, alias(__stringify(name))))
  4. #define MODULE_DEVICE_TABLE(type,name)        \
  5. MODULE_GENERIC_TABLE(type##_device,name)

生成一个名为__mod_mdio_device_id_table,内核构建时,depmod程序会在所有模块中搜索符号__mod_mdio_device_id_table,把数据(设备列表)从模块中抽出,添加到映射文件 /lib/modules/KERNEL_VERSION/modules.pcimap 中,当depmod结束之后,所有的MDIO设备连同他们的模块名字都被该文件列出。在需要驱动的时候,由modules.pcimap文件来找寻恰当的驱动程序。
    MODULE_DEVICE_TABLE的第一个参数是设备的类型,如果是PHY设备,那自然是MDIO(如果是PCI设备,那将是pci,这两个子系统用同一个宏来注册所支持的设备)。后面一个参数是设备表,这个设备表的最后一个元素是空的,用于标识结束。ex:

点击(此处)折叠或打开

  1. static struct mdio_device_id __maybe_unused realtek_tbl[] = {
  2. { 0x001cc912, 0x001fffff },
  3. { }
  4. };

2、其他相关宏的定义

这些宏定义在下
1)MODULE_AUTHOR(name) 定义驱动的编程者,name为string
2)MODULE_LICENSE(license) 定义驱动的license,一般为GPL,或相关公司的license
3)MODULE_DESCRIPTION(desc) 对驱动程序的描述,string
4)MODULE_SUPPORTED_DEVICE(name) 驱动程序所支持的设备,string
5)MODULE_PARM(var,type),提供在运行时通过控制台将参数传递给模块(在insmod时)。如果我们想用这个宏来传递命令行参数,那么在我们的模块中定义一个全局变量。在insmod模块时,便可以用参数的形式,将具体的实参传递给模块中的那个全局变量。MODULE_PARM(name,type)有两个参数,一个是这个全局变量的名称,另一个是这个全局变量的类型。而他的类型有以下几种:
    b:比特型
    h:短整型
    i:整型
    l:长整型
    s:字符串型
在传递字符串型的参数时,这个全局变量需要在模块中用Char *来声明!insmod会自动为其分配内存空间。
例如:

点击(此处)折叠或打开

  1. int a = 3;
  2. char *st;
  3. MODULE_PARM(a,”i”);
  4. MODULE_PARM(st,”s”);

在insmod是我们加这样的参数:

点击(此处)折叠或打开

  1. insmode a.o “a = 3″, “st = hello world”

这里最重要的是,MODULE_PARM()也支持我们最常用的数组类型。用短线‘-’把两个数字分开,分别表示数组参数中的最小位数和最大位数。例如:

点击(此处)折叠或打开

  1. int array[8];
  2. MODULE_PARM(array,”1-8i”);

在命令行我们使用加这样的参数:

点击(此处)折叠或打开

  1. insmod a.o “array = 38745,123,4000″

在那些模块编程时,我们往往给这些全局变量以默认值,如果我们才insmod时没有传入参数时,模块会使用这些默认值,而如果我们传入参数时,这些默认值便被覆盖掉。
6)MODULE_PARM_DESC(var,desc) 对变量的描述
7)GPL_HEADER()
8)THIS_MODULE 指向全局变量 __this_module (struct module)的指针。
9)系统对每个模块维护一个usage counter,以便决定何时可以安全的卸载模块。
    下面的宏用来对该usage counter操作,usage counter可以通过/proc/modules文件查看
    MOD_INC_USE_COUNT
    MOD_DEC_USE_COUNT
    MOD_IN_USE
    MODULE_DEVICE_TABLE
10)EXPORT_SYMTAB 预处理宏,当在程序中用EXPORT_SYMBOL等宏时需要定义该宏。例如,可以在Makefile中定义:-DEXPORT_SYMTAB
__EXPORT_SYMBOL(sym,str)
EXPORT_SYMBOL(var)
11)EXPORT_SYMBOL_NOVERS(var) 导出一个符合到内核符号表,导出后,该符合可以供其他模块使用。这个宏有助于编写驱动程序时清楚的划分出层次。可以通过/proc/ksyms文件或ksyms命令查看内核符号表。EXPORT_SYMBOL_NOVERS(var),导出是不带版本信息。在使用该宏时,需定义 EXPORT_SYMBOL_GPL(var)
12)EXPORT_NO_SYMBOLS 显示指出,该模块不向内核符合表导出符号
13)SET_MODULE_OWNER

MODULE_DEVICE_TABLE宏的作用相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )

    文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...

  2. 空的宏定义作用及常见用法

    空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...

  3. Linux字符设备驱动中container_of宏的作用

    Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...

  4. 关于QT_BEGIN_NAMESPACE宏的作用

    最近注意到QT_BEGIN_NAMESPACE宏,具体如下: #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H#include <QWidget&g ...

  5. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数

    文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...

  6. C++ DISALLOW_COPY_AND_ASSIGN宏的作用

    有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义. 因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进 ...

  7. LINUX C编程中_REENTRANT宏的作用

    在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享.在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变.类似的问题还存在于fputs之类的函数中,这些函 ...

  8. c语言宏替换作用,C语言中,宏替换的替换规则

    简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种.复杂的请看下面,讲的很全. 下面的带参宏定义,多行宏定义,在Linux内核源码中很多.另外si ...

  9. Cocos2d-x中常用宏的作用

    1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...

  10. 【驱动】以太网扫盲(三)PHY的控制器驱动框架分析

    1. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII/XGMII等多种媒体独立接口(介质无关接口)与数据链路层的MAC芯片相连,并 ...

最新文章

  1. MySQL:表的操作 知识点难点总结:表完整性约束及其他常用知识点二次总结
  2. 用人工智能打击人工智能
  3. python中x=x+1的读法-python中xrange和range的区别
  4. JUC锁-互斥锁ReentrantLock(二)
  5. pat 乙级 1011 A+B 和 C(C++)
  6. java 怎么调用js代码_在Java中直接调用js代码
  7. 用Python解压tgz文件
  8. logstash过滤器插件filter详解及实例
  9. asp.net GridView手写事件,包括取主键、取值、更新、选择、删除
  10. 积分上下限无穷_数分笔记——5种广义积分敛散性的基本方法
  11. SpringBoot蓝天幼儿园管理系统
  12. 《软件质量保证与测试》读书笔记(一)
  13. 安全防御(四)--- 恶意软件及其特征、分类、免杀技术,反病毒技术,反病毒网关工作过程及其配置
  14. obj[key].obj['key'],obj.key的区别
  15. vue和element框架搭配实现导航条跳转,点击按钮跳转页面导航条也跟着变换
  16. 春季养生食谱 灵芝孢子粉牛排汤补中益气
  17. 【转载】ADB命令使用大全
  18. CSDN的markdown编辑器使用(含表格背景色、文本颜色字体字号、锚点跳转、表情符号等)
  19. 快速梳理23种常用的设计模式
  20. SSM+高新区产业与孵化企业管理 毕业设计-附源码140940

热门文章

  1. 洛阳最新打卡地--洛阳新都汇购物公园变样啦
  2. [动态规划-0] 前言-我的动态规划学习之路
  3. linux 下的无线网络配置,详解在LINUX环境下怎样设置无线网络配置
  4. 微信Python自动回复代码
  5. qq空间不能访问解决方法
  6. 擦窗机器人毕业设计_家用擦玻璃清洁机器人结构设计毕业设计说明方案.doc
  7. 支付宝快捷支付接入问题
  8. java将图片转化为base64码
  9. 实现memcmp函数
  10. PSP实机用虚拟机wifi网卡联机