linux驱动中宏__setup(str, fn)

(一). 定义如下:

#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)

#define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id[] __initdata __aligned(1) = str; \
static struct obs_kernel_param __setup_##unique_id \
__used __section(.init.setup) __attribute__((aligned((sizeof(long))))) = { __setup_str_##unique_id, fn, early }

struct obs_kernel_param {
    const char *str;
    int (*setup_func)(char *);
    int early;
};

(二). 例子:(来源于:net/core/dev.c)

__setup(“netdev=”, netdev_boot_setup)`

由(一)可转换为:

__setup_param("netdev=", netdev_boot_setup, netdev_boot_setup, 0)

=====>

#define __setup_param("netdev=", netdev_boot_setup, netdev_boot_setup, 0) \
static char __setup_str_netdev_boot_setup[] __initdata __aligned(1) = "netdev="; static struct obs_kernel_param __setup_unique_id __used __section(.init.setup) __attribute__((aligned((sizeof(long))))) = { __setup_str_unique_id, netdev_boot_setup, 0 }

__setup(str, fn)

str是关键字,fn是关联处理函数。__setup只是告诉内核在启动时输入串中含有str时,内核要去执行fn。str必须以“=”符结束以使parse_args更方便解析。紧随“=”后的任何文本都会作为输入传给 fn。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

继续拿__setup(“netdev=”, netdev_boot_setup)举例:

要实现netdev_boot_setup,哪它以什么样的形式出现呢?:

struct obs_kernel_param {
    const char *str;
    int (*setup_func)(char *);
    int early;
};

应以这样的形式去实现:

int netdev_boot_setup(char *str)
{
    ...

    retutn 0;
}

当内核启动解析参数时有“netdev”字符串时就会执行netdev_boot_setup函数并将“netdev=”后的字符串当做参数传入。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 19:34:15

linux驱动中宏__setup(str, fn)的相关文章

Linux驱动中completion接口浅析(wait_for_complete例子,很好)【转】

转自:http://blog.csdn.net/batoom/article/details/6298267 completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成.可以利用下面的宏静态创建completion:                         DECLARE_COMPLETION(my_completion); 如果运行时创建completion,则必须采用以下方法动态创建和初始化:                         struct com

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_driv

Linux驱动中的platform总线分析

copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver .Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示:驱动用 platform_driver 进行注册. linux_platform_driver 机制和传统的device_driver机

Linux驱动中获取系统时间

最近在做VoIP方面的驱动,总共有16个FXS口和FXO口依次初始化,耗用的时间较多.准备将其改为多线程,首先需要确定哪个环节消耗的时间多,这就需要获取系统时间. #include <linux/time.h> /*头文件*/ struct timeval time_now; unsigned long int time_num;//获取的时间 do_gettimeofday(&time_now); time_num = time_now.tv_sec*1000+time_now.tv

linux内核中经常用到的设备初始化宏

内核使用了大量不同的宏来标记具有不同作用的函数和数据结构.如宏__init.__devinit等.这些宏在include/linux/init.h头文件中定义.编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率. 下面是一些常用的宏: l  __init 标记内核启动时使用的初始化代码,内核启动完成后不再需要.以此标记的代码位于.init.text内存区域. 它的宏定义是这样的: #define __init __attribute__ ((__section__ (

Linux代码的重用与强行卸载Linux驱动

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动(静态重用) 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用 假

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

linux系统中misc子系统

misc子系统 转载请注明出处:http://blog.csdn.net/wang_zheng_kai 光源器件与系统研究所 个人学习总结 1.在linux系统中什么是misc? 在研究摄像头驱动的时候,发现摄像头驱动的路径为:/driver/misc/jz_cim/文件目录下,经过查找结果如下: 杂项设备(misc device) 杂项设备也是嵌入式系统中用得比较多的一种设备驱动.在 Linux 内核的include/linux目录下有miscdevice.h文件,要把自己定义的misc de

第八章:Linux代码重用、Linux驱动强行卸载

(一)Linux代码的重用 重用=静态重用(将要重用的代码放到其他的文件的头文件中声明)+动态重用(使用另外一个Linux驱动中的资源,例如函数.变量.宏等) 1.编译是由多个文件组成的Linux驱动,即静态重用 对于复杂的Linux驱动,需要使用多个源代码文件存放不同的功能代码,这样做有利于代码分类和管理,那么就不得不编译多个源代码文件,最终生成.ko文件或编译进Linux内核 下面,就举例介绍将3个.c文件分别编译为3个.o文件,并将这3个.o文件链接(link)成一个.ko文件——静态重用