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  * 2021-02-02     michael5hzg@gmail.com       adapt to ls1b
10  */
11 
12 // 引脚功能(普通gpio,pwm,复用等)相关接口
13 
14 
15 #include "ls1b_public.h"
16 #include "ls1b_regs.h"
17 #include "ls1b_gpio.h"
18 #include "ls1b_pin.h"
19 
20 
21 /*
22  * 把指定pin设置为指定用途(普通gpio,非gpio)
23  * @gpio gpio引脚编号
24  * @purpose 用途
25  */
pin_set_purpose(unsigned int gpio,pin_purpose_t purpose)26 void pin_set_purpose(unsigned int gpio, pin_purpose_t purpose)
27 {
28     volatile unsigned int *gpio_cfgx;           // GPIO_CFGx寄存器
29     unsigned int pin = GPIO_GET_PIN(gpio);
30 
31     gpio_cfgx = gpio_get_cfg_reg(gpio);
32     if (PIN_PURPOSE_GPIO == purpose)            // 引脚用作普通gpio
33     {
34         reg_set_one_bit(gpio_cfgx, pin);
35     }
36     else                                        // 引脚用作其它功能(非gpio)
37     {
38         reg_clr_one_bit(gpio_cfgx, pin);
39     }
40 
41     return ;
42 }
43 
44 
45 
46 /*
47  * 设置指定pin为第n复用
48  * @gpio gpio编号
49  * @remap 第n复用
50  */
pin_set_remap(unsigned int gpio,pin_remap_t remap)51 void pin_set_remap(unsigned int gpio, pin_remap_t remap)
52 {
53     volatile unsigned int *reg = NULL;          // 复用寄存器
54     unsigned int port = GPIO_GET_PORT(gpio);
55     unsigned int pin  = GPIO_GET_PIN(gpio);
56     int i;
57 
58     /*指定全部pin复用为0*/
59     for (i = 0; i <= 4; i++)
60     {
61         reg = (volatile unsigned int *)((LS1B_CBUS_FIRST0) + ((port) * 0x04) + ((i) * 0x10));
62         // 置0
63         reg_clr_one_bit(reg, pin);
64     }
65 
66     if (remap == PIN_REMAP_DEFAULT) return;
67 
68     switch (port)
69     {
70     case 0:
71         switch (remap)
72         {
73         case PIN_REMAP_FIRST:
74             reg = (volatile unsigned int *)LS1B_CBUS_FIRST0;
75             break;
76         case PIN_REMAP_SECOND:
77             reg = (volatile unsigned int *)LS1B_CBUS_SECOND0;
78             break;
79         case PIN_REMAP_THIRD:
80             reg = (volatile unsigned int *)LS1B_CBUS_THIRD0;
81             break;
82         case PIN_REMAP_FOURTH:
83             reg = (volatile unsigned int *)LS1B_CBUS_FOURTH0;
84             break;
85         case PIN_REMAP_FIFTH:
86             reg = (volatile unsigned int *)LS1B_CBUS_FIFTH0;
87             break;
88         }
89         break;
90 
91     case 1:
92         switch (remap)
93         {
94         case PIN_REMAP_FIRST:
95             reg = (volatile unsigned int *)LS1B_CBUS_FIRST1;
96             break;
97         case PIN_REMAP_SECOND:
98             reg = (volatile unsigned int *)LS1B_CBUS_SECOND1;
99             break;
100         case PIN_REMAP_THIRD:
101             reg = (volatile unsigned int *)LS1B_CBUS_THIRD1;
102             break;
103         case PIN_REMAP_FOURTH:
104             reg = (volatile unsigned int *)LS1B_CBUS_FOURTH1;
105             break;
106         case PIN_REMAP_FIFTH:
107             reg = (volatile unsigned int *)LS1B_CBUS_FIFTH1;
108             break;
109         }
110         break;
111 
112     case 2:
113         switch (remap)
114         {
115         case PIN_REMAP_FIRST:
116             reg = (volatile unsigned int *)LS1B_CBUS_FIRST2;
117             break;
118         case PIN_REMAP_SECOND:
119             reg = (volatile unsigned int *)LS1B_CBUS_SECOND2;
120             break;
121         case PIN_REMAP_THIRD:
122             reg = (volatile unsigned int *)LS1B_CBUS_THIRD2;
123             break;
124         case PIN_REMAP_FOURTH:
125             reg = (volatile unsigned int *)LS1B_CBUS_FOURTH2;
126             break;
127         case PIN_REMAP_FIFTH:
128             reg = (volatile unsigned int *)LS1B_CBUS_FIFTH2;
129             break;
130         }
131         break;
132 
133     case 3:
134         switch (remap)
135         {
136         case PIN_REMAP_FIRST:
137             reg = (volatile unsigned int *)LS1B_CBUS_FIRST3;
138             break;
139         case PIN_REMAP_SECOND:
140             reg = (volatile unsigned int *)LS1B_CBUS_SECOND3;
141             break;
142         case PIN_REMAP_THIRD:
143             reg = (volatile unsigned int *)LS1B_CBUS_THIRD3;
144             break;
145         case PIN_REMAP_FOURTH:
146             reg = (volatile unsigned int *)LS1B_CBUS_FOURTH3;
147             break;
148         case PIN_REMAP_FIFTH:
149             reg = (volatile unsigned int *)LS1B_CBUS_FIFTH3;
150             break;
151         }
152         break;
153 
154     default:
155         return ;
156     }
157 
158     // 置1
159     reg_set_one_bit(reg, pin);
160 
161     return ;
162 }
163 
164 
165 
166