[t:/]$ 지식_

Linux miscdev simple template

2008/12/31

LDD 책에도 miscdev가 나오는지 모르겠다.
miscdevice는 그냥 커널 소스 참조하면 뚝딱뚝딱 만들 수 있다.
driver/char/nvram.c 정도를 참고하라.

리눅스 관련일을 하게 되면 책은 안 보고 넘의 소스만 쳐다보게 되는 경향이 있다.
제대로 된 이해없이 야메 스킬만 쌓인다 -_-;

아래 모듈에서 헤더는 과도하게 참조되었음을 참고.
기능이 추가됨에 따라 필요하게 될 것이다.

/*
 * 
 *    dawnsea
 *
 *
 */

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/miscdevice.h>
#include <linux/clk.h>

#include <linux/fs.h>
#include <linux/types.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware.h>

#include <asm/arch/irqs.h>

#define G2D_MINOR     220

static char banner1[] __initdata = KERN_INFO "S3C6410 G2D driver init, written by dawnsea\n";
static char banner2[] __exitdata = KERN_INFO "S3C6410 G2D driver exit, written by dawnsea\n";

static int g2d_open(struct inode *inode, struct file *file)
{
    printk("open\n");
    
    return 0;

}

static int g2d_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    printk("ioctl\n");
    
    switch (cmd) {
        
        default:
            return -ENOTTY;    
    }
    
    return 0;
}

static int g2d_release(struct inode *inode, struct file *file)
{
    printk("release\n");
    return 0;
}

static const struct file_operations s3c_g2d_fileops = {
    .owner         = THIS_MODULE,
    .ioctl        = g2d_ioctl,
    .open        = g2d_open,
    .release    = g2d_release,
};

static struct miscdevice s3c_g2d_miscdev = {
    .minor     = G2D_MINOR,
    .name    = "2d",     
    .fops    = &s3c_g2d_fileops,
};

static int __init s3c_g2d_init(void)
{
    int ret;
    
    printk(banner1);
    
    ret = misc_register(&s3c_g2d_miscdev);
    if (ret) {
        printk(KERN_ERR "cannot reg. miscdev, g2d\n");
        return ret;
    }
    
    printk(KERN_INFO "miscdev, g2d, OK\n");
    return 0;
            

}

static void __exit s3c_g2d_exit(void)
{
    printk(banner2);

    misc_deregister(&s3c_g2d_miscdev);

}

module_init(s3c_g2d_init);
module_exit(s3c_g2d_exit);

MODULE_AUTHOR("Samsung AP/dawnsea");
MODULE_DESCRIPTION("S3C6410 G2D driver");
MODULE_LICENSE("GPL");

test prg.

main()
{
    int fd;
    
    fd = open("/dev/misc/2d", 0);
    
    ioctl(fd, 0, 0);
    
    close(fd);
}

결과

[root@glibc /]# insmod s3c_g2d.ko 
S3C6410 G2D driver init, written by dawnsea
miscdev, g2d, OK
[root@glibc /]# ./test_2d 
open
ioctl
release
[root@glibc /]# 








[t:/] is not "technology - root". dawnsea, rss