• 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...}







  • 相关阅读:
    Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
    Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
    Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
    Civil 3D 二次开发 新建CLR项目出现错误C2143
    Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
    了解AutoCAD对象层次结构 —— 6 ——块表记录
    datepicker97使用
    使用angular 外接 templateUrl,使用ng-include
    angularJs 遮罩
    网上找的有关css兼容问题
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/7453981.html
Copyright © 2020-2023  润新知