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)26void 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)51void 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