歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用混雜設備實現的Mini6410 LED驅動程序

用混雜設備實現的Mini6410 LED驅動程序

日期:2017/3/1 10:56:22   编辑:Linux編程
用混雜設備實現的Mini6410 LED驅動程序:
  1. #include <linux/miscdevice.h>
  2. #include <linux/delay.h>
  3. #include <asm/irq.h>
  4. #include <mach/hardware.h>
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/init.h>
  8. #include <linux/mm.h>
  9. #include <linux/fs.h>
  10. #include <linux/types.h>
  11. #include <linux/delay.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. #include <mach/map.h>
  24. #include <mach/regs-clock.h>
  25. #include <mach/regs-gpio.h>
  26. #include <plat/gpio-cfg.h>
  27. #include <mach/gpio-bank-e.h>
  28. #include <mach/gpio-bank-k.h>
  29. #define DEVICE_NAME "leds"
  30. static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  31. {
  32. switch(cmd) {
  33. unsigned tmp;
  34. case 0:
  35. case 1:
  36. if (arg > 4) {
  37. return -EINVAL;
  38. }
  39. tmp = readl(S3C64XX_GPKDAT);
  40. tmp &= ~(1 << (4 + arg));
  41. tmp |= ( (!cmd) << (4 + arg) );
  42. writel(tmp, S3C64XX_GPKDAT);
  43. //printk (DEVICE_NAME": %d %d\n", arg, cmd);
  44. return 0;
  45. default:
  46. return -EINVAL;
  47. }
  48. }
  49. static struct file_operations dev_fops = {
  50. .owner = THIS_MODULE,
  51. .unlocked_ioctl = sbc2440_leds_ioctl,
  52. };
  53. static struct miscdevice misc = {
  54. .minor = MISC_DYNAMIC_MINOR,
  55. .name = DEVICE_NAME,
  56. .fops = &dev_fops,
  57. };
  58. static int __init dev_init(void)
  59. {
  60. int ret;
  61. {
  62. unsigned tmp;
  63. tmp = readl(S3C64XX_GPKCON);
  64. tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16);
  65. writel(tmp, S3C64XX_GPKCON);
  66. tmp = readl(S3C64XX_GPKDAT);
  67. tmp |= (0xF << 4);
  68. writel(tmp, S3C64XX_GPKDAT);
  69. }
  70. ret = misc_register(&misc);
  71. printk (DEVICE_NAME"\tinitialized\n");
  72. return ret;
  73. }
  74. static void __exit dev_exit(void)
  75. {
  76. misc_deregister(&misc);
  77. }
  78. module_init(dev_init);
  79. module_exit(dev_exit);
  80. MODULE_LICENSE("GPL");
  81. MODULE_AUTHOR("muge0913");

僅供技術交流學習,請勿商用。

Copyright © Linux教程網 All Rights Reserved