Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4242740
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2010-12-24 20:30:16

和 TQ2440 led测试GPB5 实现一样的功能
不同点: 这里使用 混杂设备 实现的功能 貌似 更加简单

驱动
  1. #include<linux/miscdevice.h>
  2. #include<linux/delay.h>
  3. #include<asm/irq.h>
  4. #include<mach/regs-gpio.h>
  5. #include<mach/hardware.h>
  6. #include<linux/kernel.h>
  7. #include<linux/module.h>
  8. #include<linux/init.h>
  9. #include<linux/mm.h>
  10. #include<linux/fs.h>
  11. #include<linux/types.h>
  12. #include<linux/moduleparam.h>
  13. #include<linux/slab.h>
  14. #include<linux/errno.h>
  15. #include<linux/ioctl.h>
  16. #include<linux/cdev.h>
  17. #include<linux/string.h>
  18. #include<linux/list.h>
  19. #include<linux/pci.h>
  20. #include<asm/uaccess.h>
  21. #include<asm/atomic.h>
  22. #include<asm/unistd.h>

  23. #define DEVICE_NAME "led-misdev"

  24. #define IOCTL_GPIO_ON    1
  25. #define IOCTL_GPIO_OFF    0

  26. static int led_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
  27. {
  28.     switch(cmd)
  29.     {
  30.         case IOCTL_GPIO_ON:
  31.             s3c2410_gpio_setpin(S3C2410_GPB5,0);
  32.             return 0;
  33.         case IOCTL_GPIO_OFF:
  34.             s3c2410_gpio_setpin(S3C2410_GPB5,1);
  35.             return 1;
  36.         default:
  37.             return -EINVAL;
  38.     }
  39. }


  40. static struct file_operations dev_fops={
  41.     .owner    =    THIS_MODULE,
  42.     .ioctl    =    led_ioctl,    
  43. };

  44. static struct miscdevice led_misc={
  45.     .minor    =MISC_DYNAMIC_MINOR,
  46.     .name    =DEVICE_NAME,
  47.     .fops    =&dev_fops,
  48. };

  49. void gpio_init(void)
  50. {
  51.     s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);
  52.     s3c2410_gpio_setpin(S3C2410_GPB5,0);
  53. }
  54. static int __init led_init(void)
  55. {
  56.     int ret;
  57.     gpio_init();
  58.     ret=misc_register(&led_misc);
  59.     printk(DEVICE_NAME "initialized");
  60.     return ret;
  61. }


  62. static void __init led_exit(void)
  63. {
  64.     misc_deregister(&led_misc);
  65.     printk(KERN_INFO "bye the curl world!\n");
  66. }

  67. module_init(led_init);
  68. module_exit(led_exit);
  69. MODULE_LICENSE("GPL");
应用程序
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<sys/ioctl.h>
  5. #include<sys/types.h>
  6. #include<sys/stat.h>
  7. #include<fcntl.h>
  8. #include<sys/select.h>
  9. #include<sys/time.h>

  10. int main(void)
  11. {
  12.     int fp;
  13.     fp=open("/dev/led-misdev",0);
  14.     if(fp<0)
  15.     {
  16.         perror("open bad \n");
  17.         return 0;
  18.     }    
  19.     
  20.     while(1)
  21.     {
  22.         ioctl(fp,0);
  23.         printf("led off\n");
  24.         sleep(1);
  25.         ioctl(fp,1);
  26.         printf("led on\n");
  27.         sleep(1);
  28.     }
  29.     return 0;
  30. }

阅读(1738) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~