From 40c7bf62584f930f1dd8e42534de1165bdef3c04 Mon Sep 17 00:00:00 2001 From: zhji Date: Sun, 16 Mar 2025 17:27:38 +0800 Subject: [PATCH] [feat] add rmii and dma demo --- main.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 2f26b31..a0f37de 100644 --- a/main.c +++ b/main.c @@ -3,9 +3,19 @@ #include "clock.h" #include "sio.h" #include "gpio.h" +#include "dma.h" +#include "pio_rmii_tx.h" #include "RP2040.h" #include "main_core0.h" #include "main_core1.h" +#include "udp.h" + +#define STR_MAC_SRC "11:22:33:44:55:66" +#define STR_MAC_DST "1C:1B:0D:2E:A9:99" +#define STR_IP_SRC "192.168.2.219" +#define STR_IP_DST "192.168.2.24" +#define STR_PORT_SRC "40103" +#define STR_PORT_DST "40103" struct gpio_cfg_s gpio_led_cfg = { .pin = 25, @@ -66,20 +76,96 @@ void main_core1(void) extern uint32_t _vector; extern uint32_t _stack_top_core1; + +struct pio_rmii_tx_s rmii = { + .clkdiv = 2, + .sm = 0, + .addr = 0, + .flag = 0, + .pin = 12, /* increase order of pin CLK-EN-D0-D1 */ +}; + +struct udp_cfg_s udp_cfg = { + .mac_src = STR_MAC_SRC, + .mac_dst = STR_MAC_DST, + .ip_src = STR_IP_SRC, + .ip_dst = STR_IP_DST, + .port_src = STR_PORT_SRC, + .port_dst = STR_PORT_DST, +}; + +struct udp_header_s udp_default; +uint32_t buffer[512]; +uint32_t *data; +uint16_t length; + +uint8_t dma_buffer_raw[] = { 0x55, 0xD5, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE }; +uint8_t dma_buffer_calc[20]; +struct dma_cfg_s dma_cfg = { + .read_addr = (uint32_t)dma_buffer_raw, + .write_addr = (uint32_t)dma_buffer_calc, + .trans_count = sizeof(dma_buffer_raw) / 4, + .channel = DMA_CHANNEL_0, + .request = DMA_REQ_FOREVER, + .data_size = DMA_DATA_SIZE_32BIT, + .incr_read = ENABLE, + .incr_write = ENABLE, + .irq_quiet = DISABLE, + .byte_swap = DISABLE, + .chain_to = DMA_CHANNEL_0, + .high_priority = DISABLE, + .ring_sel_write = DISABLE, + .ring_size = DMA_RING_SIZE_NONE, + .sniff_en = ENABLE, +}; +struct dma_sniff_cfg_s sniff_cfg = { + .channel = DMA_CHANNEL_0, + .calc = DMA_SNIFF_CALC_CRC32_BITREV, + .byte_swap = DISABLE, + .out_rev = ENABLE, + .out_inv = ENABLE, +}; + int main(void) { reset_disable(RESET_IO_BANK0 | RESET_PADS_BANK0); + reset_disable(RESET_PIO0); gpio_init(&gpio_led_cfg); + gpio_init_simple(rmii.pin, GPIO_FUNC_PIO0, DISABLE, DISABLE); + gpio_init_simple(rmii.pin + 1, GPIO_FUNC_PIO0, DISABLE, DISABLE); + gpio_init_simple(rmii.pin + 2, GPIO_FUNC_PIO0, DISABLE, DISABLE); + gpio_init_simple(rmii.pin + 3, GPIO_FUNC_PIO0, DISABLE, DISABLE); + if (udp_create_default(&udp_cfg, &udp_default)) { + while (1); + } + data = udp_copy_header(buffer, &udp_default); + for (uint32_t i = 0; i < 16; i++) { + data[i] = (i << 24) | (i << 16) | (i << 8) | i; + } + length = udp_pack_data((struct udp_header_s *)buffer, 16); - system_reset(SYSTEM_BLOCK_PROC1); - sio_launch_core1(main_core1,&_stack_top_core1, _vector); + // system_reset(SYSTEM_BLOCK_PROC1); + // sio_launch_core1(main_core1, &_stack_top_core1, _vector); + + dma_int_clear_raw_status(1 << DMA_CHANNEL_0); + dma_init(&dma_cfg); + dma_sniff_init(&sniff_cfg); + dma_sniff_write(0xA3123859); + dma_sniff_enable(); + dma_enable_and_trig(dma_cfg.channel); + while (!(dma_int_get_raw_status() & (1 << dma_cfg.channel))); __enable_irq(); - + pio_rmii_tx_init(&rmii); while (1) { - static uint32_t tick_cnt = 0; - if (tick_1ms > (tick_cnt + 200)) { - tick_cnt = tick_1ms; + static uint32_t tick_led = 0; + static uint32_t tick_rmii = 0; + if (tick_1ms > (tick_rmii + 1)) { + tick_rmii = tick_1ms; + pio_rmii_write(&rmii, (uint32_t *)buffer, length); + } + if (tick_1ms > (tick_led + 500)) { + tick_led = tick_1ms; gpio_toggle(gpio_led_cfg.pin); } }