/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include // Include all headers to check for compiler warnings #include "hardware/adc.h" #include "hardware/claim.h" #include "hardware/clocks.h" #include "hardware/divider.h" #include "hardware/dma.h" #include "hardware/exception.h" #include "hardware/flash.h" #include "hardware/gpio.h" #include "hardware/i2c.h" #include "hardware/interp.h" #include "hardware/irq.h" #include "hardware/pio.h" #include "hardware/pio_instructions.h" #include "hardware/pll.h" #include "hardware/pwm.h" #include "hardware/resets.h" #include "hardware/rtc.h" #include "hardware/spi.h" #include "hardware/sync.h" #include "hardware/timer.h" #include "hardware/uart.h" #include "hardware/vreg.h" #include "hardware/watchdog.h" #include "hardware/xosc.h" #include "pico/binary_info.h" #include "pico/bit_ops.h" #include "pico/bootrom.h" #include "pico/divider.h" #include "pico/double.h" #include "pico/fix/rp2040_usb_device_enumeration.h" #include "pico/float.h" #include "pico/int64_ops.h" #include "pico/malloc.h" #include "pico/multicore.h" #include "pico/printf.h" #include "pico/runtime.h" #include "pico/stdio.h" #include "pico/stdlib.h" #include "pico/sync.h" #include "pico/time.h" #include "pico/unique_id.h" #include "hardware/structs/adc.h" #include "hardware/structs/bus_ctrl.h" #include "hardware/structs/clocks.h" #include "hardware/structs/dma.h" #include "hardware/structs/i2c.h" #include "hardware/structs/interp.h" #include "hardware/structs/iobank0.h" #include "hardware/structs/ioqspi.h" #include "hardware/structs/mpu.h" #include "hardware/structs/padsbank0.h" #include "hardware/structs/pads_qspi.h" #include "hardware/structs/pio.h" #include "hardware/structs/pll.h" #include "hardware/structs/psm.h" #include "hardware/structs/pwm.h" #include "hardware/structs/resets.h" #include "hardware/structs/rosc.h" #include "hardware/structs/rtc.h" #include "hardware/structs/scb.h" #include "hardware/structs/sio.h" #include "hardware/structs/spi.h" #include "hardware/structs/ssi.h" #include "hardware/structs/syscfg.h" #include "hardware/structs/systick.h" #include "hardware/structs/timer.h" #include "hardware/structs/uart.h" #include "hardware/structs/usb.h" #include "hardware/structs/vreg_and_chip_reset.h" #include "hardware/structs/watchdog.h" #include "hardware/structs/xip_ctrl.h" #include "hardware/structs/xosc.h" bi_decl(bi_block_device( BINARY_INFO_MAKE_TAG('K', 'S'), "foo", 0x80000, 0x40000, NULL, BINARY_INFO_BLOCK_DEV_FLAG_READ | BINARY_INFO_BLOCK_DEV_FLAG_WRITE | BINARY_INFO_BLOCK_DEV_FLAG_PT_UNKNOWN)); //#pragma GCC push_options //#pragma GCC optimize ("O3") uint32_t *foo = (uint32_t *) 200; uint32_t dma_to = 0; uint32_t dma_from = 0xaaaa5555; void __noinline spiggle(void) { dma_channel_config c = dma_channel_get_default_config(1); channel_config_set_bswap(&c, true); channel_config_set_transfer_data_size(&c, DMA_SIZE_16); channel_config_set_ring(&c, true, 13); dma_channel_set_config(1, &c, false); dma_channel_transfer_from_buffer_now(1, foo, 23); } __force_inline int something_inlined(int x) { return x * 2; } void __isr dma_handler_a(void) { printf("HELLO A\n"); if (dma_hw->ints1 & 1) { dma_hw->ints1 = 1; printf("A WINS DMA_TO %08x\n", (uint) dma_to); irq_remove_handler(DMA_IRQ_1, dma_handler_a); } } void __isr dma_handler_b(void) { printf("HELLO B\n"); if (dma_hw->ints1 & 1) { dma_hw->ints1 = 1; printf("B WINS DMA_TO %08x\n", (uint) dma_to); // irq_remove_handler(DMA_IRQ_1, dma_handler_b); } } //#pragma GCC pop_options int main(void) { spiggle(); stdio_init_all(); printf("HI %d\n", something_inlined((int)time_us_32())); puts("Hello Everything!"); puts("Hello Everything2!"); irq_add_shared_handler(DMA_IRQ_1, dma_handler_a, 0x80); irq_add_shared_handler(DMA_IRQ_1, dma_handler_b, 0xC0); dma_channel_config config = dma_channel_get_default_config(0); // set_exclusive_irq_handler(DMA_IRQ_1, dma_handler_a); dma_channel_set_irq1_enabled(0, true); irq_set_enabled(DMA_IRQ_1, true); dma_channel_configure(0, &config, &dma_to, &dma_from, 1, true); dma_channel_set_config(0, &config, false); // note this loop expects to cause a breakpoint!! for (int i = 0; i < 20; i++) { puts("sleepy"); sleep_ms(1000); dma_channel_configure(0, &config, &dma_to, &dma_from, 1, true); if (i==3) { irq_remove_handler(DMA_IRQ_1, dma_handler_a); } if (i==2) { irq_remove_handler(DMA_IRQ_1, dma_handler_b); } } // this should compile as we are Cortex M0+ __asm volatile("SVC #3"); }