반응형
◈ 원문 출처: http://www.troot.co.kr/tc/1010
Linux Device Driver, miscdev, Ioctl. scull.
http://lwn.net/Kernel/LDD3/
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 /]#
반응형
'【Fundamental Tech】 > Linux' 카테고리의 다른 글
Kernel Debugging with VirtualBox (0) | 2011.10.20 |
---|---|
GCC 컴파일 메시지 컬러 출력 (0) | 2011.10.20 |
linux kernel 2.6.38.8 system call wrapping (0) | 2011.10.14 |
리눅스 컴퓨터에서 윈도우즈 컴퓨터로 원격 데스크탑 연결하는 방법 (rdesktop 사용법) (0) | 2011.10.14 |
Kernel 2.6 Makefile 분석 (0) | 2011.10.14 |