mirror of
https://github.com/mytechnotalent/Embedded-Hacking.git
synced 2026-05-24 00:14:04 +02:00
105 lines
3.7 KiB
ArmAsm
105 lines
3.7 KiB
ArmAsm
/**
|
|
* 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
|