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)25void 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)50void 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