1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2011-03-03 lgnq
9 */
10
11 #include <rtthread.h>
12 #include <rthw.h>
13
14 #include "mb9bf506r.h"
15 #include "led.h"
16
rt_hw_led_on(rt_uint8_t num)17 void rt_hw_led_on(rt_uint8_t num)
18 {
19 RT_ASSERT(num < LEDS_MAX_NUMBER);
20
21 switch (num)
22 {
23 case 1:
24 LED_PDOR &= ~LED1;
25 break;
26 case 2:
27 LED_PDOR &= ~LED2;
28 break;
29 case 3:
30 LED_PDOR &= ~LED3;
31 break;
32 default:
33 break;
34 }
35 }
36
rt_hw_led_off(rt_uint8_t num)37 void rt_hw_led_off(rt_uint8_t num)
38 {
39 RT_ASSERT(num < LEDS_MAX_NUMBER);
40
41 switch (num)
42 {
43 case 1:
44 LED_PDOR |= LED1;
45 break;
46 case 2:
47 LED_PDOR |= LED2;
48 break;
49 case 3:
50 LED_PDOR |= LED3;
51 break;
52 default:
53 break;
54 }
55 }
56
rt_hw_led_toggle(rt_uint8_t num)57 void rt_hw_led_toggle(rt_uint8_t num)
58 {
59 RT_ASSERT(num < LEDS_MAX_NUMBER);
60
61 switch (num)
62 {
63 case 1:
64 if (LED_PDOR&LED1)
65 LED_PDOR &= ~LED1;
66 else
67 LED_PDOR |= LED1;
68 break;
69 case 2:
70 if (LED_PDOR&LED2)
71 LED_PDOR &= ~LED2;
72 else
73 LED_PDOR |= LED2;
74 break;
75 case 3:
76 if (LED_PDOR&LED3)
77 LED_PDOR &= ~LED3;
78 else
79 LED_PDOR |= LED3;
80 break;
81 default:
82 break;
83 }
84 }
85
led_io_init(void)86 static rt_err_t led_io_init(void)
87 {
88 /*Select CPIO function*/
89 LED_PFR &= ~LED_MASK;
90 /*Set Pin to turn off leds*/
91 LED_PDOR |= LED_MASK;
92 /*Make led pins outputs*/
93 LED_DDR |= LED_MASK;
94
95 //LED3 is controled by PWM
96 FM3_GPIO->PFR3 = 0x1000;
97 FM3_GPIO->EPFR04 = 0x00080000;
98 FM3_BT2_PWM->TMCR = 0x0018;
99 FM3_BT2_PWM->TMCR2 = 0x01; /* cks=0b1000 count clk 1/512 */
100 FM3_BT2_PWM->STC = 0x00;
101 FM3_BT2_PWM->PCSR = 0x61A; /* Down count = 1562 */
102 FM3_BT2_PWM->PDUT = 0x0; /* Duty count = 16/1562=10% */
103
104 FM3_BT2_PWM->TMCR |= 0x03; /* start base timer(softwere TRG) */
105 return RT_EOK;
106 }
107
pwm_update(rt_uint16_t value)108 void pwm_update(rt_uint16_t value)
109 {
110 FM3_BT2_PWM->PDUT = value;
111 }
112
led1_thread_entry(void * parameter)113 static void led1_thread_entry(void *parameter)
114 {
115 while (1)
116 {
117 rt_hw_led_toggle(1);
118 rt_thread_delay(RT_TICK_PER_SECOND);
119 }
120 }
121
led2_thread_entry(void * parameter)122 static void led2_thread_entry(void *parameter)
123 {
124 while (1)
125 {
126 rt_hw_led_toggle(2);
127 rt_thread_delay(RT_TICK_PER_SECOND/2);
128 }
129 }
130
131 static rt_thread_t led1_thread;
132 static rt_thread_t led2_thread;
rt_hw_led_init(void)133 void rt_hw_led_init(void)
134 {
135 led_io_init();
136
137 led1_thread = rt_thread_create("led1", led1_thread_entry, RT_NULL, 384, 29, 5);
138 if (led1_thread != RT_NULL)
139 rt_thread_startup(led1_thread);
140
141 led2_thread = rt_thread_create("led2", led2_thread_entry, RT_NULL, 384, 30, 5);
142 if (led2_thread != RT_NULL)
143 rt_thread_startup(led2_thread);
144 }
145
146
147