본문 바로가기
【Fundamental Tech】/→ 🐧Kernel

Linux miscdev simple template

반응형

◈ 원문 출처: 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 정도를 참고하라.

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

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


  1. /* 
  2.  *  
  3.  *    dawnsea 
  4.  * 
  5.  * 
  6.  */  
  7.   
  8. #include <linux/errno.h>  
  9. #include <linux/kernel.h>  
  10. #include <linux/module.h>  
  11. #include <linux/slab.h>  
  12. #include <linux/input.h>  
  13. #include <linux/init.h>  
  14. #include <linux/serio.h>  
  15. #include <linux/delay.h>  
  16. #include <linux/miscdevice.h>  
  17. #include <linux/clk.h>  
  18.   
  19. #include <linux/fs.h>  
  20. #include <linux/types.h>  
  21.   
  22.   
  23. #include <asm/io.h>  
  24. #include <asm/irq.h>  
  25. #include <asm/hardware.h>  
  26.   
  27. #include <asm/arch/irqs.h>  
  28.   
  29. #define G2D_MINOR     220  
  30.   
  31. static char banner1[] __initdata = KERN_INFO "S3C6410 G2D driver init, written by dawnsea\n";  
  32. static char banner2[] __exitdata = KERN_INFO "S3C6410 G2D driver exit, written by dawnsea\n";  
  33.   
  34.   
  35. static int g2d_open(struct inode *inode, struct file *file)  
  36. {  
  37.     printk("open\n");  
  38.       
  39.     return 0;  
  40.   
  41. }  
  42.   
  43. static int g2d_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)  
  44. {  
  45.     printk("ioctl\n");  
  46.       
  47.     switch (cmd) {  
  48.           
  49.         default:  
  50.             return -ENOTTY;      
  51.     }  
  52.       
  53.     return 0;  
  54. }  
  55.   
  56.   
  57. static int g2d_release(struct inode *inode, struct file *file)  
  58. {  
  59.     printk("release\n");  
  60.     return 0;  
  61. }  
  62.   
  63.   
  64. static const struct file_operations s3c_g2d_fileops = {  
  65.     .owner         = THIS_MODULE,  
  66.     .ioctl        = g2d_ioctl,  
  67.     .open        = g2d_open,  
  68.     .release    = g2d_release,  
  69. };  
  70.   
  71. static struct miscdevice s3c_g2d_miscdev = {  
  72.     .minor     = G2D_MINOR,  
  73.     .name    = "2d",       
  74.     .fops    = &s3c_g2d_fileops,  
  75. };  
  76.   
  77.   
  78. static int __init s3c_g2d_init(void)  
  79. {  
  80.     int ret;  
  81.       
  82.     printk(banner1);  
  83.       
  84.     ret = misc_register(&s3c_g2d_miscdev);  
  85.     if (ret) {  
  86.         printk(KERN_ERR "cannot reg. miscdev, g2d\n");  
  87.         return ret;  
  88.     }  
  89.       
  90.     printk(KERN_INFO "miscdev, g2d, OK\n");  
  91.     return 0;  
  92.               
  93.   
  94. }  
  95.   
  96. static void __exit s3c_g2d_exit(void)  
  97. {  
  98.     printk(banner2);  
  99.   
  100.     misc_deregister(&s3c_g2d_miscdev);  
  101.   
  102. }  
  103.   
  104. module_init(s3c_g2d_init);  
  105. module_exit(s3c_g2d_exit);  
  106.   
  107. MODULE_AUTHOR("Samsung AP/dawnsea");  
  108. MODULE_DESCRIPTION("S3C6410 G2D driver");  
  109. MODULE_LICENSE("GPL");  

test prg.

  1. main()  
  2. {  
  3.     int fd;  
  4.       
  5.     fd = open("/dev/misc/2d", 0);  
  6.       
  7.     ioctl(fd, 0, 0);  
  8.       
  9.     close(fd);  
  10. }  


결과.

  1. [root@glibc /]# insmod s3c_g2d.ko   
  2. S3C6410 G2D driver init, written by dawnsea  
  3. miscdev, g2d, OK  
  4. [root@glibc /]# ./test_2d   
  5. open  
  6. ioctl  
  7. release  
  8. [root@glibc /]#   
반응형