Linux驱动:LED驱动测试

来源:互联网 发布:中石化邮箱域名是什么 编辑:程序博客网 时间:2024/05/16 17:15
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:Fedora12

目标板:MINI6410

目标板LINUX内核版本:2.6.38


实现功能:

驱动目标板4个LED.


说明:

LED与6410引脚对应连接:

LED1---GPK4

LED2---GPK5

LED3---GPK6

LED4---GPK7


驱动源代码:

led_driver.c:

[cpp] view plaincopy
  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/delay.h>  
  13. #include <linux/moduleparam.h>  
  14. #include <linux/slab.h>  
  15. #include <linux/errno.h>  
  16. #include <linux/ioctl.h>  
  17. #include <linux/cdev.h>  
  18. #include <linux/string.h>  
  19. #include <linux/list.h>  
  20. #include <linux/pci.h>  
  21. #include <asm/uaccess.h>  
  22. #include <asm/atomic.h>  
  23. #include <asm/unistd.h>  
  24. #include <linux/major.h>  
  25.   
  26. #include <mach/map.h>  
  27. #include <mach/regs-clock.h>  
  28. #include <mach/regs-gpio.h>  
  29.   
  30. #include <plat/gpio-cfg.h>  
  31. #include <mach/gpio-bank-e.h>  
  32. #include <mach/gpio-bank-k.h>  
  33. #include <mach/gpio-bank-h.h>  
  34. #include <mach/gpio-bank-n.h>  
  35. #include <mach/gpio-bank-l.h>  
  36. #include <mach/gpio-bank-p.h>  
  37.   
  38. #include <linux/device.h>  
  39.   
  40. #define DEVICE_NAME "led_driver"  
  41. #define T_MAJORS    700  
  42.   
  43. static struct cdev fun_cdev;  
  44. static dev_t dev;  
  45. static struct class    *led_class;  
  46.   
  47. //功能:初始化IO  
  48. static void init_led(void)  
  49. {  
  50.     unsigned temp;  
  51.   
  52.     //GPK4-7设置为输出  
  53.     temp = readl(S3C64XX_GPKCON);  
  54.     temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));  
  55.     temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);  
  56.     writel(temp, S3C64XX_GPKCON);  
  57. }  
  58.   
  59. //功能:ioctl操作函数  
  60. //返回值:成功返回0  
  61. static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  
  62. {  
  63.     unsigned int temp = 0;  
  64.   
  65.     printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d\n",cmd,arg);  
  66.   
  67.     temp = readl(S3C64XX_GPKDAT);  
  68.     if (cmd == 0)  
  69.     {  
  70.         temp &= ~(1 << (arg + 3));  
  71.     }  
  72.     else  
  73.     {  
  74.         temp |= 1 << (arg + 3);  
  75.     }  
  76.     writel(temp,S3C64XX_GPKDAT);  
  77.       
  78.     return 0;  
  79. }  
  80.   
  81. static struct file_operations io_dev_fops = {  
  82.     .owner = THIS_MODULE,  
  83.     .unlocked_ioctl = led_driver_ioctl,  
  84. };  
  85.   
  86. static int __init dev_init(void)  
  87. {  
  88.     int ret;  
  89.     unsigned temp;  
  90.   
  91.     init_led();  
  92.   
  93.     dev = MKDEV(T_MAJORS,0);  
  94.     cdev_init(&fun_cdev,&io_dev_fops);  
  95.     ret = register_chrdev_region(dev,1,DEVICE_NAME);  
  96.     if (ret < 0) return 0;  
  97.     ret = cdev_add(&fun_cdev,dev,1);  
  98.     if (ret < 0) return 0;  
  99.   
  100.     printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");  
  101.   
  102.     led_class = class_create(THIS_MODULE, "led_class1");   
  103.     if (IS_ERR(led_class))   
  104.     {   
  105.         printk(KERN_INFO "create class error\n");   
  106.         return -1;   
  107.     }   
  108.     device_create(led_class, NULL, dev, NULL, "led_driver");   
  109.   
  110.     return ret;  
  111. }  
  112.   
  113. static void __exit dev_exit(void)  
  114. {  
  115.     unregister_chrdev_region(dev,1);  
  116.   
  117.         device_destroy(led_class, dev);   
  118.         class_destroy(led_class);  
  119. }  
  120.   
  121. module_init(dev_init);  
  122. module_exit(dev_exit);  
  123. MODULE_LICENSE("GPL");  
  124. MODULE_AUTHOR("JDH");  

用户程序:

test_led.c

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include "stdio.h"  
  5. #include "sys/types.h"  
  6. #include "sys/ioctl.h"  
  7. #include "stdlib.h"  
  8. #include "termios.h"  
  9. #include "sys/stat.h"  
  10. #include "fcntl.h"  
  11. #include "sys/time.h"  
  12.   
  13. #include <string.h>    
  14. #include <stdlib.h>   
  15.   
  16. int main(int argc, char** argv)  
  17. {  
  18.     int fd;  
  19.     int led_num = 0;  
  20.     int led_value = 0;    
  21.     char temp[10];  
  22.   
  23.     fd = open("/dev/led_driver",0);  
  24.     if (fd < 0)  
  25.     {  
  26.         perror("open led_driver error");  
  27.         exit(1);  
  28.     }  
  29.       
  30.     strcpy(temp,argv[1]);    
  31.       led_num = atoi(temp);    
  32.       
  33.     strcpy(temp,argv[2]);    
  34.       led_value = atoi(temp);   
  35.   
  36.     printf("%d %d\n",led_num,led_value);  
  37.   
  38.     ioctl(fd,led_num,led_value);  
  39.   
  40.     close(fd);  
  41.       
  42.     return 0;  
  43. }  

测试说明:

将编译所得的可执行文件test_led上传到开发板

运行:

./test_led 0 1 打开LED1

./test_led 1 1 熄灭LED1


原创粉丝点击