7#ifndef _HARDWARE_GPIO_COPROC_H
8#define _HARDWARE_GPIO_COPROC_H
11#error "GPIO coprocessor port is not available on RISC-V"
15#error "GPIO coprocessor is not available on RP2040"
18#if !HAS_GPIO_COPROCESSOR
19#error "GPIO coprocessor is not available"
29 pico_default_asm_volatile (
"mcr p0, #0, %0, c0, c0" : :
"r" (x));
34 pico_default_asm_volatile (
"mcr p0, #1, %0, c0, c0" : :
"r" (x));
39 pico_default_asm_volatile (
"mcr p0, #2, %0, c0, c0" : :
"r" (x));
44 pico_default_asm_volatile (
"mcr p0, #3, %0, c0, c0" : :
"r" (x));
49 pico_default_asm_volatile (
"mcr p0, #0, %0, c0, c1" : :
"r" (x));
54 pico_default_asm_volatile (
"mcr p0, #1, %0, c0, c1" : :
"r" (x));
59 pico_default_asm_volatile (
"mcr p0, #2, %0, c0, c1" : :
"r" (x));
64 pico_default_asm_volatile (
"mcr p0, #3, %0, c0, c1" : :
"r" (x));
71 pico_default_asm_volatile (
"mcrr p0, #0, %0, %1, c0" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
78 pico_default_asm_volatile (
"mcrr p0, #1, %0, %1, c0" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
85 pico_default_asm_volatile (
"mcrr p0, #2, %0, %1, c0" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
92 pico_default_asm_volatile (
"mcrr p0, #3, %0, %1, c0" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
100 pico_default_asm_volatile (
"mcr p0, #0, %0, c0, c4" : :
"r" (x));
105 pico_default_asm_volatile (
"mcr p0, #1, %0, c0, c4" : :
"r" (x));
110 pico_default_asm_volatile (
"mcr p0, #2, %0, c0, c4" : :
"r" (x));
115 pico_default_asm_volatile (
"mcr p0, #3, %0, c0, c4" : :
"r" (x));
120 pico_default_asm_volatile (
"mcr p0, #0, %0, c0, c5" : :
"r" (x));
125 pico_default_asm_volatile (
"mcr p0, #1, %0, c0, c5" : :
"r" (x));
130 pico_default_asm_volatile (
"mcr p0, #2, %0, c0, c5" : :
"r" (x));
135 pico_default_asm_volatile (
"mcr p0, #3, %0, c0, c5" : :
"r" (x));
142 pico_default_asm_volatile (
"mcrr p0, #0, %0, %1, c4" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
149 pico_default_asm_volatile (
"mcrr p0, #1, %0, %1, c4" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
156 pico_default_asm_volatile (
"mcrr p0, #2, %0, %1, c4" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
163 pico_default_asm_volatile (
"mcrr p0, #3, %0, %1, c4" : :
"r" (x & 0xffffffffu),
"r" (x >> 32));
176 pico_default_asm_volatile (
"mcrr p0, #4, %0, %1, c0" : :
"r" (pin),
"r" (val));
183 pico_default_asm_volatile (
"mcr p0, #5, %0, c0, c0" : :
"r" (pin));
190 pico_default_asm_volatile (
"mcr p0, #6, %0, c0, c0" : :
"r" (pin));
197 pico_default_asm_volatile (
"mcr p0, #7, %0, c0, c0" : :
"r" (pin));
203__force_inline static void gpioc_bit_out_xor2(uint pin,
bool val) {
204 pico_default_asm_volatile (
"mcrr p0, #5, %0, %1, c0" : :
"r" (pin),
"r" (val));
210__force_inline static void gpioc_bit_out_set2(uint pin,
bool val) {
211 pico_default_asm_volatile (
"mcrr p0, #6, %0, %1, c0" : :
"r" (pin),
"r" (val));
217__force_inline static void gpioc_bit_out_clr2(uint pin,
bool val) {
218 pico_default_asm_volatile (
"mcrr p0, #7, %0, %1, c0" : :
"r" (pin),
"r" (val));
228 pico_default_asm_volatile (
"mcrr p0, #4, %0, %1, c4" : :
"r" (pin),
"r" (val));
235 pico_default_asm_volatile (
"mcr p0, #5, %0, c0, c4" : :
"r" (pin));
242 pico_default_asm_volatile (
"mcr p0, #6, %0, c0, c4" : :
"r" (pin));
249 pico_default_asm_volatile (
"mcr p0, #7, %0, c0, c4" : :
"r" (pin));
256 pico_default_asm_volatile (
"mcrr p0, #5, %0, %1, c4" : :
"r" (pin),
"r" (val));
263 pico_default_asm_volatile (
"mcrr p0, #6, %0, %1, c4" : :
"r" (pin),
"r" (val));
270 pico_default_asm_volatile (
"mcrr p0, #7, %0, %1, c4" : :
"r" (pin),
"r" (val));
286__force_inline static void gpioc_index_out_put(uint reg_index, uint32_t val) {
287 pico_default_asm_volatile (
"mcrr p0, #8, %1, %0, c0" : :
"r" (reg_index),
"r" (val));
299__force_inline static void gpioc_index_out_xor(uint reg_index, uint32_t mask) {
300 pico_default_asm_volatile (
"mcrr p0, #9, %1, %0, c0" : :
"r" (reg_index),
"r" (mask));
312__force_inline static void gpioc_index_out_set(uint reg_index, uint32_t mask) {
313 pico_default_asm_volatile (
"mcrr p0, #10, %1, %0, c0" : :
"r" (reg_index),
"r" (mask));
325__force_inline static void gpioc_index_out_clr(uint reg_index, uint32_t mask) {
326 pico_default_asm_volatile (
"mcrr p0, #11, %1, %0, c0" : :
"r" (reg_index),
"r" (mask));
338__force_inline static void gpioc_index_oe_put(uint reg_index, uint32_t val) {
339 pico_default_asm_volatile (
"mcrr p0, #8, %1, %0, c4" : :
"r" (reg_index),
"r" (val));
351__force_inline static void gpioc_index_oe_xor(uint reg_index, uint32_t mask) {
352 pico_default_asm_volatile (
"mcrr p0, #9, %1, %0, c4" : :
"r" (reg_index),
"r" (mask));
364__force_inline static void gpioc_index_oe_set(uint reg_index, uint32_t mask) {
365 pico_default_asm_volatile (
"mcrr p0, #10, %1, %0, c4" : :
"r" (reg_index),
"r" (mask));
377__force_inline static void gpioc_index_oe_clr(uint reg_index, uint32_t mask) {
378 pico_default_asm_volatile (
"mcrr p0, #11, %1, %0, c4" : :
"r" (reg_index),
"r" (mask));
389 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c0" :
"=r" (lo));
398 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c1" :
"=r" (hi));
407 pico_default_asm_volatile (
"mrrc p0, #0, %0, %1, c0" :
"=r" (lo),
"=r" (hi));
408 return ((uint64_t)hi << 32) | lo;
416 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c4" :
"=r" (lo));
425 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c5" :
"=r" (hi));
434 pico_default_asm_volatile (
"mrrc p0, #0, %0, %1, c4" :
"=r" (lo),
"=r" (hi));
435 return ((uint64_t)hi << 32) | lo;
443 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c8" :
"=r" (lo));
452 pico_default_asm_volatile (
"mrc p0, #0, %0, c0, c9" :
"=r" (hi));
461 pico_default_asm_volatile (
"mrrc p0, #0, %0, %1, c8" :
"=r" (lo),
"=r" (hi));
462 return ((uint64_t)hi << 32) | lo;