Linux设备驱动开发之内核传参module_param函数

内核模块传参问题
	Standard types are:
		byte, short, ushort, int, uint, long, ulong 注意:没有char类型!!
		charp: a character pointer
		bool: a bool, values 0/1, y/n, Y/N.
		invbool: the above, only sense-reversed (N = true).  
	
module_param(name, type, perm)  
	功能:接收命令行传的参数
	参数:
		@name:变量名
		@type: 变量的类型
		@perm: 权限 0664 0775
		
MODULE_PARM_DESC(_parm, desc)
	功能:对命令行传递的参数进行描述
	参数:
		@_parm:变量
		@desc:描述的字符串
	
	安装驱动的时候传参:
		sudo insmod demo.ko light=80
		
	在运行的使用传参
		/sys/module/驱动命名的目录/parameters/
		以变量命名的文件
		
		su root
		echo 70 > light
demo.c


#include <linux/init.h>
#include <linux/module.h>

int light=100;

module_param(light,int,0664);
MODULE_PARM_DESC(light,"this is lcd light(rang 0-100,default 100)");
//入口
static int __init demo_init(void)
{
	printk("init :light = %d\n",light);
	return 0;
}

//出口
static void  __exit demo_exit(void)
{
	printk("exit :light = %d\n",light);
}

module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");


Makefile

KERNELDIR:= /lib/modules/$(shell uname -r)/build/
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)

all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean

obj-m:=demo.o

1.通过命令行传参的形式传递字符类型
2.通过命令行传参的形式传递字符串
3.通过命令行传参的形式传递数组
module_param_array(name, type, nump, perm) 

module_param_array(name, type, nump, perm) 
	功能:接收整型的数组
	参数:
		@name :数组名
		@type :数组的类型
		@nump :命令行传递的参数的个数
		@perm :权限
	
sudo insmod demo.ko light=50 tt=65 p="www.hqyj.com" ww=11,22,33


demo.c

#include <linux/init.h>
#include <linux/module.h>

int light=100;
module_param(light,int,0664);
MODULE_PARM_DESC(light,"this is lcd light(rang 0-100,default 100)");

char tt=50; //arm编译器认为char是一个无符号的类型,
			//ubuntu编译认识它是有符号的
module_param(tt,byte,0775);
MODULE_PARM_DESC(tt,"this is char var");

char *p="hello driver";
module_param(p,charp,0664);
MODULE_PARM_DESC(p,"this is a char point");

int ww[5] = {0};
int len;
module_param_array(ww,int,&len,0664);
MODULE_PARM_DESC(ww,"this is int [5] array");

//入口
static int __init demo_init(void)
{
	int i;
	printk("init :light = %d\n",light);
	printk("tt = %c\n",tt);
	printk("p = %s\n",p);
	
	for(i=0;i<len;i++){
		printk("ww[%d] = %d\n",i,ww[i]);
	}

	return 0;
}

//出口
static void  __exit demo_exit(void)
{
	printk("exit :light = %d\n",light);
}

module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");


Makefile

KERNELDIR:= /lib/modules/$(shell uname -r)/build/
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)

all:
	make -C $(KERNELDIR) M=$(PWD) modules
clean:
	make -C $(KERNELDIR) M=$(PWD) clean

obj-m:=demo.o

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值