[feat] add rmii and dma demo

This commit is contained in:
zhji 2025-03-16 17:27:38 +08:00
parent 4af07de63d
commit 40c7bf6258

98
main.c
View File

@ -3,9 +3,19 @@
#include "clock.h" #include "clock.h"
#include "sio.h" #include "sio.h"
#include "gpio.h" #include "gpio.h"
#include "dma.h"
#include "pio_rmii_tx.h"
#include "RP2040.h" #include "RP2040.h"
#include "main_core0.h" #include "main_core0.h"
#include "main_core1.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 = { struct gpio_cfg_s gpio_led_cfg = {
.pin = 25, .pin = 25,
@ -66,20 +76,96 @@ void main_core1(void)
extern uint32_t _vector; extern uint32_t _vector;
extern uint32_t _stack_top_core1; 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) int main(void)
{ {
reset_disable(RESET_IO_BANK0 | RESET_PADS_BANK0); reset_disable(RESET_IO_BANK0 | RESET_PADS_BANK0);
reset_disable(RESET_PIO0);
gpio_init(&gpio_led_cfg); 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); // system_reset(SYSTEM_BLOCK_PROC1);
sio_launch_core1(main_core1,&_stack_top_core1, _vector); // 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(); __enable_irq();
pio_rmii_tx_init(&rmii);
while (1) { while (1) {
static uint32_t tick_cnt = 0; static uint32_t tick_led = 0;
if (tick_1ms > (tick_cnt + 200)) { static uint32_t tick_rmii = 0;
tick_cnt = tick_1ms; 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); gpio_toggle(gpio_led_cfg.pin);
} }
} }