歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux驅動:LED驅動測試

Linux驅動:LED驅動測試

日期:2017/3/1 10:38:58   编辑:Linux編程

環境:

主機:Fedora 12

目標板:MINI6410

目標板LINUX內核版本:2.6.38


實現功能:

驅動目標板4個LED.

說明:

LED與6410引腳對應連接:

LED1---GPK4

LED2---GPK5

LED3---GPK6

LED4---GPK7


驅動源代碼:

led_driver.c:

[cpp]
  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. #include <mach/map.h>
  26. #include <mach/regs-clock.h>
  27. #include <mach/regs-gpio.h>
  28. #include <plat/gpio-cfg.h>
  29. #include <mach/gpio-bank-e.h>
  30. #include <mach/gpio-bank-k.h>
  31. #include <mach/gpio-bank-h.h>
  32. #include <mach/gpio-bank-n.h>
  33. #include <mach/gpio-bank-l.h>
  34. #include <mach/gpio-bank-p.h>
  35. #include <linux/device.h>
  36. #define DEVICE_NAME "led_driver"
  37. #define T_MAJORS 700
  38. static struct cdev fun_cdev;
  39. static dev_t dev;
  40. static struct class *led_class;
  41. //功能:初始化IO
  42. static void init_led(void)
  43. {
  44. unsigned temp;
  45. //GPK4-7設置為輸出
  46. temp = readl(S3C64XX_GPKCON);
  47. temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));
  48. temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);
  49. writel(temp, S3C64XX_GPKCON);
  50. }
  51. //功能:ioctl操作函數
  52. //返回值:成功返回0
  53. static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  54. {
  55. unsigned int temp = 0;
  56. printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d\n",cmd,arg);
  57. temp = readl(S3C64XX_GPKDAT);
  58. if (cmd == 0)
  59. {
  60. temp &= ~(1 << (arg + 3));
  61. }
  62. else
  63. {
  64. temp |= 1 << (arg + 3);
  65. }
  66. writel(temp,S3C64XX_GPKDAT);
  67. return 0;
  68. }
  69. static struct file_operations io_dev_fops = {
  70. .owner = THIS_MODULE,
  71. .unlocked_ioctl = led_driver_ioctl,
  72. };
  73. static int __init dev_init(void)
  74. {
  75. int ret;
  76. unsigned temp;
  77. init_led();
  78. dev = MKDEV(T_MAJORS,0);
  79. cdev_init(&fun_cdev,&io_dev_fops);
  80. ret = register_chrdev_region(dev,1,DEVICE_NAME);
  81. if (ret < 0) return 0;
  82. ret = cdev_add(&fun_cdev,dev,1);
  83. if (ret < 0) return 0;
  84. printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");
  85. led_class = class_create(THIS_MODULE, "led_class1");
  86. if (IS_ERR(led_class))
  87. {
  88. printk(KERN_INFO "create class error\n");
  89. return -1;
  90. }
  91. device_create(led_class, NULL, dev, NULL, "led_driver");
  92. return ret;
  93. }
  94. static void __exit dev_exit(void)
  95. {
  96. unregister_chrdev_region(dev,1);
  97. device_destroy(led_class, dev);
  98. class_destroy(led_class);
  99. }
  100. module_init(dev_init);
  101. module_exit(dev_exit);
  102. MODULE_LICENSE("GPL");
  103. MODULE_AUTHOR("JDH");
Copyright © Linux教程網 All Rights Reserved