디바이스드라이버를 작성하고 여기에 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");