zoukankan      html  css  js  c++  java
  • Linux驱动中常用的宏

    1.module_i2c_driver(adxl34x_driver)展开为
    
    static int __int adxl34x_driver_init(void)
    {
    return i2c_register_driver(&adxl34x_driver);
    }
    module_init(adxl34x_driver_init);
    static void __exit adxl34x_driver_exit(void)
    {
    return i2c_del_driver(&adxl34x_driver);
    }
    module_exit(adxl34x_driver_exit);
    作用:代替注册初始化函数和module_init()和module_exit(),如果在初始化函数中什么也不做的话就可以用此来替换。

    2.module_platform_driver作用是当在module_init/module_exit中不做其它任何事的时候使用
    module_platform_driver(gpio_led_driver);展开后:

      static int __init gpio_led_driver_init(void)
      {
        return platform_driver_register(&gpio_led_driver);
      }
      module_init(gpio_led_driver_init);
      static void __exit gpio_led_driver_exit(void)
      {
        platform_driver_unregister(&gpio_led_driver);
      }
      module_exit(gpio_led_driver_exit);

     

     3.MODULE_DEVICE_TABLE (usb, skel_table);

      在linux/module.h中定义为:#define MODULE_DEVICE_TABLE(usb, skel_table)  extern const typeof(name) __mod_##type##__##name##_device_table __attribute__ ((unused, alias(__stringify(name))))

      该宏生成一个名为__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时,那么子系统就会调用这个模块作为设备的驱动。

    3.IS_ERR():它就是判断返回的指针是否有错,如果指针并不是指向最后一个page,那么没有问题,申请成功了,如果指针指向了最后一个page,那么说明实际上这不是一个有效的指针,这个指针里保存的实际上是一种错误代码.而通常很常用的方法就是先用IS_ERR()来判断是否是错误,然后如果是,那么就调用PTR_ERR()来返回这个错误代码,也就是提供一个信息给调用者,如果你只需要知道是否出错,而不在乎因为什么而出错,那你当然不用调用PTR_ERR()了。

    4.LIST_HEAD LIST_HEAD_INIT

    LIST_HEAD(name) == struct list_head name = { &(name), &(name) }
    #define LIST_HEAD_INIT(name) { &(name), &(name) }
    #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)

    5.list_for_each_entry

    来自led_trigger_show():

    trig: 空闲变量指针
    trigger_list: 单链表的链表头
    next_trig: 构成链表的next指针成员
    list_for_each_entry(trig, &trigger_list, next_trig) {use trig...}







  • 相关阅读:
    一种不求交点确定直线与三角形是否相交的方法
    碰撞边界锯齿的平滑方法
    demo的凹凸贴图效果
    MySQL进阶篇触发器
    MySQL进阶篇索引
    Maven的POM文件详解
    Swagger
    MySQL进阶篇存储过程
    SpringBoot基础篇
    MySQL基础篇多表操作
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/7453981.html
Copyright © 2011-2022 走看看