|
223 | 223 | #define GD32_PIN_PK14 GD32PIN(GD32_PORTK, 14) |
224 | 224 | #define GD32_PIN_PK15 GD32PIN(GD32_PORTK, 15) |
225 | 225 |
|
| 226 | +/** |
| 227 | + * @brief Macro to generate pinmux int using port, pin number and mode arguments |
| 228 | + */ |
| 229 | + |
| 230 | +#define PIN_NO(port, line) (((port) - 'A') * 0x10 + (line)) |
| 231 | +#define GD32_PINMUX(port, line, mode, remap) \ |
| 232 | + (((PIN_NO(port, line)) << 8) | (mode << 6) | (remap)) |
| 233 | + |
| 234 | +/** |
| 235 | + * @brief Pin modes |
| 236 | + */ |
| 237 | + |
| 238 | +#define ALTERNATE 0x0 /* Alternate function output */ |
| 239 | +#define GPIO_IN 0x1 /* Input */ |
| 240 | +#define ANALOG 0x2 /* Analog */ |
| 241 | + |
| 242 | +/** |
| 243 | + * @brief Pin remapping configurations |
| 244 | + */ |
| 245 | + |
| 246 | +#define NO_REMAP 0x0 /* No remapping */ |
| 247 | +#define REMAP_1 0x1 /* Partial remapping 1 */ |
| 248 | +#define REMAP_2 0x2 /* Partial remapping 2 */ |
| 249 | +#define REMAP_3 0x3 /* Partial remapping 3 */ |
| 250 | +#define REMAP_FULL 0x4 /* Full remapping */ |
| 251 | + |
| 252 | +/** |
| 253 | + * @brief PIN configuration bitfield |
| 254 | + * |
| 255 | + * Pin configuration is coded with the following |
| 256 | + * fields |
| 257 | + * GPIO I/O Mode [ 0 ] |
| 258 | + * GPIO Input config [ 1 : 2 ] |
| 259 | + * GPIO Output speed [ 3 : 4 ] |
| 260 | + * GPIO Output PP/OD [ 5 ] |
| 261 | + * GPIO Output AF/GP [ 6 ] |
| 262 | + * GPIO PUPD Config [ 7 : 8 ] |
| 263 | + * |
| 264 | + * Applicable to GD32F1 series |
| 265 | + */ |
| 266 | + |
| 267 | +/* Alternate functions */ |
| 268 | +/* GD32F1 Pinmux doesn't use explicit alternate functions */ |
| 269 | +/* These are kept for compatibility with other GD32 pinmux */ |
| 270 | +#define GD32_AFR_MASK 0 |
| 271 | +#define GD32_AFR_SHIFT 0 |
| 272 | + |
| 273 | +/* Port Mode */ |
| 274 | +#define GD32_MODE_INPUT (0x0<<GD32_MODE_INOUT_SHIFT) |
| 275 | +#define GD32_MODE_OUTPUT (0x1<<GD32_MODE_INOUT_SHIFT) |
| 276 | +#define GD32_MODE_INOUT_MASK 0x1 |
| 277 | +#define GD32_MODE_INOUT_SHIFT 0 |
| 278 | + |
| 279 | +/* Input Port configuration */ |
| 280 | +#define GD32_CNF_IN_ANALOG (0x0<<GD32_CNF_IN_SHIFT) |
| 281 | +#define GD32_CNF_IN_FLOAT (0x1<<GD32_CNF_IN_SHIFT) |
| 282 | +#define GD32_CNF_IN_PUPD (0x2<<GD32_CNF_IN_SHIFT) |
| 283 | +#define GD32_CNF_IN_MASK 0x3 |
| 284 | +#define GD32_CNF_IN_SHIFT 1 |
| 285 | + |
| 286 | +/* Output Port configuration */ |
| 287 | +#define GD32_MODE_OUTPUT_MAX_10 (0x0<<GD32_MODE_OSPEED_SHIFT) |
| 288 | +#define GD32_MODE_OUTPUT_MAX_2 (0x1<<GD32_MODE_OSPEED_SHIFT) |
| 289 | +#define GD32_MODE_OUTPUT_MAX_50 (0x2<<GD32_MODE_OSPEED_SHIFT) |
| 290 | +#define GD32_MODE_OSPEED_MASK 0x3 |
| 291 | +#define GD32_MODE_OSPEED_SHIFT 3 |
| 292 | + |
| 293 | +#define GD32_CNF_PUSH_PULL (0x0<<GD32_CNF_OUT_0_SHIFT) |
| 294 | +#define GD32_CNF_OPEN_DRAIN (0x1<<GD32_CNF_OUT_0_SHIFT) |
| 295 | +#define GD32_CNF_OUT_0_MASK 0x1 |
| 296 | +#define GD32_CNF_OUT_0_SHIFT 5 |
| 297 | + |
| 298 | +#define GD32_CNF_GP_OUTPUT (0x0<<GD32_CNF_OUT_1_SHIFT) |
| 299 | +#define GD32_CNF_ALT_FUNC (0x1<<GD32_CNF_OUT_1_SHIFT) |
| 300 | +#define GD32_CNF_OUT_1_MASK 0x1 |
| 301 | +#define GD32_CNF_OUT_1_SHIFT 6 |
| 302 | + |
| 303 | +/* GPIO High impedance/Pull-up/Pull-down */ |
| 304 | +#define GD32_PUPD_NO_PULL (0x0<<GD32_PUPD_SHIFT) |
| 305 | +#define GD32_PUPD_PULL_UP (0x1<<GD32_PUPD_SHIFT) |
| 306 | +#define GD32_PUPD_PULL_DOWN (0x2<<GD32_PUPD_SHIFT) |
| 307 | +#define GD32_PUPD_MASK 0x3 |
| 308 | +#define GD32_PUPD_SHIFT 7 |
| 309 | + |
| 310 | +/* Alternate defines */ |
| 311 | +/* IO pin functions are mostly common across GD32 devices. Notable |
| 312 | + * exception is GD32F1 as these MCUs do not have registers for |
| 313 | + * configuration of pin's alternate function. The configuration is |
| 314 | + * done implicitly by setting specific mode and config in MODE and CNF |
| 315 | + * registers for particular pin. |
| 316 | + */ |
| 317 | +#define GD32_ALTERNATE (GD32_MODE_OUTPUT | GD32_CNF_ALT_FUNC) |
| 318 | + |
| 319 | +#define GD32_PIN_USART_TX (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 320 | +#define GD32_PIN_USART_RX (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 321 | +#define GD32_PIN_I2C (GD32_ALTERNATE | GD32_CNF_OPEN_DRAIN) |
| 322 | +#define GD32_PIN_PWM (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 323 | +#define GD32_PIN_SPI_MASTER_SCK (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 324 | +#define GD32_PIN_SPI_SLAVE_SCK (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 325 | +#define GD32_PIN_SPI_MASTER_MOSI (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 326 | +#define GD32_PIN_SPI_SLAVE_MOSI (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 327 | +#define GD32_PIN_SPI_MASTER_MISO (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 328 | +#define GD32_PIN_SPI_SLAVE_MISO (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 329 | +#define GD32_PIN_CAN_TX (GD32_ALTERNATE | GD32_CNF_PUSH_PULL) |
| 330 | +#define GD32_PIN_CAN_RX (GD32_MODE_INPUT | GD32_PUPD_PULL_UP) |
| 331 | + |
| 332 | +/* |
| 333 | + * Reference manual (RM0008) |
| 334 | + * Section 25.3.1: Slave select (NSS) pin management |
| 335 | + * |
| 336 | + * Hardware NSS management: |
| 337 | + * - NSS output disabled: allows multimaster capability for devices operating |
| 338 | + * in master mode. |
| 339 | + * - NSS output enabled: used only when the device operates in master mode. |
| 340 | + * |
| 341 | + * Software NSS management: |
| 342 | + * - External NSS pin remains free for other application uses. |
| 343 | + * |
| 344 | + */ |
| 345 | + |
| 346 | +/* Hardware master NSS output disabled */ |
| 347 | +#define GD32_PIN_SPI_MASTER_NSS (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 348 | +/* Hardware master NSS output enabled */ |
| 349 | +#define GD32_PIN_SPI_MASTER_NSS_OE (GD32_MODE_OUTPUT | \ |
| 350 | + GD32_CNF_ALT_FUNC | \ |
| 351 | + GD32_CNF_PUSH_PULL) |
| 352 | +#define GD32_PIN_SPI_SLAVE_NSS (GD32_MODE_INPUT | GD32_CNF_IN_FLOAT) |
| 353 | +#define GD32_PIN_USB (GD32_MODE_INPUT | GD32_CNF_IN_PUPD) |
| 354 | + |
| 355 | + |
226 | 356 | #endif /* ZEPHYR_GD32_PINCTRL_COMMON_H_ */ |
0 commit comments