1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-09-06     勤为本       first version
9  */
10 
11 // 引脚功能(普通gpio,pwm,复用等)相关接口
12 
13 
14 #include "ls1c_public.h"
15 #include "ls1c_regs.h"
16 #include "ls1c_gpio.h"
17 #include "ls1c_pin.h"
18 
19 
20 /*
21  * 把指定pin设置为指定用途(普通gpio,非gpio)
22  * @gpio gpio引脚编号
23  * @purpose 用途
24  */
pin_set_purpose(unsigned int gpio,pin_purpose_t purpose)25 void pin_set_purpose(unsigned int gpio, pin_purpose_t purpose)
26 {
27     volatile unsigned int *gpio_cfgx;           // GPIO_CFGx寄存器
28     unsigned int pin = GPIO_GET_PIN(gpio);
29 
30     gpio_cfgx = gpio_get_cfg_reg(gpio);
31     if (PIN_PURPOSE_GPIO == purpose)            // 引脚用作普通gpio
32     {
33         reg_set_one_bit(gpio_cfgx, pin);
34     }
35     else                                        // 引脚用作其它功能(非gpio)
36     {
37         reg_clr_one_bit(gpio_cfgx, pin);
38     }
39 
40     return ;
41 }
42 
43 
44 
45 /*
46  * 设置指定pin为第n复用
47  * @gpio gpio编号
48  * @remap 第n复用
49  */
pin_set_remap(unsigned int gpio,pin_remap_t remap)50 void pin_set_remap(unsigned int gpio, pin_remap_t remap)
51 {
52     volatile unsigned int *reg = NULL;          // 复用寄存器
53     unsigned int port = GPIO_GET_PORT(gpio);
54     unsigned int pin  = GPIO_GET_PIN(gpio);
55     int i;
56 
57     /*指定全部pin复用为0*/
58     for (i = 0; i <= 4; i++)
59     {
60         reg = (volatile unsigned int *)((LS1C_CBUS_FIRST0) + ((port) * 0x04) + ((i) * 0x10));
61         // 置0
62         reg_clr_one_bit(reg, pin);
63     }
64 
65     if (remap == PIN_REMAP_DEFAULT) return;
66 
67     switch (port)
68     {
69     case 0:
70         switch (remap)
71         {
72         case PIN_REMAP_FIRST:
73             reg = (volatile unsigned int *)LS1C_CBUS_FIRST0;
74             break;
75         case PIN_REMAP_SECOND:
76             reg = (volatile unsigned int *)LS1C_CBUS_SECOND0;
77             break;
78         case PIN_REMAP_THIRD:
79             reg = (volatile unsigned int *)LS1C_CBUS_THIRD0;
80             break;
81         case PIN_REMAP_FOURTH:
82             reg = (volatile unsigned int *)LS1C_CBUS_FOURTH0;
83             break;
84         case PIN_REMAP_FIFTH:
85             reg = (volatile unsigned int *)LS1C_CBUS_FIFTH0;
86             break;
87         }
88         break;
89 
90     case 1:
91         switch (remap)
92         {
93         case PIN_REMAP_FIRST:
94             reg = (volatile unsigned int *)LS1C_CBUS_FIRST1;
95             break;
96         case PIN_REMAP_SECOND:
97             reg = (volatile unsigned int *)LS1C_CBUS_SECOND1;
98             break;
99         case PIN_REMAP_THIRD:
100             reg = (volatile unsigned int *)LS1C_CBUS_THIRD1;
101             break;
102         case PIN_REMAP_FOURTH:
103             reg = (volatile unsigned int *)LS1C_CBUS_FOURTH1;
104             break;
105         case PIN_REMAP_FIFTH:
106             reg = (volatile unsigned int *)LS1C_CBUS_FIFTH1;
107             break;
108         }
109         break;
110 
111     case 2:
112         switch (remap)
113         {
114         case PIN_REMAP_FIRST:
115             reg = (volatile unsigned int *)LS1C_CBUS_FIRST2;
116             break;
117         case PIN_REMAP_SECOND:
118             reg = (volatile unsigned int *)LS1C_CBUS_SECOND2;
119             break;
120         case PIN_REMAP_THIRD:
121             reg = (volatile unsigned int *)LS1C_CBUS_THIRD2;
122             break;
123         case PIN_REMAP_FOURTH:
124             reg = (volatile unsigned int *)LS1C_CBUS_FOURTH2;
125             break;
126         case PIN_REMAP_FIFTH:
127             reg = (volatile unsigned int *)LS1C_CBUS_FIFTH2;
128             break;
129         }
130         break;
131 
132     case 3:
133         switch (remap)
134         {
135         case PIN_REMAP_FIRST:
136             reg = (volatile unsigned int *)LS1C_CBUS_FIRST3;
137             break;
138         case PIN_REMAP_SECOND:
139             reg = (volatile unsigned int *)LS1C_CBUS_SECOND3;
140             break;
141         case PIN_REMAP_THIRD:
142             reg = (volatile unsigned int *)LS1C_CBUS_THIRD3;
143             break;
144         case PIN_REMAP_FOURTH:
145             reg = (volatile unsigned int *)LS1C_CBUS_FOURTH3;
146             break;
147         case PIN_REMAP_FIFTH:
148             reg = (volatile unsigned int *)LS1C_CBUS_FIFTH3;
149             break;
150         }
151         break;
152 
153     default:
154         return ;
155     }
156 
157     // 置1
158     reg_set_one_bit(reg, pin);
159 
160     return ;
161 }
162 
163 
164 
165