leds-smdk.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/mach-s3c2410/leds-smdk.c
  3.  *
  4.  * Based on linux/arch/arm/mach-sa1100/leds-assabet.c (by John Dorsey)
  5.  *
  6.  * Copyright (C) 2002 MIZI Research, Inc.
  7.  *
  8.  * Written by Janghoon Lyu <nandy@mizi.com>
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/init.h>
  12. #include <asm/hardware.h>
  13. #include <asm/leds.h>
  14. #include <asm/system.h>
  15. #include <asm/arch/smdk.h>
  16. #include "leds.h"
  17. #define LED_STATE_ENABLED 1
  18. #define LED_STATE_CLAIMED 2
  19. #define LED0 (1 << 0)
  20. #define LED1 (1 << 1)
  21. #define LED2 (1 << 2)
  22. #define LED3 (1 << 3)
  23. static unsigned int led_state;
  24. static unsigned int hw_led_state;
  25. static inline void
  26. led_update(unsigned int state)
  27. {
  28. #if 0
  29. GPFDAT &= ~(0xf << 4);
  30. GPFDAT |= (state << 4);
  31. #else
  32. write_gpio_bit(GPIO_LED1, (state & LED0));
  33. write_gpio_bit(GPIO_LED2, ((state & LED1) >> 1));
  34. write_gpio_bit(GPIO_LED3, ((state & LED2) >> 2));
  35. write_gpio_bit(GPIO_LED4, ((state & LED3) >> 3));
  36. #endif
  37. }
  38. void
  39. smdk_leds_event(led_event_t evt)
  40. {
  41. unsigned long flags;
  42. local_irq_save(flags);
  43. switch (evt) {
  44. case led_start:
  45. hw_led_state = (LED1 | LED2 | LED3);
  46. led_state = LED_STATE_ENABLED;
  47. break;
  48. case led_stop:
  49. led_state &= ~LED_STATE_ENABLED;
  50. hw_led_state = (LED0 | LED1 | LED2 | LED3);
  51. led_update(hw_led_state);
  52. break;
  53. case led_claim:
  54. led_state |= LED_STATE_CLAIMED;
  55. hw_led_state = (LED0 | LED1 | LED2 | LED3);
  56. break;
  57. case led_release:
  58. led_state &= ~LED_STATE_CLAIMED;
  59. hw_led_state = (LED1 | LED2 | LED3);
  60. break;
  61. #ifdef CONFIG_LEDS_TIMER
  62. case led_timer:
  63. if (!(led_state & LED_STATE_CLAIMED))
  64. hw_led_state ^= LED3;
  65. break;
  66. #endif
  67. #ifdef CONFIG_LEDS_CPU
  68. case led_idle_start:
  69. if (!(led_state & LED_STATE_CLAIMED))
  70. hw_led_state |= LED2;
  71. break;
  72. case led_idle_end:
  73. if (!(led_state & LED_STATE_CLAIMED))
  74. hw_led_state &= ~LED2;
  75. break;
  76. #endif
  77. case led_halted:
  78. break;
  79. case led_green_on:
  80. if (led_state & LED_STATE_CLAIMED)
  81. hw_led_state &= ~LED2;
  82. break;
  83. case led_green_off:
  84. if (led_state & LED_STATE_CLAIMED)
  85. hw_led_state |= LED2;
  86. break;
  87. case led_amber_on:
  88. break;
  89. case led_amber_off:
  90. break;
  91. case led_red_on:
  92. break;
  93. case led_red_off:
  94. break;
  95. default:
  96. break;
  97. }
  98. if (led_state & LED_STATE_ENABLED)
  99. led_update(hw_led_state);
  100. local_irq_restore(flags);
  101. }