Skip to content

Commit 292dbe7

Browse files
committed
piolib: Add rxsource
1 parent 40ec0fb commit 292dbe7

4 files changed

Lines changed: 111 additions & 0 deletions

File tree

piolib/examples/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ target_include_directories(blockingtest PRIVATE ../include)
6565
target_link_libraries(blockingtest pio pthread)
6666
install(TARGETS blockingtest RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
6767

68+
add_executable(rxsource rxsource.c)
69+
target_include_directories(rxsource PRIVATE ../include)
70+
target_link_libraries(rxsource pio)
71+
install(TARGETS rxsource RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
72+
6873
add_executable(irqtest irqtest.c)
6974
target_include_directories(irqtest PRIVATE ../include ../../pinctrl)
7075
target_link_libraries(irqtest pio gpiolib)

piolib/examples/rxsource.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3+
*
4+
* SPDX-License-Identifier: BSD-3-Clause
5+
*/
6+
7+
#include <stdio.h>
8+
#include <stdlib.h>
9+
10+
#include "pico/stdlib.h"
11+
#include "hardware/pio.h"
12+
#include "rxsource.pio.h"
13+
14+
#define DATA_WORDS 16
15+
16+
int main(__unused int argc, __unused const char **argv) {
17+
uint32_t databuf[DATA_WORDS];
18+
uint gpio = 2;
19+
int ret = 0;
20+
int i, j;
21+
stdio_init_all();
22+
23+
PIO pio = pio0;
24+
int sm = pio_claim_unused_sm(pio, true);
25+
uint offset = pio_add_program(pio, &rxsource_program);
26+
printf("Loaded program at %d, using sm %d, gpio %d\n", offset, sm, gpio);
27+
28+
pio_sm_config_xfer(pio, sm, PIO_DIR_FROM_SM, sizeof(databuf), 4);
29+
30+
pio_gpio_init(pio, gpio);
31+
pio_sm_set_consecutive_pindirs(pio, sm, gpio, 1, true);
32+
pio_sm_config c = rxsource_program_get_default_config(offset);
33+
sm_config_set_sideset_pins(&c, gpio);
34+
sm_config_set_clkdiv(&c, 1);
35+
pio_sm_init(pio, sm, offset, &c);
36+
pio_sm_set_enabled(pio, sm, true);
37+
38+
// Read ahead as much as possible
39+
for (j = 0; j < 4; j++) {
40+
ret = pio_sm_xfer_data(pio, sm, PIO_DIR_FROM_SM, sizeof(databuf), NULL);
41+
if (ret)
42+
break;
43+
}
44+
for (i = 0; i < 1000; i++) {
45+
ret = pio_sm_xfer_data(pio, sm, PIO_DIR_FROM_SM, sizeof(databuf), databuf);
46+
if (ret)
47+
break;
48+
if (j < 1000) {
49+
pio_sm_xfer_data(pio, sm, PIO_DIR_FROM_SM, sizeof(databuf), NULL);
50+
j++;
51+
}
52+
}
53+
54+
if (ret)
55+
printf("* error %d\n", ret);
56+
return ret;
57+
}

piolib/examples/rxsource.pio

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.program rxsource
2+
.side_set 1
3+
4+
push side 0x1
5+
nop side 0x0

piolib/examples/rxsource.pio.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// ---------------------------------------------------------------- //
2+
// This file is autogenerated by pioasm version 2.2.0; do not edit! //
3+
// ---------------------------------------------------------------- //
4+
5+
#pragma once
6+
7+
#if !PICO_NO_HARDWARE
8+
#include "hardware/pio.h"
9+
#endif
10+
11+
// -------- //
12+
// rxsource //
13+
// -------- //
14+
15+
#define rxsource_wrap_target 0
16+
#define rxsource_wrap 1
17+
#define rxsource_pio_version 0
18+
19+
static const uint16_t rxsource_program_instructions[] = {
20+
// .wrap_target
21+
0x9020, // 0: push block side 1
22+
0xa042, // 1: nop side 0
23+
// .wrap
24+
};
25+
26+
#if !PICO_NO_HARDWARE
27+
static const struct pio_program rxsource_program = {
28+
.instructions = rxsource_program_instructions,
29+
.length = 2,
30+
.origin = -1,
31+
.pio_version = rxsource_pio_version,
32+
#if PICO_PIO_VERSION > 0
33+
.used_gpio_ranges = 0x0
34+
#endif
35+
};
36+
37+
static inline pio_sm_config rxsource_program_get_default_config(uint offset) {
38+
pio_sm_config c = pio_get_default_sm_config();
39+
sm_config_set_wrap(&c, offset + rxsource_wrap_target, offset + rxsource_wrap);
40+
sm_config_set_sideset(&c, 1, false, false);
41+
return c;
42+
}
43+
#endif
44+

0 commit comments

Comments
 (0)