module_param:显示十六进制而不是十进制的值

时间:2016-03-03 19:59:58

标签: linux-kernel linux-device-driver embedded-linux

读取时是否可以显示module_param的值,以十六进制显示?

我的linux设备驱动程序中有这段代码:

module_param(num_in_hex, ulong, 0644)

$cat /sys/module/my_module/parameters/num_in_hex
1234512345

希望以十六进制显示该值,而不是十进制。或者,我应该使用不同的方法,如debugfs吗?

1 个答案:

答案 0 :(得分:1)

没有就绪参数typemodule_param宏的第二个参数),它将其参数输出为十六进制。但要实现它并不困难。

模块参数由回调函数驱动,回调函数从字符串中提取参数的值,并将参数的值写入字符串。

// Set hexadecimal parameter
int param_set_hex(const char *val, const struct kernel_param *kp)
{
    return kstrtoul(val, 16, (unsigned long*)kp->arg);
}
// Read hexadecimal parameter
int param_get_hex(char *buffer, const struct kernel_param *kp)
{
    return scnprintf(buffer, PAGE_SIZE, "%lx", *((unsigned long*)kp->arg));
}

// Combine operations together
const struct kernel_param_ops param_ops_hex = {
    .set = param_set_hex,
    .get = param_get_hex
}; 

/*
 * Macro for check type of variable, passed to `module_param`.
 * Just reuse already existed macro for `ulong` type.
 */
#define param_check_hex(name, p) param_check_ulong(name, p)

// Everything is ready for use `module_param` with new type.
module_param(num_in_hex, hex, 0644);

检查include/linux/moduleparam.h实现module_param宏和kernel/params.c以实现现成类型的操作(宏STANDARD_PARAM_DEF)。