]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/T-HEAD_CB2201_CDK/csi/csi_driver/csky/hobbit3/pinmux.c
Introduce a port for T-HEAD CK802. A simple demo for T-HEAD CB2201 is also included.
[freertos] / FreeRTOS / Demo / T-HEAD_CB2201_CDK / csi / csi_driver / csky / hobbit3 / pinmux.c
1 /*
2  * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /******************************************************************************
18  * @file     pinmux.c
19  * @brief    source file for the pinmux
20  * @version  V1.0
21  * @date     02. June 2017
22  ******************************************************************************/
23 #include <stdint.h>
24 #include "pinmux.h"
25 #include "pin_name.h"
26
27 #define readl(addr) \
28     ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
29
30 #define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
31
32 /*******************************************************************************
33  * function: hobbit_ioreuse_inital
34  *
35  * description:
36  *   initial hobbit_pinmux
37  *******************************************************************************/
38
39 extern int32_t target_qspi_init(pin_name_t mosi, pin_name_t miso, pin_name_t sclk, pin_name_t ssel, pin_name_t wp, pin_name_t hold, uint32_t *base, uint32_t *irq);
40
41 void hobbit_ioreuse_initial(void)
42 {
43     unsigned int value;
44
45     /* gpio data source select */
46     value = readl(HOBBIT_GIPO0_PORTCTL_REG);
47     value |= GPIO0_REUSE_EN;
48     writel(value, HOBBIT_GIPO0_PORTCTL_REG);
49
50     value = readl(HOBBIT_GIPO1_PORTCTL_REG);
51     value |= GPIO1_REUSE_EN;
52     writel(value, HOBBIT_GIPO1_PORTCTL_REG);
53
54     /* reuse function select */
55     value = readl(HOBBIT_IOMUX0L_REG);
56     value |= IOMUX0L_FUNCTION_SEL;
57     writel(value, HOBBIT_IOMUX0H_REG);
58
59     value = readl(HOBBIT_IOMUX0H_REG);
60     value |= IOMUX1L_FUNCTION_SEL;
61     writel(value, HOBBIT_IOMUX0H_REG);
62
63     value = readl(HOBBIT_IOMUX1L_REG);
64     value |= IOMUX1L_FUNCTION_SEL;
65     writel(value, HOBBIT_IOMUX1L_REG);
66
67     target_qspi_init(PA4_QSPI0MOSI_XX_XX_XX, PA3_QSPI0MISO_XX_XX_XX, PA2_QSPI0CLK_XX_XX_XX, PA7_QSPI0CS0_XX_XX_XX, PA6_QSPI0WP_XX_XX_XX, PA5_QSPI0HOLD_XX_XX_XX, 0, 0);
68 }
69
70 int32_t pin_mux(pin_name_t pin, uint16_t function)
71 {
72     unsigned int val = 0;
73     unsigned int reg_val = 0;
74
75     uint8_t offset;
76
77     if (function > 3) {
78         if (pin < PB0_UART2TX_XX_XX_SIROUT2) {
79             offset = pin;
80             /* gpio data source select */
81             val = readl(HOBBIT_GIPO0_PORTCTL_REG);
82             val &= ~(1 << offset);
83             writel(val, HOBBIT_GIPO0_PORTCTL_REG);
84             return 0;
85         } else if (pin >= PB0_UART2TX_XX_XX_SIROUT2) {
86             offset = pin - 32;
87             /* gpio data source select */
88             val = readl(HOBBIT_GIPO1_PORTCTL_REG);
89             val &= ~(1 << offset);
90             writel(val, HOBBIT_GIPO1_PORTCTL_REG);
91             return 0;
92         } else {
93             return -1;
94         }
95     }
96
97     if (pin >= PB0_UART2TX_XX_XX_SIROUT2) {
98         offset = pin - 32;
99
100         /* gpio data source select */
101         val = readl(HOBBIT_GIPO1_PORTCTL_REG);
102         val |= (1 << offset);
103         writel(val, HOBBIT_GIPO1_PORTCTL_REG);
104
105         reg_val = (0x3 << (offset * 2));
106         /* reuse function select */
107         val = readl(HOBBIT_IOMUX1L_REG);
108         val &= ~(reg_val);
109         val |= (function << (2 * offset));
110         writel(val, HOBBIT_IOMUX1L_REG);
111         return 0;
112     }
113
114     offset = pin;
115     /* gpio data source select */
116     val = readl(HOBBIT_GIPO0_PORTCTL_REG);
117     val |= (1 << offset);
118     writel(val, HOBBIT_GIPO0_PORTCTL_REG);
119
120     if (pin >= PA16_SPI0CS0_PWMTRIG0_XX_USI1SCLK) {
121         offset = pin - 16;
122         reg_val = (0x3 << (offset * 2));
123         /* reuse function select */
124         val = readl(HOBBIT_IOMUX0H_REG);
125         val &= ~(reg_val);
126         val |= (function << (2 * offset));
127         writel(val, HOBBIT_IOMUX0H_REG);
128         return 0;
129     }
130
131     reg_val = (0x3 << (offset * 2));
132     /* reuse function select */
133     val = readl(HOBBIT_IOMUX0L_REG);
134     val &= ~(reg_val);
135     val |= (function << (2 * offset));
136     writel(val, HOBBIT_IOMUX0L_REG);
137     return 0;
138 }