/** * FILE: gpio.s * * DESCRIPTION: * RP2350 GPIO Functions. * * BRIEF: * Provides GPIO configuration, set, and clear functions using * coprocessor instructions. * * AUTHOR: Kevin Thomas * CREATION DATE: November 27, 2025 * UPDATE DATE: November 27, 2025 */ .syntax unified // use unified assembly syntax .cpu cortex-m33 // target Cortex-M33 core .thumb // use Thumb instruction set .include "constants.s" /** * Initialize the .text section. * The .text section contains executable code. */ .section .text // code section .align 2 // align to 4-byte boundary /** * @brief Configure GPIO. * * @details Configures a GPIO pin's pad control and function select. * * @param r0 - PAD_OFFSET * @param r1 - CTRL_OFFSET * @param r2 - GPIO * @retval None */ .global GPIO_Config .type GPIO_Config, %function GPIO_Config: .GPIO_Config_Push_Registers: push {r4-r12, lr} // push registers r4-r12, lr to the stack .GPIO_Config_Modify_Pad: ldr r4, =PADS_BANK0_BASE // load PADS_BANK0_BASE address add r4, r4, r0 // PADS_BANK0_BASE + PAD_OFFSET ldr r5, [r4] // read PAD_OFFSET value bic r5, r5, #(1<<7) // clear OD bit orr r5, r5, #(1<<6) // set IE bit bic r5, r5, #(1<<8) // clear ISO bit str r5, [r4] // store value into PAD_OFFSET .GPIO_Config_Modify_CTRL: ldr r4, =IO_BANK0_BASE // load IO_BANK0 base add r4, r4, r1 // IO_BANK0_BASE + CTRL_OFFSET ldr r5, [r4] // read CTRL_OFFSET value bic r5, r5, #0x1f // clear FUNCSEL orr r5, r5, #0x05 // set FUNCSEL 0x05->SIO_0 str r5, [r4] // store value into CTRL_OFFSET .GPIO_Config_Enable_OE: ldr r4, =1 // enable output mcrr p0, #4, r2, r4, c4 // gpioc_bit_oe_put(GPIO, 1) .GPIO_Config_Pop_Registers: pop {r4-r12, lr} // pop registers r4-r12, lr to the stack bx lr // return /** * @brief GPIO set. * * @details Drives GPIO output high via coprocessor. * * @param r0 - GPIO * @retval None */ .global GPIO_Set .type GPIO_Set, %function GPIO_Set: .GPIO_Set_Push_Registers: push {r4-r12, lr} // push registers r4-r12, lr to the stack .GPIO_Set_Execute: ldr r4, =1 // enable output mcrr p0, #4, r0, r4, c0 // gpioc_bit_out_put(GPIO, 1) .GPIO_Set_Pop_Registers: pop {r4-r12, lr} // pop registers r4-r12, lr from the stack bx lr // return /** * @brief GPIO clear. * * @details Drives GPIO output low via coprocessor. * * @param r0 - GPIO * @retval None */ .global GPIO_Clear .type GPIO_Clear, %function GPIO_Clear: .GPIO_Clear_Push_Registers: push {r4-r12, lr} // push registers r4-r12, lr to the stack .GPIO_Clear_Execute: ldr r4, =0 // disable output mcrr p0, #4, r0, r4, c0 // gpioc_bit_out_put(GPIO, 0) .GPIO_Clear_Pop_Registers: pop {r4-r12, lr} // pop registers r4-r12, lr from the stack bx lr // return