【OK210试用体验】- 驱动实现 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】- 驱动实现

chkconfig ( 楼主 ) 2015-10-27 23:09:53  只看该作者 倒序浏览
最近比较忙,所以到现在才更新内容。下面是我借鉴加改良的驱动代码,在板上运行没有问题。
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include


  13. #define IOCTL_GPIO_ON                 1
  14. #define IOCTL_GPIO_OFF                0

  15. MODULE_LICENSE("GPL");

  16. static dev_t devnr;
  17. static struct cdev cdev;
  18. static struct class *led_class;
  19. static struct device *led_device;

  20. static unsigned long leds_table[] =
  21. {
  22.         S5PV210_MP04(4),
  23.         S5PV210_MP04(5),
  24.         S5PV210_MP04(6),
  25.         S5PV210_MP04(7),
  26. };
  27. static char leds_name[][4] = {{"LED1"},{"LED2"},{"LED3"},{"LED4"}};
  28. #define        LED_SIZE        ARRAY_SIZE(leds_table)                //在kernel.h中定义

  29. static int led_open(struct inode *inode, struct file *filp)
  30. {
  31.         int i;
  32.         int err;
  33.        
  34. /*        for(i = 0; i < LED_SIZE; i++)
  35.         {
  36.                 err = gpio_request(leds_table[i], leds_name[i]);
  37.                 if(err){
  38.                         printk(KERN_ERR "fail to request S5PV210_MP04(%d)n",i + 4);
  39.                         return err;
  40.                 }       
  41.         }*/
  42.        
  43.         for(i = 0; i < LED_SIZE; i++)
  44.         {
  45.                 s3c_gpio_cfgpin(leds_table[i], S3C_GPIO_OUTPUT);
  46.                 gpio_set_value(leds_table[i], 0);
  47.                 //gpio_direction_output(leds_table[i],0);
  48.                 //gpio_set_value(led_table[i],0);
  49.         }
  50.     printk(KERN_INFO "LEDs driver successfully open!n");
  51.     return 0;
  52. }

  53. static int led_close(struct inode *inode, struct file *filp)
  54. {
  55.         /*gpio_free(leds_table[0]);
  56.         gpio_free(leds_table[1]);
  57.         gpio_free(leds_table[2]);
  58.         gpio_free(leds_table[3]);*/
  59.         printk(KERN_ERR "leds successfully close!n");
  60.         return 0;
  61. }

  62. static int led_ioctl(struct inode *inode, struct file *filp,
  63.                                          unsigned int cmd, unsigned long arg)
  64. {
  65.         if(arg > LED_SIZE)
  66.         {
  67.                 return -EINVAL;
  68.         }
  69.         switch(cmd){
  70.                 case IOCTL_GPIO_ON:
  71.                         gpio_set_value(leds_table[arg],0);
  72.                         //gpio_direction_output(leds_table[arg],1);
  73.                         break;
  74.                
  75.                 case IOCTL_GPIO_OFF:
  76.                         gpio_set_value(leds_table[arg],1);
  77.                         //gpio_direction_output(leds_table[arg],0);
  78.                         break;
  79.                        
  80.                 default:
  81.                         return -EINVAL;
  82.                 }
  83.         return 0;
  84. }

  85. struct file_operations led_fops = {
  86.                 .owner = THIS_MODULE,
  87.                 .open = led_open,
  88.                 .ioctl = led_ioctl,
  89.                 .release = led_close,
  90. };



  91. //装载模块
  92. static int __init led_init(void)
  93. {
  94.         int ret;
  95.         //        设备号的获取
  96.         ret = alloc_chrdev_region(&devnr, 0, 1, "led_device");
  97.         if(ret){
  98.                 printk(KERN_ERR "alloc char device region fail!n");
  99.                 return ret;
  100.         }
  101.        
  102.         //初始化cdev并添加到系统
  103.         cdev_init(&cdev, &led_fops);
  104.        
  105.         ret = cdev_add(&cdev, devnr, 1);
  106.         if(ret){
  107.                 printk(KERN_ERR "add cdev fail!n");
  108.                 goto add_error;
  109.         }
  110.         //创建设备节点
  111.         led_class = class_create(THIS_MODULE, "led_class");  /*创建类,在/sys/class下显示信息*/
  112.         if(IS_ERR(led_class)){
  113.                 printk(KERN_ERR "class create fail!n");
  114.                 goto class_error;
  115.         }
  116.        
  117.         led_device = device_create(led_class, NULL,devnr, NULL, "led_device");  /*创建节点,存在于/dev/ */
  118.         if(IS_ERR(led_device)){
  119.                 printk(KERN_ERR "device create fail!n");
  120.                 goto device_error;
  121.         }
  122.         printk(KERN_INFO "SUCCCESS!n");       
  123.        
  124.         return 0;
  125.        
  126.         //错误处理
  127.         device_error:
  128.                 class_destroy(led_class);
  129.         class_error:
  130.                 cdev_del(&cdev);
  131.         add_error:
  132.                 unregister_chrdev_region(devnr, 1);
  133.         return -ENODEV;
  134. }

  135. //卸载模块
  136. static void __exit led_exit(void)
  137. {
  138.         device_destroy(led_class, devnr);
  139.         class_destroy(led_class);
  140.         cdev_del(&cdev);
  141.         unregister_chrdev_region(devnr, 1);
  142. }

  143. module_init(led_init);
  144. module_exit(led_exit);
复制代码
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include

  8. #define DEVICE        "/dev/led_device"
  9. #define IOCTL_GPIO_OFF                0
  10. #define IOCTL_GPIO_ON                1
  11. int main(int argc, char **argv)
  12. {
  13.         int fd;
  14.         int time = 1;
  15.         fd = open(DEVICE, O_RDWR);
  16.         if(fd < 0){
  17.                 printf("open file error!n");
  18.                 return fd;
  19.         }
  20.         printf("led start to work!!n");
  21.        
  22.         while(1)
  23.         {
  24.                 time++;
  25.                 printf("led flow work %d timen",time);
  26.                 ioctl(fd, IOCTL_GPIO_ON,0);
  27.                 ioctl(fd, IOCTL_GPIO_OFF,1);
  28.                 ioctl(fd, IOCTL_GPIO_ON,2);
  29.                 ioctl(fd, IOCTL_GPIO_OFF,3);
  30.                 sleep(1);
  31.                 ioctl(fd, IOCTL_GPIO_OFF,0);
  32.                 ioctl(fd, IOCTL_GPIO_ON,1);
  33.                 ioctl(fd, IOCTL_GPIO_OFF,2);
  34.                 ioctl(fd, IOCTL_GPIO_ON,3);
  35.                 sleep(1);
  36.         }
  37.         return 0;
  38. }
复制代码
  1. #leds Makefile
  2. ARCH=arm
  3. CROSS_COMPILE=/home/huangsp/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
  4. APP_COMPILE=/home/huangsp/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
  5. #obj-m := led_app.o
  6. obj-m :=led_drv.o
  7. #KDIR := /path/to/kernel/linux/
  8. KDIR := /home/huangsp/ok210/android-kernel-samsung-dev/
  9. PWD := $(shell pwd)
  10. default:
  11.         make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
  12. app:led_app.c
  13.         $(APP_COMPILE)gcc -o app led_app.c
  14. clean:
  15.         $(MAKE) -C $(KDIR) M=$(PWD) clean
复制代码




0个回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-12-22 11:31 , Processed in 1.048765 second(s), Total 60, Slave 42 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表