Skip to content

Commit e4aa14e

Browse files
mergify[bot]Z0rdon4ntn
authored
updates project to work with zephyr v4.0.x (backport #146) (#147)
* updates project to work with zephyr v4.0.x (#146) * updates project to work with zephyr v4.0.x * updating workflows for zephyr v4.0.x * adds cmake prefix path, changes to ci image * adds manual trigger to ci workflows * updates CI workflows for all active ROS2 distros * Get uart device with Zephyr 4's Devicetree-centric approach Signed-off-by: Antón Casas <antoncasas@eprosima.com> * Tested in v4.1.0 using manual installation on Ubuntu:24.04 base Docker image Signed-off-by: Antón Casas <antoncasas@eprosima.com> * Add v4.1.0 to CI and nightly Signed-off-by: Antón Casas <antoncasas@eprosima.com> * State SDK used in CI. Restore Z0rdon's info about docker image used. Signed-off-by: Antón Casas <antoncasas@eprosima.com> --------- Signed-off-by: Antón Casas <antoncasas@eprosima.com> Co-authored-by: Antón Casas <antoncasas@eprosima.com> (cherry picked from commit 7cbe6da) # Conflicts: # .github/workflows/nightly.yml # modules/libmicroros/microros_transports/serial/microros_transports.c * Solve merge conflicts Signed-off-by: Antón Casas <antoncasas@eprosima.com> * Harmonize device config with other branches Revert "boards: move board specific configurations (#63)" This reverts commit 7e07006. Signed-off-by: Antón Casas <antoncasas@eprosima.com> * Update ci.yml and nightly.yml Signed-off-by: Antón Casas <antoncasas@eprosima.com> --------- Signed-off-by: Antón Casas <antoncasas@eprosima.com> Co-authored-by: Zordon <101883124+Z0rdon@users.noreply.github.com> Co-authored-by: Antón Casas <antoncasas@eprosima.com>
1 parent 0433f12 commit e4aa14e

File tree

12 files changed

+102
-152
lines changed

12 files changed

+102
-152
lines changed

.github/workflows/ci.yml

100755100644
Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,53 @@
11
name: CI
22

33
on:
4+
workflow_dispatch:
5+
inputs:
6+
name:
7+
description: "Manual trigger"
48
pull_request:
5-
branches:
6-
- '**'
9+
branches: ["rolling", "jazzy", "humble"]
710

811
jobs:
912

1013
micro_ros_zephyr_module:
1114
runs-on: ubuntu-latest
12-
container: ubuntu:22.04
15+
container:
16+
image: zephyrprojectrtos/ci:v0.26.17
17+
options: --user root
18+
env:
19+
CMAKE_PREFIX_PATH: /opt/toolchains
1320
strategy:
1421
fail-fast: false
1522
matrix:
16-
zephyr_version: ["zephyr-v3.1.0", "zephyr-v2.7.2"]
17-
include:
18-
- zephyr_version: zephyr-v2.7.2
19-
zephyr_sdk: 0.14.2
20-
sdk_filename: zephyr-sdk-$TOOLCHAIN_VERSION\_linux-x86_64_minimal.tar.gz
21-
- zephyr_version: zephyr-v3.1.0
22-
zephyr_sdk: 0.14.2
23-
sdk_filename: zephyr-sdk-$TOOLCHAIN_VERSION\_linux-x86_64_minimal.tar.gz
23+
zephyr_version: ["v4.0.0", "v4.1.0"]
2424
steps:
25-
- uses: actions/checkout@v2
25+
- uses: actions/checkout@v4
2626
with:
2727
path: micro_ros_zephyr_module
2828

2929
- name: Build
3030
shell: bash
3131
run: |
32-
# Install dependencies
33-
apt update
34-
export DEBIAN_FRONTEND=noninteractive
35-
apt install -y --no-install-recommends wget git cmake ninja-build gperf \
36-
ccache dfu-util device-tree-compiler wget \
37-
python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
38-
make gcc gcc-multilib g++-multilib libsdl2-dev
39-
40-
# Install Zephyr environment
41-
pip3 install --user -U west
42-
export PATH=~/.local/bin:/github/home/.local/bin:"$PATH"
43-
west init zephyrproject
44-
cd zephyrproject
32+
# Zephyr setup
33+
apt -y update
34+
west init
4535
cd zephyr
4636
git checkout ${{ matrix.zephyr_version }}
4737
cd ..
48-
west update
49-
west zephyr-export
50-
pip3 install --user -r zephyr/scripts/requirements.txt
51-
cd ..
52-
export TOOLCHAIN_VERSION=${{ matrix.zephyr_sdk }}
53-
export TOOLCHAIN_FILE_NAME=${{ matrix.sdk_filename }}
54-
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v$TOOLCHAIN_VERSION/$TOOLCHAIN_FILE_NAME
55-
tar xvf $TOOLCHAIN_FILE_NAME
56-
cd zephyr-sdk-$TOOLCHAIN_VERSION
57-
./setup.sh -h -t arm-zephyr-eabi -c
58-
cd ..
59-
source zephyr-sdk-$TOOLCHAIN_VERSION/environment-setup-x86_64-pokysdk-linux
60-
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
61-
export ZEPHYR_SDK_INSTALL_DIR=$(pwd)/zephyr-sdk-$TOOLCHAIN_VERSION
62-
source zephyrproject/zephyr/zephyr-env.sh
38+
west update --narrow
6339
6440
# Installing micro-ROS prerequisites
6541
pip3 install catkin_pkg lark-parser empy colcon-common-extensions
6642
43+
if [[ ${{ github.ref_name }} == "humble" ]] || [[ ${{ github.head_ref }} == *"humble"* ]]; then
44+
# Use empy version 3.3.4 for Humble
45+
pip3 install empy==3.3.4
46+
fi
47+
6748
# Build with Serial USB transport
68-
west build -b disco_l475_iot1 micro_ros_zephyr_module -- -DCONFIG_MICROROS_TRANSPORT_SERIAL_USB=y
49+
west build -b disco_l475_iot1 $GITHUB_WORKSPACE/micro_ros_zephyr_module -p -- -DCONFIG_MICROROS_TRANSPORT_SERIAL_USB=y
6950
7051
# Build with Serial transport
71-
west build -b disco_l475_iot1 micro_ros_zephyr_module -- -DCONFIG_MICROROS_TRANSPORT_SERIAL=y
52+
west build -b disco_l475_iot1 $GITHUB_WORKSPACE/micro_ros_zephyr_module -p -- -DCONFIG_MICROROS_TRANSPORT_SERIAL=y
53+

.github/workflows/nightly.yml

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,73 +10,52 @@ on:
1010

1111
jobs:
1212

13-
micro_ros_zephyr_module:
13+
nightly_micro_ros_zephyr_module:
1414
runs-on: ubuntu-latest
15-
container: ubuntu:22.04
15+
container:
16+
image: zephyrprojectrtos/ci:v0.26.17
17+
options: --user root
18+
env:
19+
CMAKE_PREFIX_PATH: /opt/toolchains
1620
strategy:
1721
fail-fast: false
1822
matrix:
19-
zephyr_version: ["zephyr-v3.1.0", "zephyr-v2.7.2"]
20-
distro: ["iron", "humble", "rolling"]
23+
zephyr_version: ["v4.0.0", "v4.1.0"]
24+
distro: ["rolling", "jazzy", "humble"]
2125
include:
22-
- distro: iron
23-
branch: iron
2426
- distro: rolling
2527
branch: rolling
28+
- distro: jazzy
29+
branch: jazzy
2630
- distro: humble
2731
branch: humble
28-
- zephyr_version: zephyr-v2.7.2
29-
zephyr_sdk: 0.14.2
30-
sdk_filename: zephyr-sdk-$TOOLCHAIN_VERSION\_linux-x86_64_minimal.tar.gz
31-
- zephyr_version: zephyr-v3.1.0
32-
zephyr_sdk: 0.14.2
33-
sdk_filename: zephyr-sdk-$TOOLCHAIN_VERSION\_linux-x86_64_minimal.tar.gz
3432
steps:
35-
- uses: actions/checkout@v2
33+
- uses: actions/checkout@v4
3634
with:
3735
path: micro_ros_zephyr_module
38-
branch: ${{ matrix.branch }}
36+
ref: ${{ matrix.branch }}
3937

4038
- name: Build
4139
shell: bash
4240
run: |
43-
# Install dependencies
44-
apt update
45-
export DEBIAN_FRONTEND=noninteractive
46-
apt install -y --no-install-recommends wget git cmake ninja-build gperf \
47-
ccache dfu-util device-tree-compiler wget \
48-
python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
49-
make gcc gcc-multilib g++-multilib libsdl2-dev
50-
51-
# Install Zephyr environment
52-
pip3 install --user -U west
53-
export PATH=~/.local/bin:/github/home/.local/bin:"$PATH"
54-
west init zephyrproject
55-
cd zephyrproject
41+
# Zephyr setup
42+
apt -y update
43+
west init
5644
cd zephyr
5745
git checkout ${{ matrix.zephyr_version }}
5846
cd ..
59-
west update
60-
west zephyr-export
61-
pip3 install --user -r zephyr/scripts/requirements.txt
62-
cd ..
63-
export TOOLCHAIN_VERSION=${{ matrix.zephyr_sdk }}
64-
export TOOLCHAIN_FILE_NAME=${{ matrix.sdk_filename }}
65-
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v$TOOLCHAIN_VERSION/$TOOLCHAIN_FILE_NAME
66-
tar xvf $TOOLCHAIN_FILE_NAME
67-
cd zephyr-sdk-$TOOLCHAIN_VERSION
68-
./setup.sh -h -t arm-zephyr-eabi -c
69-
cd ..
70-
source zephyr-sdk-$TOOLCHAIN_VERSION/environment-setup-x86_64-pokysdk-linux
71-
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
72-
export ZEPHYR_SDK_INSTALL_DIR=$(pwd)/zephyr-sdk-$TOOLCHAIN_VERSION
73-
source zephyrproject/zephyr/zephyr-env.sh
47+
west update --narrow
7448
7549
# Installing micro-ROS prerequisites
7650
pip3 install catkin_pkg lark-parser empy colcon-common-extensions
7751
52+
if [[ ${{ matrix.branch }} == "humble" ]]; then
53+
# Use empy version 3.3.4 for Humble
54+
pip3 install empy==3.3.4
55+
fi
56+
7857
# Build with Serial USB transport
79-
west build -b disco_l475_iot1 micro_ros_zephyr_module -- -DCONFIG_MICROROS_TRANSPORT_SERIAL_USB=y
58+
west build -b disco_l475_iot1 $GITHUB_WORKSPACE/micro_ros_zephyr_module -p -- -DCONFIG_MICROROS_TRANSPORT_SERIAL_USB=y
8059
8160
# Build with Serial transport
82-
west build -b disco_l475_iot1 micro_ros_zephyr_module -- -DCONFIG_MICROROS_TRANSPORT_SERIAL=y
61+
west build -b disco_l475_iot1 $GITHUB_WORKSPACE/micro_ros_zephyr_module -p -- -DCONFIG_MICROROS_TRANSPORT_SERIAL=y

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
# micro-ROS module for Zephyr
55

6-
This module has been tested in Zephyr RTOS v2.7.0 (SDK 0.14.2) and v3.1.0 (SDK 0.14.2).
6+
This module has been tested in Zephyr RTOS v4.0.0 (SDK 0.16.9-rc3), and v4.1.0 (SDK 0.16.9-rc3), using a docker image based on 'zephyrprojectrtos/zephyr-build:v0.26.17'.
77

88
## Dependencies
99

@@ -18,7 +18,7 @@ pip3 install catkin_pkg lark-parser empy colcon-common-extensions
1818
For example for `disco_l475_iot1` board:
1919

2020
```bash
21-
west build -b disco_l475_iot1 micro_ros_zephyr_module
21+
west build -b disco_l475_iot1 -p
2222
```
2323

2424
Some configuration parameters can be found using:

boards/disco_l475_iot1.conf

Lines changed: 0 additions & 7 deletions
This file was deleted.

boards/disco_l475_iot1.overlay

Lines changed: 0 additions & 20 deletions
This file was deleted.

modules/libmicroros/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,9 @@ externalproject_add(libmicroros_project
5252
BUILD_BYPRODUCTS ${MICROROS_DIR}/libmicroros.a
5353
)
5454

55-
zephyr_library_import(libmicroros ${MICROROS_DIR}/libmicroros.a)
55+
zephyr_link_libraries(${MICROROS_DIR}/libmicroros.a)
5656

5757
zephyr_interface_library_named(microros)
58-
add_dependencies(microros libmicroros)
5958
add_dependencies(microros libmicroros_project)
6059
target_include_directories(microros INTERFACE ${MICROROS_DIR}/include)
6160

@@ -96,7 +95,6 @@ zephyr_library_sources(
9695

9796
add_dependencies(microros microros_transports)
9897
add_dependencies(microros_transports libmicroros_project)
99-
add_dependencies(microros_transports libmicroros)
10098

10199
# Cleaning
102100

modules/libmicroros/microros_transports/serial-usb/microros_transports.c

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ char uart_out_buffer[RING_BUF_SIZE];
3333

3434
struct ring_buf out_ringbuf, in_ringbuf;
3535

36-
static void uart_fifo_callback(const struct device *dev, void *user_data){
36+
static void uart_fifo_callback(const struct device *dev, void * user_data){
3737
while (uart_irq_update(dev) && uart_irq_is_pending(dev)) {
3838
if (uart_irq_rx_ready(dev)) {
3939
int recv_len;
@@ -64,15 +64,14 @@ static void uart_fifo_callback(const struct device *dev, void *user_data){
6464
}
6565

6666
bool zephyr_transport_open(struct uxrCustomTransport * transport){
67+
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
68+
6769
int ret;
6870
uint32_t baudrate, dtr = 0U;
69-
const struct device *uart_dev;
7071

71-
/* for serial-usb transport we just override the device pointer
72-
* with USB to use the same interface
73-
*/
74-
transport->args = (void *)device_get_binding("CDC_ACM_0");
75-
if (!transport->args) {
72+
73+
params->uart_dev = device_get_binding("CDC_ACM_0");
74+
if (!params->uart_dev) {
7675
printk("CDC ACM device not found\n");
7776
return false;
7877
}
@@ -83,15 +82,13 @@ bool zephyr_transport_open(struct uxrCustomTransport * transport){
8382
return false;
8483
}
8584

86-
uart_dev = (const struct device *)transport->args;
8785
ring_buf_init(&out_ringbuf, sizeof(uart_out_buffer), uart_out_buffer);
8886
ring_buf_init(&in_ringbuf, sizeof(uart_in_buffer), uart_out_buffer);
8987

9088
printk("Waiting for agent connection\n");
9189

9290
while (true) {
93-
94-
uart_line_ctrl_get(uart_dev, UART_LINE_CTRL_DTR, &dtr);
91+
uart_line_ctrl_get(params->uart_dev, UART_LINE_CTRL_DTR, &dtr);
9592
if (dtr) {
9693
break;
9794
} else {
@@ -103,46 +100,47 @@ bool zephyr_transport_open(struct uxrCustomTransport * transport){
103100
printk("Serial port connected!\n");
104101

105102
/* They are optional, we use them to test the interrupt endpoint */
106-
ret = uart_line_ctrl_set(uart_dev, UART_LINE_CTRL_DCD, 1);
103+
ret = uart_line_ctrl_set(params->uart_dev, UART_LINE_CTRL_DCD, 1);
107104
if (ret) {
108105
printk("Failed to set DCD, ret code %d\n", ret);
109106
}
110107

111-
ret = uart_line_ctrl_set(uart_dev, UART_LINE_CTRL_DSR, 1);
108+
ret = uart_line_ctrl_set(params->uart_dev, UART_LINE_CTRL_DSR, 1);
112109
if (ret) {
113110
printk("Failed to set DSR, ret code %d\n", ret);
114111
}
115112

116113
/* Wait 1 sec for the host to do all settings */
117114
k_busy_wait(1000*1000);
118115

119-
ret = uart_line_ctrl_get(uart_dev, UART_LINE_CTRL_BAUD_RATE, &baudrate);
116+
ret = uart_line_ctrl_get(params->uart_dev, UART_LINE_CTRL_BAUD_RATE, &baudrate);
120117
if (ret) {
121118
printk("Failed to get baudrate, ret code %d\n", ret);
122119
}
123120

124-
uart_irq_callback_set(uart_dev, uart_fifo_callback);
121+
uart_irq_callback_set(params->uart_dev, uart_fifo_callback);
125122

126123
/* Enable rx interrupts */
127-
uart_irq_rx_enable(uart_dev);
124+
uart_irq_rx_enable(params->uart_dev);
128125

129126
return true;
130127
}
131128

132129
bool zephyr_transport_close(struct uxrCustomTransport * transport){
133-
(void)transport;
130+
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
131+
(void) params;
134132

135133
return true;
136134
}
137135

138136
size_t zephyr_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err){
139-
const struct device * uart_dev = (const struct device *) transport->args;
137+
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
140138

141139
size_t wrote;
142140

143141
wrote = ring_buf_put(&out_ringbuf, buf, len);
144-
145-
uart_irq_tx_enable(uart_dev);
142+
143+
uart_irq_tx_enable(params->uart_dev);
146144

147145
while (!ring_buf_is_empty(&out_ringbuf)){
148146
k_sleep(K_MSEC(5));
@@ -152,7 +150,7 @@ size_t zephyr_transport_write(struct uxrCustomTransport* transport, const uint8_
152150
}
153151

154152
size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err){
155-
const struct device * uart_dev = (const struct device *) transport->args;
153+
zephyr_transport_params_t * params = (zephyr_transport_params_t*) transport->args;
156154

157155
size_t read = 0;
158156
int spent_time = 0;
@@ -162,9 +160,9 @@ size_t zephyr_transport_read(struct uxrCustomTransport* transport, uint8_t* buf,
162160
spent_time++;
163161
}
164162

165-
uart_irq_rx_disable(uart_dev);
163+
uart_irq_rx_disable(params->uart_dev);
166164
read = ring_buf_get(&in_ringbuf, buf, len);
167-
uart_irq_rx_enable(uart_dev);
165+
uart_irq_rx_enable(params->uart_dev);
168166

169167
return read;
170168
}

modules/libmicroros/microros_transports/serial-usb/microros_transports.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,13 @@ extern "C"
2929
{
3030
#endif
3131

32+
typedef struct {
33+
size_t fd;
34+
const struct device *uart_dev;
35+
} zephyr_transport_params_t;
36+
3237
#define MICRO_ROS_FRAMING_REQUIRED true
38+
static zephyr_transport_params_t default_params;
3339

3440
bool zephyr_transport_open(struct uxrCustomTransport * transport);
3541
bool zephyr_transport_close(struct uxrCustomTransport * transport);

0 commit comments

Comments
 (0)