디바이스 드라이버
글 수 70
2012.09.06 12:54:28 (*.52.177.29)
23782
디바이스드라이버를 작성하고 여기에 module_param() 매크로를 사용하여 변수 초기값을 변경하는
코딩을 많이 해보았을 것이다.
헌데 이런 인자가 많을경우 이것을 모두 정의 해서 사용하기 귀챦은 나 같은 사람이 있을 것이 분명하다.
해서 문자열로 인자를 받아 이것을 분해하여 사용하는 방법을 설명하고자 한다.
변수를 선언하고, module_param_string 매크로를 사용하여 등록하면 끝
static char argstr[128];
module_param_string( argstr_user, argstr, sizeof(argstr), S_IRUGO );
module_param_string 매크로의 첮번재 인자는 insmod 유틸을 사용할때 사용할 이름이고
두번째는 실제 변수이름, 세번째는 문자열변수의 버퍼크기, 마지막은 실행옵션(이값은 그냥 0 을써도 좋다)
모듈 올리때 사용방법은
[root@falinux fg]$ insmod dev-test-param.ko argstr_user=1234567890,9090,1234.45
test init
argint=0x00000000,0x00000000,0x00000000
argstr=1234567890,9090,1234.45
소스는 아래 참조
/**
@file test.c
@date 2012/08/08
@author 오재경 freefrug@falinux.com FALinux.Co.,Ltd.
@brief
@todo
@bug
@remark
@warning
*/
//----------------------------------------------------------------------------
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/workqueue.h>
#include <linux/irq.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/ioctl.h>
#include <asm/unistd.h>
#include <asm/io.h>
#include <asm/irq.h>
static char argstr[128];
static int argint_www_falinux_com_1 = 0;
static int argint_www_falinux_com_2 = 0;
static int argint_www_falinux_com_3 = 0;
module_param( argint_www_falinux_com_1, int, S_IRUGO );
module_param( argint_www_falinux_com_2, int, S_IRUGO );
module_param( argint_www_falinux_com_3, int, S_IRUGO );
module_param_string( argstr_user, argstr, sizeof(argstr), S_IRUGO );
static int drv_test_init( void )
{
printk( "test init\n" );
printk( " argint=0x%08x,0x%08x,0x%08x\n", argint_www_falinux_com_1, argint_www_falinux_com_2, argint_www_falinux_com_3 );
if ( argstr[0] != 0 )
printk( " argstr=%s\n", argstr );
printk( "\n\n\n" );
return -1;
}
static void drv_test_exit( void )
{
printk( "test exit\n" );
}
module_init(drv_test_init);
module_exit(drv_test_exit);
MODULE_AUTHOR("freefrug@falinux.com");
MODULE_LICENSE("GPL");