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 /]#