led.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include <rtthread.h>
  2. #include "board.h"
  3. #define RT_DEVICE_CTRL_RTC_GET_COUNT 0x81 /**< get count */
  4. #define LED_NUM 4
  5. struct fm3_gpio_ctrl
  6. {
  7. uint32_t led_num;
  8. volatile uint32_t * PDOR;
  9. volatile uint32_t * PDIR;
  10. };
  11. struct fm3_led
  12. {
  13. /* inherit from rt_device */
  14. struct rt_device parent;
  15. struct fm3_gpio_ctrl fm3_gpio_ctrl[LED_NUM];
  16. };
  17. static struct fm3_led fm3_led;
  18. static rt_err_t rt_led_init (rt_device_t dev)
  19. {
  20. uint32_t i;
  21. /* led0 : P54 */
  22. FM3_GPIO->PFR5 &= ~((1<<7) | (1<<6) | (1<<5) |(1<<4)); /* set P54 fuction is GPIO. */
  23. FM3_GPIO->DDR5 |= (1<<7) | (1<<6) | (1<<5) |(1<<4); /* set P54 output. */
  24. /* LED0 */
  25. i = 0;
  26. fm3_led.fm3_gpio_ctrl[i].led_num = 4;
  27. fm3_led.fm3_gpio_ctrl[i].PDOR = &FM3_GPIO->PDOR5;
  28. fm3_led.fm3_gpio_ctrl[i].PDIR = &FM3_GPIO->PDIR5;
  29. /* LED1 */
  30. i++;
  31. fm3_led.fm3_gpio_ctrl[i].led_num = 5;
  32. fm3_led.fm3_gpio_ctrl[i].PDOR = &FM3_GPIO->PDOR5;
  33. fm3_led.fm3_gpio_ctrl[i].PDIR = &FM3_GPIO->PDIR5;
  34. /* LED2 */
  35. i++;
  36. fm3_led.fm3_gpio_ctrl[i].led_num = 6;
  37. fm3_led.fm3_gpio_ctrl[i].PDOR = &FM3_GPIO->PDOR5;
  38. fm3_led.fm3_gpio_ctrl[i].PDIR = &FM3_GPIO->PDIR5;
  39. /* LED3 */
  40. i++;
  41. fm3_led.fm3_gpio_ctrl[i].led_num = 7;
  42. fm3_led.fm3_gpio_ctrl[i].PDOR = &FM3_GPIO->PDOR5;
  43. fm3_led.fm3_gpio_ctrl[i].PDIR = &FM3_GPIO->PDIR5;
  44. return RT_EOK;
  45. }
  46. static rt_err_t rt_led_open(rt_device_t dev, rt_uint16_t oflag)
  47. {
  48. return RT_EOK;
  49. }
  50. static rt_err_t rt_led_close(rt_device_t dev)
  51. {
  52. return RT_EOK;
  53. }
  54. static rt_size_t rt_led_read (rt_device_t dev, rt_off_t pos, void* buffer,
  55. rt_size_t size)
  56. {
  57. rt_ubase_t index = 0;
  58. rt_ubase_t nr = size;
  59. rt_uint8_t * value = buffer;
  60. RT_ASSERT(dev == &fm3_led.parent);
  61. RT_ASSERT((pos+size) <= LED_NUM );
  62. for(index=0; index<nr; index++)
  63. {
  64. if(*fm3_led.fm3_gpio_ctrl[pos+index].PDIR & 1<<fm3_led.fm3_gpio_ctrl[pos+index].led_num)
  65. {
  66. *value = 0;
  67. }
  68. else
  69. {
  70. *value = 1;
  71. }
  72. value++;
  73. }
  74. return index;
  75. }
  76. static rt_size_t rt_led_write (rt_device_t dev, rt_off_t pos,
  77. const void* buffer, rt_size_t size)
  78. {
  79. rt_ubase_t index = 0;
  80. rt_ubase_t nw = size;
  81. const rt_uint8_t * value = buffer;
  82. RT_ASSERT(dev == &fm3_led.parent);
  83. RT_ASSERT((pos+size) <= LED_NUM );
  84. for(index=0; index<nw; index++)
  85. {
  86. if(*value++)
  87. {
  88. *fm3_led.fm3_gpio_ctrl[pos+index].PDOR &= ~(1<<fm3_led.fm3_gpio_ctrl[pos+index].led_num);
  89. }
  90. else
  91. {
  92. *fm3_led.fm3_gpio_ctrl[pos+index].PDOR |= (1<<fm3_led.fm3_gpio_ctrl[pos+index].led_num);
  93. }
  94. }
  95. return index;
  96. }
  97. static rt_err_t rt_led_control (rt_device_t dev, int cmd, void *args)
  98. {
  99. RT_ASSERT(dev == &fm3_led.parent);
  100. if(cmd == RT_DEVICE_CTRL_RTC_GET_COUNT)
  101. {
  102. rt_uint32_t * led_num = args;
  103. *led_num = LED_NUM;
  104. }
  105. return RT_EOK;
  106. }
  107. void rt_led_hw_init(void)
  108. {
  109. fm3_led.parent.type = RT_Device_Class_Char;
  110. fm3_led.parent.rx_indicate = RT_NULL;
  111. fm3_led.parent.tx_complete = RT_NULL;
  112. fm3_led.parent.init = rt_led_init;
  113. fm3_led.parent.open = rt_led_open;
  114. fm3_led.parent.close = rt_led_close;
  115. fm3_led.parent.read = rt_led_read;
  116. fm3_led.parent.write = rt_led_write;
  117. fm3_led.parent.control = rt_led_control;
  118. fm3_led.parent.user_data = RT_NULL;
  119. /* register a character device */
  120. rt_device_register(&fm3_led.parent, "led", RT_DEVICE_FLAG_RDWR);
  121. /* init led device */
  122. rt_led_init(&fm3_led.parent);
  123. }
  124. #ifdef RT_USING_FINSH
  125. #include <finsh.h>
  126. void led(rt_uint32_t led, rt_uint32_t value)
  127. {
  128. rt_uint8_t led_value = value;
  129. rt_led_write(&fm3_led.parent, led, &led_value, 1);
  130. }
  131. FINSH_FUNCTION_EXPORT(led, e.g:led(0,100).)
  132. #endif