Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
libuavcan_drivers/linux/scripts/uavcan_add_slcan@0:dfe6edabb8ec, 2018-04-14 (annotated)
- Committer:
- RuslanUrya
- Date:
- Sat Apr 14 10:25:32 2018 +0000
- Revision:
- 0:dfe6edabb8ec
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RuslanUrya | 0:dfe6edabb8ec | 1 | #!/bin/bash |
RuslanUrya | 0:dfe6edabb8ec | 2 | # |
RuslanUrya | 0:dfe6edabb8ec | 3 | # Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@zubax.com> |
RuslanUrya | 0:dfe6edabb8ec | 4 | # |
RuslanUrya | 0:dfe6edabb8ec | 5 | |
RuslanUrya | 0:dfe6edabb8ec | 6 | HELP="Register slcan-enabled Serial-to-CAN adapters as network interfaces. |
RuslanUrya | 0:dfe6edabb8ec | 7 | Usage: |
RuslanUrya | 0:dfe6edabb8ec | 8 | `basename $0` [options] <tty0> [[options] <tty1> ...] |
RuslanUrya | 0:dfe6edabb8ec | 9 | |
RuslanUrya | 0:dfe6edabb8ec | 10 | Interface indexes will be assigned automatically in ascending order, i.e. |
RuslanUrya | 0:dfe6edabb8ec | 11 | first device will be mapped to the interface slcan0, second will be mapped to |
RuslanUrya | 0:dfe6edabb8ec | 12 | slcan1, and so on. Each added option affects only the interfaces that follow |
RuslanUrya | 0:dfe6edabb8ec | 13 | it, which means that options must be properly ordered (see examples below). |
RuslanUrya | 0:dfe6edabb8ec | 14 | This tool requires superuser priveleges. |
RuslanUrya | 0:dfe6edabb8ec | 15 | |
RuslanUrya | 0:dfe6edabb8ec | 16 | The package 'can-utils' must be installed. On Debian/Ubuntu-based systems it |
RuslanUrya | 0:dfe6edabb8ec | 17 | can be installed via APT: apt-get install can-utils |
RuslanUrya | 0:dfe6edabb8ec | 18 | |
RuslanUrya | 0:dfe6edabb8ec | 19 | Options: |
RuslanUrya | 0:dfe6edabb8ec | 20 | --speed-code <X> (where X is a number in range [0, 8]; default: 8) |
RuslanUrya | 0:dfe6edabb8ec | 21 | -s<X> |
RuslanUrya | 0:dfe6edabb8ec | 22 | Set CAN speed to: |
RuslanUrya | 0:dfe6edabb8ec | 23 | 0 - 10 Kbps |
RuslanUrya | 0:dfe6edabb8ec | 24 | 1 - 20 Kbps |
RuslanUrya | 0:dfe6edabb8ec | 25 | 2 - 50 Kbps |
RuslanUrya | 0:dfe6edabb8ec | 26 | 3 - 100 Kbps |
RuslanUrya | 0:dfe6edabb8ec | 27 | 4 - 125 Kbps (UAVCAN recommended) |
RuslanUrya | 0:dfe6edabb8ec | 28 | 5 - 250 Kbps (UAVCAN recommended) |
RuslanUrya | 0:dfe6edabb8ec | 29 | 6 - 500 Kbps (UAVCAN recommended) |
RuslanUrya | 0:dfe6edabb8ec | 30 | 7 - 800 Kbps |
RuslanUrya | 0:dfe6edabb8ec | 31 | 8 - 1 Mbps (UAVCAN recommended, default) |
RuslanUrya | 0:dfe6edabb8ec | 32 | |
RuslanUrya | 0:dfe6edabb8ec | 33 | --remove-all |
RuslanUrya | 0:dfe6edabb8ec | 34 | -r |
RuslanUrya | 0:dfe6edabb8ec | 35 | Remove all SLCAN interfaces. |
RuslanUrya | 0:dfe6edabb8ec | 36 | If this option is used, it MUST be provided FIRST, otherwise it |
RuslanUrya | 0:dfe6edabb8ec | 37 | will remove the interfaces added earlier. |
RuslanUrya | 0:dfe6edabb8ec | 38 | |
RuslanUrya | 0:dfe6edabb8ec | 39 | --basename <X> (where X is a string containing [a-z], default: slcan) |
RuslanUrya | 0:dfe6edabb8ec | 40 | -b<X> |
RuslanUrya | 0:dfe6edabb8ec | 41 | Base name to use for the interfaces that follow this option. |
RuslanUrya | 0:dfe6edabb8ec | 42 | Default value is 'slcan'. This option can be provided multiple times, |
RuslanUrya | 0:dfe6edabb8ec | 43 | it will only affect the interfaces that were provided after it. If you |
RuslanUrya | 0:dfe6edabb8ec | 44 | want to affect all added interfaces, provide this option first (see |
RuslanUrya | 0:dfe6edabb8ec | 45 | examples below). |
RuslanUrya | 0:dfe6edabb8ec | 46 | |
RuslanUrya | 0:dfe6edabb8ec | 47 | --baudrate <X> (where X is an integer, default: 921600) |
RuslanUrya | 0:dfe6edabb8ec | 48 | -S<X> |
RuslanUrya | 0:dfe6edabb8ec | 49 | Configure baud rate to use on the interface. |
RuslanUrya | 0:dfe6edabb8ec | 50 | This option is mostly irrelevant for USB to CAN adapters. |
RuslanUrya | 0:dfe6edabb8ec | 51 | |
RuslanUrya | 0:dfe6edabb8ec | 52 | Example 1: |
RuslanUrya | 0:dfe6edabb8ec | 53 | `basename $0` --remove-all /dev/ttyUSB3 --basename can --baudrate 115200 \\ |
RuslanUrya | 0:dfe6edabb8ec | 54 | /dev/ttyUSB0 --speed-code 4 /dev/ttyACM0 |
RuslanUrya | 0:dfe6edabb8ec | 55 | The example above initializes the interfaces as follows: |
RuslanUrya | 0:dfe6edabb8ec | 56 | /dev/ttyUSB3 --> slcan0 1 Mbps baudrate 921600 |
RuslanUrya | 0:dfe6edabb8ec | 57 | /dev/ttyUSB0 --> can0 1 Mbps baudrate 115200 |
RuslanUrya | 0:dfe6edabb8ec | 58 | /dev/ttyACM0 --> can1 125 kbps baudrate 115200 |
RuslanUrya | 0:dfe6edabb8ec | 59 | |
RuslanUrya | 0:dfe6edabb8ec | 60 | Example 2: |
RuslanUrya | 0:dfe6edabb8ec | 61 | `basename $0` --remove-all |
RuslanUrya | 0:dfe6edabb8ec | 62 | The example above only removes all SLCAN interfaces without adding new ones." |
RuslanUrya | 0:dfe6edabb8ec | 63 | |
RuslanUrya | 0:dfe6edabb8ec | 64 | function die() { echo $@ >&2; exit 1; } |
RuslanUrya | 0:dfe6edabb8ec | 65 | |
RuslanUrya | 0:dfe6edabb8ec | 66 | if [ "$1" == '--help' ] || [ "$1" == '-h' ]; then echo "$HELP"; exit; fi |
RuslanUrya | 0:dfe6edabb8ec | 67 | |
RuslanUrya | 0:dfe6edabb8ec | 68 | [ -n "$1" ] || die "Invalid usage. Use --help to get help." |
RuslanUrya | 0:dfe6edabb8ec | 69 | |
RuslanUrya | 0:dfe6edabb8ec | 70 | [ "$(id -u)" == "0" ] || die "Must be root." |
RuslanUrya | 0:dfe6edabb8ec | 71 | |
RuslanUrya | 0:dfe6edabb8ec | 72 | which slcan_attach > /dev/null || die "Please install can-utils first." |
RuslanUrya | 0:dfe6edabb8ec | 73 | |
RuslanUrya | 0:dfe6edabb8ec | 74 | # --------------------------------------------------------- |
RuslanUrya | 0:dfe6edabb8ec | 75 | |
RuslanUrya | 0:dfe6edabb8ec | 76 | function deinitialize() { |
RuslanUrya | 0:dfe6edabb8ec | 77 | echo "Stopping slcand..." >&2 |
RuslanUrya | 0:dfe6edabb8ec | 78 | # Trying SIGINT first |
RuslanUrya | 0:dfe6edabb8ec | 79 | killall -INT slcand &> /dev/null |
RuslanUrya | 0:dfe6edabb8ec | 80 | sleep 0.3 |
RuslanUrya | 0:dfe6edabb8ec | 81 | # Then trying the default signal, which is SIGTERM, if SIGINT didn't help |
RuslanUrya | 0:dfe6edabb8ec | 82 | slcand_kill_retries=10 |
RuslanUrya | 0:dfe6edabb8ec | 83 | while killall slcand &> /dev/null |
RuslanUrya | 0:dfe6edabb8ec | 84 | do |
RuslanUrya | 0:dfe6edabb8ec | 85 | (( slcand_kill_retries -= 1 )) |
RuslanUrya | 0:dfe6edabb8ec | 86 | [[ "$slcand_kill_retries" > 0 ]] || die "Failed to stop slcand" |
RuslanUrya | 0:dfe6edabb8ec | 87 | sleep 1 |
RuslanUrya | 0:dfe6edabb8ec | 88 | done |
RuslanUrya | 0:dfe6edabb8ec | 89 | } |
RuslanUrya | 0:dfe6edabb8ec | 90 | |
RuslanUrya | 0:dfe6edabb8ec | 91 | function handle_tty() { |
RuslanUrya | 0:dfe6edabb8ec | 92 | tty=$(readlink -f $1) |
RuslanUrya | 0:dfe6edabb8ec | 93 | tty=${tty/'/dev/'} |
RuslanUrya | 0:dfe6edabb8ec | 94 | |
RuslanUrya | 0:dfe6edabb8ec | 95 | iface_index=0 |
RuslanUrya | 0:dfe6edabb8ec | 96 | while ifconfig "$IFACE_BASENAME$iface_index" &> /dev/null |
RuslanUrya | 0:dfe6edabb8ec | 97 | do |
RuslanUrya | 0:dfe6edabb8ec | 98 | iface_index=$((iface_index + 1)) |
RuslanUrya | 0:dfe6edabb8ec | 99 | done |
RuslanUrya | 0:dfe6edabb8ec | 100 | |
RuslanUrya | 0:dfe6edabb8ec | 101 | slcan_iface_index=0 |
RuslanUrya | 0:dfe6edabb8ec | 102 | while ifconfig "slcan$slcan_iface_index" &> /dev/null |
RuslanUrya | 0:dfe6edabb8ec | 103 | do |
RuslanUrya | 0:dfe6edabb8ec | 104 | slcan_iface_index=$((slcan_iface_index + 1)) |
RuslanUrya | 0:dfe6edabb8ec | 105 | done |
RuslanUrya | 0:dfe6edabb8ec | 106 | |
RuslanUrya | 0:dfe6edabb8ec | 107 | iface="$IFACE_BASENAME$iface_index" |
RuslanUrya | 0:dfe6edabb8ec | 108 | slcan_iface="slcan$slcan_iface_index" |
RuslanUrya | 0:dfe6edabb8ec | 109 | |
RuslanUrya | 0:dfe6edabb8ec | 110 | echo "Attaching $tty to $iface speed code $SPEED_CODE baudrate $BAUDRATE" >&2 |
RuslanUrya | 0:dfe6edabb8ec | 111 | |
RuslanUrya | 0:dfe6edabb8ec | 112 | # Configuring the baudrate |
RuslanUrya | 0:dfe6edabb8ec | 113 | stty -F /dev/$tty ispeed $BAUDRATE ospeed $BAUDRATE || return 1 |
RuslanUrya | 0:dfe6edabb8ec | 114 | |
RuslanUrya | 0:dfe6edabb8ec | 115 | # Attaching the line discipline. Note that slcan_attach has option -n but it doesn't work. |
RuslanUrya | 0:dfe6edabb8ec | 116 | slcan_attach -f -o -s$SPEED_CODE /dev/$tty > /dev/null || return 2 |
RuslanUrya | 0:dfe6edabb8ec | 117 | slcand $tty || return 3 |
RuslanUrya | 0:dfe6edabb8ec | 118 | sleep 1 # FIXME |
RuslanUrya | 0:dfe6edabb8ec | 119 | |
RuslanUrya | 0:dfe6edabb8ec | 120 | # ...therefore we need to rename the interface manually |
RuslanUrya | 0:dfe6edabb8ec | 121 | ip link set $slcan_iface name $iface |
RuslanUrya | 0:dfe6edabb8ec | 122 | |
RuslanUrya | 0:dfe6edabb8ec | 123 | ifconfig $iface up || return 4 |
RuslanUrya | 0:dfe6edabb8ec | 124 | } |
RuslanUrya | 0:dfe6edabb8ec | 125 | |
RuslanUrya | 0:dfe6edabb8ec | 126 | IFACE_BASENAME='slcan' |
RuslanUrya | 0:dfe6edabb8ec | 127 | SPEED_CODE=8 |
RuslanUrya | 0:dfe6edabb8ec | 128 | BAUDRATE=921600 |
RuslanUrya | 0:dfe6edabb8ec | 129 | |
RuslanUrya | 0:dfe6edabb8ec | 130 | next_option='' |
RuslanUrya | 0:dfe6edabb8ec | 131 | while [ -n "$1" ]; do |
RuslanUrya | 0:dfe6edabb8ec | 132 | case $1 in |
RuslanUrya | 0:dfe6edabb8ec | 133 | -r | --remove-all) |
RuslanUrya | 0:dfe6edabb8ec | 134 | deinitialize |
RuslanUrya | 0:dfe6edabb8ec | 135 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 136 | |
RuslanUrya | 0:dfe6edabb8ec | 137 | -b*) |
RuslanUrya | 0:dfe6edabb8ec | 138 | IFACE_BASENAME=${1:2} |
RuslanUrya | 0:dfe6edabb8ec | 139 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 140 | |
RuslanUrya | 0:dfe6edabb8ec | 141 | -S*) |
RuslanUrya | 0:dfe6edabb8ec | 142 | BAUDRATE=${1:2} |
RuslanUrya | 0:dfe6edabb8ec | 143 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 144 | |
RuslanUrya | 0:dfe6edabb8ec | 145 | -s[0-8]) |
RuslanUrya | 0:dfe6edabb8ec | 146 | SPEED_CODE=${1:2} |
RuslanUrya | 0:dfe6edabb8ec | 147 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 148 | |
RuslanUrya | 0:dfe6edabb8ec | 149 | --*) |
RuslanUrya | 0:dfe6edabb8ec | 150 | next_option=${1:2} |
RuslanUrya | 0:dfe6edabb8ec | 151 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 152 | |
RuslanUrya | 0:dfe6edabb8ec | 153 | -*) |
RuslanUrya | 0:dfe6edabb8ec | 154 | die "Invalid option: $1" |
RuslanUrya | 0:dfe6edabb8ec | 155 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 156 | |
RuslanUrya | 0:dfe6edabb8ec | 157 | *) |
RuslanUrya | 0:dfe6edabb8ec | 158 | if [ "$next_option" = 'basename' ]; then IFACE_BASENAME=$1 |
RuslanUrya | 0:dfe6edabb8ec | 159 | elif [ "$next_option" = 'speed-code' ]; then SPEED_CODE=$1 |
RuslanUrya | 0:dfe6edabb8ec | 160 | elif [ "$next_option" = 'baudrate' ]; then BAUDRATE=$1 |
RuslanUrya | 0:dfe6edabb8ec | 161 | elif [ "$next_option" = '' ] |
RuslanUrya | 0:dfe6edabb8ec | 162 | then |
RuslanUrya | 0:dfe6edabb8ec | 163 | handle_tty $1 || die "Failed to configure the interface $1" |
RuslanUrya | 0:dfe6edabb8ec | 164 | else |
RuslanUrya | 0:dfe6edabb8ec | 165 | die "Invalid option '$next_option'" |
RuslanUrya | 0:dfe6edabb8ec | 166 | fi |
RuslanUrya | 0:dfe6edabb8ec | 167 | next_option='' |
RuslanUrya | 0:dfe6edabb8ec | 168 | ;; |
RuslanUrya | 0:dfe6edabb8ec | 169 | esac |
RuslanUrya | 0:dfe6edabb8ec | 170 | shift |
RuslanUrya | 0:dfe6edabb8ec | 171 | done |
RuslanUrya | 0:dfe6edabb8ec | 172 | |
RuslanUrya | 0:dfe6edabb8ec | 173 | [ "$next_option" = '' ] || die "Expected argument for option '$next_option'" |