1 /**
2     *****************************************************************************
3     * @file     cmem7_gpio.c
4     *
5     * @brief    CMEM7 GPIO source file
6     *
7     *
8     * @version  V1.0
9     * @date     3. September 2013
10     *
11     * @note
12     *
13     *****************************************************************************
14     * @attention
15     *
16     * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
17     * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
18     * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
19     * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
20     * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
21     * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
22     *
23     * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
24     *****************************************************************************
25     */
26 
27 #include "cmem7_gpio.h"
28 
29 #define GPIO_GROUP_GPIO_H                   (GPIO_GROUP_GPIO + 1)
30 #define GPIO_GROUP_GPIO_N                   (GPIO_GROUP_GPIO + 2)
31 
32 #define IS_INNER_GPIO_GROUP(GROUP)  (((GROUP) == GPIO_GROUP_GPIO) || \
33                                                                             ((GROUP) == GPIO_GROUP_GPIO_H) || \
34                                                                             ((GROUP) == GPIO_GROUP_GPIO_N))
35 
36 #define GPIO_PWM_CHANNEL_GPIO_H_9   (GPIO_PWM_CHANNEL_GPIO_31 + 1)
37 #define GPIO_PWM_CHANNEL_GPIO_H_19  (GPIO_PWM_CHANNEL_GPIO_31 + 2)
38 #define GPIO_PWM_CHANNEL_GPIO_H_20  (GPIO_PWM_CHANNEL_GPIO_31 + 3)
39 
40 #define IS_INNER_GPIO_PWM_CHANNEL(CHANNEL)  (((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_31) || \
41                                        ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_9) || \
42                                        ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_19) || \
43                                        ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_20))
gpio_GetClock()44 static uint32_t gpio_GetClock() {
45     return SYSTEM_CLOCK_FREQ / (1 << (GLOBAL_CTRL->CLK_SEL_0_b.GPIO_CLK + 1));
46 }
47 
GPIO_Init(uint8_t Group,uint32_t PositiveTrigger)48 void GPIO_Init(uint8_t Group, uint32_t PositiveTrigger) {
49     assert_param(IS_GPIO_GROUP(Group));
50 
51     if (Group == GPIO_GROUP_GPIO) {
52       GPIO->GPIO_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
53     } else if (Group == GPIO_GROUP_GPIO_H) {
54         GPIO->GPIO_H_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
55     } else {
56         GPIO->GPIO_N_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
57     }
58 }
59 
GPIO_EnableOutput(uint8_t Group,uint32_t Enable)60 void GPIO_EnableOutput(uint8_t Group, uint32_t Enable) {
61     assert_param(IS_GPIO_GROUP(Group));
62 
63     if (Group == GPIO_GROUP_GPIO) {
64       GPIO->GPIO_OE = Enable;
65     } else if (Group == GPIO_GROUP_GPIO_H) {
66         GPIO->GPIO_H_OE = Enable;
67     } else {
68         GPIO->GPIO_N_OE = Enable;
69     }
70 }
71 
GPIO_EnableInt(uint8_t Group,uint32_t Enable)72 void GPIO_EnableInt(uint8_t Group, uint32_t Enable) {
73     assert_param(IS_GPIO_GROUP(Group));
74 
75     if (Group == GPIO_GROUP_GPIO) {
76       GPIO->GPIO_INT_MASK = ~Enable;
77     } else if (Group == GPIO_GROUP_GPIO_H) {
78         GPIO->GPIO_H_INT_MASK = ~Enable;
79     } else {
80         GPIO->GPIO_N_INT_MASK = ~Enable;
81     }
82 }
83 
GPIO_GetIntStatus(uint8_t Group)84 uint32_t GPIO_GetIntStatus(uint8_t Group) {
85     assert_param(IS_GPIO_GROUP(Group));
86 
87     if (Group == GPIO_GROUP_GPIO) {
88       return GPIO->GPIO_INT_STATUS;
89     } else if (Group == GPIO_GROUP_GPIO_H) {
90         return GPIO->GPIO_H_INT_STATUS;
91     }
92 
93     return GPIO->GPIO_N_INT_STATUS;
94 }
95 
GPIO_ClearInt(uint8_t Group,uint32_t Clear)96 void GPIO_ClearInt(uint8_t Group, uint32_t Clear) {
97     assert_param(IS_GPIO_GROUP(Group));
98 
99     if (Group == GPIO_GROUP_GPIO) {
100       GPIO->GPIO_INT_STATUS = Clear;
101     } else if (Group == GPIO_GROUP_GPIO_H) {
102         GPIO->GPIO_H_INT_STATUS = Clear;
103     } else {
104         GPIO->GPIO_N_INT_STATUS = Clear;
105     }
106 }
107 
GPIO_Read(uint8_t Group)108 uint32_t GPIO_Read(uint8_t Group) {
109   uint32_t data;
110 
111     assert_param(IS_GPIO_GROUP(Group));
112 
113     if (Group == GPIO_GROUP_GPIO) {
114       data = GPIO->GPIO_IN;
115     } else if (Group == GPIO_GROUP_GPIO_H) {
116         data = GPIO->GPIO_H_IN;
117     } else {
118         data = GPIO->GPIO_N_IN;
119     }
120 
121     return data;
122 }
123 
GPIO_Write(uint8_t Group,uint32_t Unmask,uint32_t data)124 void GPIO_Write(uint8_t Group, uint32_t Unmask, uint32_t data) {
125     assert_param(IS_GPIO_GROUP(Group));
126 
127     if (Group == GPIO_GROUP_GPIO) {
128         GPIO->GPIO_OUT_UNMASK = Unmask;
129       GPIO->GPIO_OUT_DATA = data;
130     } else if (Group == GPIO_GROUP_GPIO_H) {
131         GPIO->GPIO_H_OUT_UNMASK = Unmask;
132       GPIO->GPIO_H_OUT_DATA = data;
133     } else {
134         GPIO->GPIO_N_OUT_UNMASK = Unmask;
135       GPIO->GPIO_N_OUT_DATA = data;
136     }
137 }
138 
GPIO_InitPwm(uint8_t Channel,uint32_t HighLevelNanoSecond,uint32_t LowLevelNanoSecond)139 void GPIO_InitPwm(uint8_t Channel, uint32_t HighLevelNanoSecond, uint32_t LowLevelNanoSecond) {
140     uint16_t lowTick, highTick;
141 
142     assert_param(IS_GPIO_PWM_CHANNEL(Channel));
143 
144     lowTick = LowLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
145     highTick = HighLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
146     lowTick = (lowTick < 1) ? lowTick : lowTick - 1;
147     highTick = (highTick < 1) ? highTick : highTick - 1;
148 
149     if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
150         GPIO->PWM_OUT0_LEN_b.LOW_LEVEL_TICK = lowTick;
151         GPIO->PWM_OUT0_LEN_b.HIGH_LEVEL_TICK = highTick;
152     } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
153         GPIO->PWM_OUT1_LEN_b.LOW_LEVEL_TICK = lowTick;
154         GPIO->PWM_OUT1_LEN_b.HIGH_LEVEL_TICK = highTick;
155     } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
156         GPIO->PWM_OUT2_LEN_b.LOW_LEVEL_TICK = lowTick;
157         GPIO->PWM_OUT2_LEN_b.HIGH_LEVEL_TICK = highTick;
158   } else {
159         GPIO->PWM_OUT3_LEN_b.LOW_LEVEL_TICK = lowTick;
160         GPIO->PWM_OUT3_LEN_b.HIGH_LEVEL_TICK = highTick;
161     }
162 }
163 
GPIO_EnablePwm(uint8_t Channel,BOOL Enable)164 void GPIO_EnablePwm(uint8_t Channel, BOOL Enable) {
165     assert_param(IS_GPIO_PWM_CHANNEL(Channel));
166 
167     if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
168         GPIO->PWM_OUT_EN_b.GPIO_31 = Enable;
169         GPIO->PWM_OUT_SEL_b.GPIO_31 = Enable;
170     } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
171         GPIO->PWM_OUT_EN_b.GPIO_H_9 = Enable;
172         GPIO->PWM_OUT_SEL_b.GPIO_H_9 = Enable;
173     } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
174         GPIO->PWM_OUT_EN_b.GPIO_H_19 = Enable;
175     GPIO->PWM_OUT_SEL_b.GPIO_H_19 = Enable;
176   } else {
177         GPIO->PWM_OUT_EN_b.GPIO_H_20 = Enable;
178         GPIO->PWM_OUT_SEL_b.GPIO_H_20 = Enable;
179     }
180 }
181 
182 /**
183    xjf 20150324
184 
185 **/
GPIO_SetBits(uint32_t mask)186 void GPIO_SetBits(uint32_t mask)
187 {
188   static uint32_t g_GPIO_OUT_UNMASK;
189   static uint32_t g_GPIO_OUT_DATA;
190   static uint32_t g_GPIO_OE;
191 
192     g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
193   g_GPIO_OUT_DATA   = GPIO->GPIO_OUT_DATA   ;
194     g_GPIO_OE         = GPIO->GPIO_OE ;
195   g_GPIO_OUT_UNMASK |=mask;
196   g_GPIO_OE         |=mask;
197     g_GPIO_OUT_DATA   |=mask;
198 
199     GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
200   GPIO->GPIO_OUT_DATA   =g_GPIO_OUT_DATA ;
201     GPIO->GPIO_OE         =g_GPIO_OE       ;
202 }
203 
GPIO_clrBits(uint32_t mask)204 void GPIO_clrBits(uint32_t mask)
205 {
206   static uint32_t g_GPIO_OUT_UNMASK;
207   static uint32_t g_GPIO_OUT_DATA;
208   static uint32_t g_GPIO_OE;
209 
210     g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
211   g_GPIO_OUT_DATA   = GPIO->GPIO_OUT_DATA   ;
212     g_GPIO_OE         = GPIO->GPIO_OE ;
213   g_GPIO_OUT_UNMASK |=mask;
214   g_GPIO_OE         |=mask;
215     g_GPIO_OUT_DATA   &=(~ mask);
216 
217     GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
218   GPIO->GPIO_OUT_DATA   =g_GPIO_OUT_DATA ;
219     GPIO->GPIO_OE         =g_GPIO_OE       ;
220 }
221 
GPIO_getBits(uint32_t mask)222 uint32_t GPIO_getBits(uint32_t mask)
223 {
224   static uint32_t g_GPIO_OUT_UNMASK;
225   //static uint32_t g_GPIO_OUT_DATA;
226   static uint32_t g_GPIO_OE;
227 
228     uint32_t  get_delay = 0;
229     uint32_t  saved_mask;
230 
231     saved_mask=mask;
232 
233     g_GPIO_OUT_UNMASK      = GPIO->GPIO_OUT_UNMASK ;
234     g_GPIO_OE              = GPIO->GPIO_OE ;
235   g_GPIO_OUT_UNMASK     &=(~mask);
236   g_GPIO_OE             &=(~mask);
237     GPIO->GPIO_OUT_UNMASK  =g_GPIO_OUT_UNMASK ;
238     GPIO->GPIO_OE          =g_GPIO_OE       ;
239     for(get_delay=0;get_delay<100;get_delay++)
240       {
241     }
242     //get_delay=(GPIO->GPIO_IN)&saved_mask;
243   if(((GPIO->GPIO_IN)&saved_mask)==saved_mask)
244        {
245              return(1);
246         }
247     else
248     {
249             return(0);
250     }
251 
252 }
253 /**
254    xjf 20150324
255 
256 **/
257