一、Linux Module参数传递
在C 语言中,可以在main函数利用argc、argv获取用户的输入,Linux驱动同样可以传递参数,下面简要介绍参数宏的使用方法
利用下面宏定义的参数可以在下面路径找到
/sys/module/xxxxx/parameters/
1、module_param()
#define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
name:参数名
type:参数类型
(1)布尔类型:bool,invbool;
(2)字符指针类型:charp;
(3)基本整型类型:int,long,short,uint,ulong,ushort。
perm:参数权限掩码:RWX
2、module_param_array()
用于声明以","分隔的数组类型参数
#define module_param_array(name, type, nump, perm) \
module_param_array_named(name, name, type, nump, perm)
3、module_param_cb()
用于注册一个回调函数,当参数值改变时会被调用(例如echo新参数到sysfs),最常见的应用场景就是在模块运行期间动态修改其配置
#define module_param_cb(name, ops, arg, perm) \
__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0)
name:参数名称
ops:一个回调函数,用于set/get
arg:参数的实际值
perm:参数访问权限,用于确认参数读写性质
module_param_cb()接收一个 struct kernel_param_ops类型的参数作为模块参数的回调函数
struct kernel_param_ops {
/* How the ops should behave */
unsigned int flags;
/* Returns 0, or -errno. arg is in kp->arg. */
int (*set)(const char *val, const struct kernel_param *kp);
/* Returns length written or -errno. Buffer is 4k (ie. be short!) */
int (*get)(char *buffer, const struct kernel_param *kp);
/* Optional function to free kp->arg when module unloaded. */
void (*free)(void *arg);
};
二、应用示例
下面只列举 module_param_cb() 的示例,其他在参考博客[2]中查看
static bool use_mcq_mode = true;
static bool is_mcq_supported(struct ufs_hba *hba)
{
return hba->mcq_sup && use_mcq_mode;
}
static int param_set_mcq_mode(const char *val, const struct kernel_param *kp)
{
int ret;
ret = param_set_bool(val, kp);
if (ret)
return ret;
return 0;
}
static const struct kernel_param_ops mcq_mode_ops = {
.set = param_set_mcq_mode,
.get = param_get_bool,
};
module_param_cb(use_mcq_mode, &mcq_mode_ops, &use_mcq_mode, 0644);
MODULE_PARM_DESC(use_mcq_mode, "Control MCQ mode for controllers starting from UFSHCI 4.0. 1 - enable MCQ, 0 - disable MCQ. MCQ is enabled by default");
例如,在上述示例中,use_mcq_mode是参数值,可以通过下面sysfs改变,从而使is_mcq_supported()的结果可以动态变化
在echo时,就会调用mcq_mode_ops中的set回调,即param_set_mcq_mode()函数,在这里调用标准的 param_set_bool() 函数对参数进行设置,可以在这之前加入一些判断,类似的方法还有 param_set_uint() 等;在cat时,就会调用get回调,即param_get_bool()函数,获取参数值
#:/sys/module/ufshcd_core/parameters # cat use_mcq_mode
Y
#:/sys/module/ufshcd_core/parameters # echo 0 > use_mcq_mode
#:/sys/module/ufshcd_core/parameters # cat use_mcq_mode
N
【参考博客】