-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgpio.s
More file actions
104 lines (98 loc) · 3.71 KB
/
Copy pathgpio.s
File metadata and controls
104 lines (98 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* 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 high 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, 1)
.GPIO_Clear_Pop_Registers:
pop {r4-r12, lr} // pop registers r4-r12, lr from the stack
bx lr // return