Jump to content
  • 5

Install CanBoot on SB2040


Flob74

Question

Hi everyone !

I got a Voron 2.4 controlled with a RP3 and an Octopus board. I want to upgrade it with a SB2040 from Mellow Fly, connected directly to the Octopus's canbus port. (Use a U2C or a canhat would be too easy).

 

But at the moment, Klipper can't connect to the octopus and the SB2040 seems unflashed (the blue LED which mean "firmware's running" remains off).

Sorry for the long post but, if it can help someone else, I have to detail everything. I did the following steps :

  • Make a CanBoot bootloader for the Octopus
  • Make a CanBoot bootloader for the SB2040
  • Flash the Octopus with STM32Cube Programmer and the CanBoot bootloader
  • Flash the SB2040 from the Raspberry PI and the Canboot bootloader
  • Make a Klipper bootloader for the Octopus
  • Make a Klipper bootloader for the SB2040
  • Flash the Octopus with the Raspberry PI and the Klipper bootloader
  • Flash the SB2040 throught the Octopus CanBus with the Klipper Bootloader
  • Then I cried 😥

The can0 interface is still setup (ifconfig), I got my two can_uuid :   [mcu] canbus_uuid: 3f56a5b6c36c ;  [mcu SB2040] canbus_uuid: 2d70e57a001c

But after I flashed the SB2040 through the canbus, his can_uuid disapeared. Of course, this probably comes from the fact that I can't use STM32Cube Programmer to make a "dual flash" ? I didn't truly understand the purpose of using STM32 Cube in that case.

I replaced the [mcu] section of the printer.cfg file with :

[mcu]
canbus_uuid: 3f56a5b6c36c

[mcu SB2040]
canbus_uuid: 2d70e57a001c

 

 

And the raspberry can't connect to the Octopus board. Klipper say : "mcu not available, try later". Not a surprise if Klipper is looking for the SB2040 mcu !

So, what did I miss ? Why after two flashs the SB2040 didn't have a firmware working ? Is there a software equivalent to STM32Cube to use with the RP2040 ?

 

Thank you for your help. I know that the Canboot project is very young, and I'm looking for troubles, but I hope that it will also help other peoples who face the same problem.

Link to comment
Share on other sites

Recommended Posts

  • 0
On 12/28/2022 at 3:58 PM, CocoMonGo said:

Hi I read this thread so many times trying to get my SB2040 and BTT Octopus 1.1 talking that I probably memorised part of it by now. Many thanks especially to @danja on the details you posted.

I was almost ready to post a help message here as I could not get my can0 up and running no matter what I did. Some how managed to get it up using this guide https://github.com/akhamar/voron_canbus_octopus_sb2040#useful-tricks-to-be-able-to-update-an-octopus-11-in-usb-to-can-bridge

Nice to see some proper guides popping up the past month or so. Clearly these boards are getting popular! 

Weird your CAN interface wasn't working till you reinstalled Moonraker - there was an update earlier in the year which changed how certain permissions work which could be related. Glad you got it sorted.

On a different topic, I finally tried out the onboard accelerometer with the SB2040 while watching the CAN BUS load. At 1Mbit it uses ~75% of the available bandwidth while measuring resonances on a single axis. I do have LED Effects running (just the "stock" Stealthburner setup from Git) but it's only powering the 3 basic RGBW pixels in the toolhead @ 24fps. I could easily see the bus getting overloaded with more LEDs or other traffic.

I don't know enough about CANBUS or its implementation in Klipper/Linux/Octopus to say how far the bandwidth could be pushed beyond 1Mb, but I expect this will become a hot topic before long in the Klipper space, considering how popular CAN seems to be getting and the flurry of activity in the Klipper project to support it.

Edit - Just had a quick look at the Octopus schematics and it seems to be using the MCP2542 CAN transceiver, which supports CAN-FD (FD = flexible data rate) up to 8Mbit/s, so that shouldn't be a bottleneck. However, the STM32F4 CAN interface only support "classic" CAN at up to 1Mbit. I'm not sure what this means in practice, and I've not yet looked into the CAN implementation on the SB2040 to see if it can do >1Mbit.

Edited by danja
Link to comment
Share on other sites

  • 0
15 hours ago, CocoMonGo said:

Does anyone have recommendation for the PCB cover for a Stealthburner+cw2 or the 3d model for the fly-sb2040? Would like to use a 2006 fan to keep the electronics cooler

I don't know anything about PCB covers but on the Mellow-3D github they have .step files for the PCB. They are extremely detailed and large (93MB) so I converted it to .stl and decimated the mesh in Blender.

fly-sb2040-PCB.stl

Link to comment
Share on other sites

  • 0
4 hours ago, CocoMonGo said:

@lemmingDev How do you secure your fans though? By screws or glue? I am planning to use a 2006 5v fan and modeled it but yet to print. To avoid metal screws I was just thinking of using high temp RTV left over from the gluing the heated bed silicon heater.

Friction fit, just like the other 2 fans in Stealthburner

Link to comment
Share on other sites

  • 0

Well, I have tried all night (Ozzie time) to flash the SB2040 with CanBoot without any luck. Followed the instructions of @danja from this thread, as well as https://github.com/akhamar/voron_canbus_octopus_sb2040#useful-tricks-to-be-able-to-update-an-octopus-11-in-usb-to-can-bridge and https://mellow.klipper.cn/#/advanced/canboot without any luck. After flashing the SB2040, the board has a flashing LED, which means it has not flashed correctly.

Here is my  pi's output which would indicate all went according to plan, though as per the Mellow Fly website, the LED should be solid. And there is no can0 interface.

 

Any help or guidance will be appreciated.

Thank you

Start Pi output:

 

pi@Trident:~/CanBoot $ make menuconfig

Loaded configuration '/home/pi/CanBoot/.config'

Configuration saved to '/home/pi/CanBoot/.config'

pi@Trident:~/CanBoot $ make clean

  Creating symbolic link out/board

pi@Trident:~/CanBoot $ make

  Creating symbolic link out/board

  Building out/autoconf.h

  Compiling out/src/sched.o

  Compiling out/src/bootentry.o

  Compiling out/src/command.o

  Compiling out/src/flashcmd.o

  Compiling out/src/initial_pins.o

  Compiling out/src/led.o

  Compiling out/src/rp2040/armcm_canboot.o

  Compiling out/src/rp2040/main.o

  Compiling out/src/rp2040/gpio.o

  Compiling out/src/rp2040/timer.o

  Compiling out/src/rp2040/flash.o

  Compiling out/src/../lib/rp2040/pico/flash/hw_flash.o

  Compiling out/src/generic/armcm_irq.o

  Compiling out/src/generic/crc16_ccitt.o

  Compiling out/src/rp2040/can.o

  Compiling out/src/rp2040/chipid.o

  Compiling out/src/../lib/can2040/can2040.o

  Compiling out/src/generic/canserial.o

  Compiling out/src/generic/canbus.o

  Compiling out/src/../lib/fast-hash/fasthash.o

  Building out/compile_time_request.o

  Building rp2040 stage2 out/stage2.o

  Preprocessing out/src/rp2040/rp2040_link.ld

  Linking out/canboot.elf

  Creating bin file out/canboot.bin

  Building out/lib/rp2040/elf2uf2/elf2uf2

  Creating uf2 file out/canboot.uf2

pi@Trident:~/CanBoot $ lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Bus 001 Device 005: ID 2e8a:0003 Raspberry Pi RP2 Boot

Bus 001 Device 003: ID 1d50:6177 OpenMoko, Inc. stm32f446xx

Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

pi@Trident:~/CanBoot $ sudo make flash FLASH_DEVICE=2e8a:0003

  Flashing out/canboot.uf2

Loaded UF2 image with 31 pages

Found rp2040 device on USB bus 1 address 5

Flashing...

Resetting interface

Locking

Exiting XIP mode

Erasing

Flashing

Rebooting device

pi@Trident:~/CanBoot $ sudo nano /etc/network/interfaces.d/can0

image.thumb.png.f924181b41e01b21d0b9a41d8b69a5ca.png

pi@Trident:~/CanBoot $ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000

    link/ether e4:5f:01:ba:38:9a brd ff:ff:ff:ff:ff:ff

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether e4:5f:01:ba:38:9b brd ff:ff:ff:ff:ff:ff

    inet 192.168.131.208/24 brd 192.168.131.255 scope global dynamic noprefixroute wlan0

       valid_lft 3111sec preferred_lft 2661sec

    inet6 fda1:ec99:5d50:42c1:d22f:b0c4:3d04:2d87/64 scope global dynamic mngtmpaddr noprefixroute

       valid_lft 1755sec preferred_lft 1755sec

    inet6 fe80::5983:f624:f753:1a1/64 scope link

       valid_lft forever preferred_lft forever

 

 

 

 

 

END PI OUTPUT

 

 

Link to comment
Share on other sites

  • 0

Follow up: Have got the boards flashed with the SB2040 having a solid blue LED now. The issue is in the creation of the can0 network interface. Despite "creating the interface", it is not showing up and cannot be brought online. Will search the Raspi forums to see where I went wrong. (Flashed the pi with mainsailos 64 bit)

Output from raspi console:

 

pi@Trident:~ $ sudo nano /etc/network/interfaces.d/can0

(Contents of said file:

 

allow-hotplug can0
iface can0 can static
  bitrate 1000000
  up ifconfig $IFACE txqueuelen 1024

)

 

 

 

 

pi@Trident:~ $ sudo ifup can0

Cannot find device "can0"

ifup: failed to bring up can0

pi@Trident:~ $ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000

    link/ether e4:5f:01:ba:38:9a brd ff:ff:ff:ff:ff:ff

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether e4:5f:01:ba:38:9b brd ff:ff:ff:ff:ff:ff

    inet 192.168.131.208/24 brd 192.168.131.255 scope global dynamic noprefixroute wlan0

       valid_lft 3546sec preferred_lft 3096sec

    inet6 fda1:ec99:5d50:42c1:c1a4:283e:b767:da75/64 scope global dynamic mngtmpaddr noprefixroute

       valid_lft 1621sec preferred_lft 1621sec

    inet6 fe80::1de:c51d:1cf7:2375/64 scope link

       valid_lft forever preferred_lft forever

pi@Trident:~ $

 

Link to comment
Share on other sites

  • 0
On 1/17/2023 at 6:14 PM, mvdveer said:

Well, I have tried all night (Ozzie time) to flash the SB2040 with CanBoot without any luck. Followed the instructions of @danja from this thread, as well as https://github.com/akhamar/voron_canbus_octopus_sb2040#useful-tricks-to-be-able-to-update-an-octopus-11-in-usb-to-can-bridge and https://mellow.klipper.cn/#/advanced/canboot without any luck. After flashing the SB2040, the board has a flashing LED, which means it has not flashed correctly.

Here is my  pi's output which would indicate all went according to plan, though as per the Mellow Fly website, the LED should be solid. And there is no can0 interface.

Any help or guidance will be appreciated.

Thank you

Start Pi output:

pi@Trident:~/CanBoot $ make menuconfig

Loaded configuration '/home/pi/CanBoot/.config'

Configuration saved to '/home/pi/CanBoot/.config'

pi@Trident:~/CanBoot $ make clean

  Creating symbolic link out/board

pi@Trident:~/CanBoot $ make

  Creating symbolic link out/board

  Building out/autoconf.h

  Compiling out/src/sched.o

  Compiling out/src/bootentry.o

  Compiling out/src/command.o

  Compiling out/src/flashcmd.o

  Compiling out/src/initial_pins.o

  Compiling out/src/led.o

  Compiling out/src/rp2040/armcm_canboot.o

  Compiling out/src/rp2040/main.o

  Compiling out/src/rp2040/gpio.o

  Compiling out/src/rp2040/timer.o

  Compiling out/src/rp2040/flash.o

  Compiling out/src/../lib/rp2040/pico/flash/hw_flash.o

  Compiling out/src/generic/armcm_irq.o

  Compiling out/src/generic/crc16_ccitt.o

  Compiling out/src/rp2040/can.o

  Compiling out/src/rp2040/chipid.o

  Compiling out/src/../lib/can2040/can2040.o

  Compiling out/src/generic/canserial.o

  Compiling out/src/generic/canbus.o

  Compiling out/src/../lib/fast-hash/fasthash.o

  Building out/compile_time_request.o

  Building rp2040 stage2 out/stage2.o

  Preprocessing out/src/rp2040/rp2040_link.ld

  Linking out/canboot.elf

  Creating bin file out/canboot.bin

  Building out/lib/rp2040/elf2uf2/elf2uf2

  Creating uf2 file out/canboot.uf2

pi@Trident:~/CanBoot $ lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Bus 001 Device 005: ID 2e8a:0003 Raspberry Pi RP2 Boot

Bus 001 Device 003: ID 1d50:6177 OpenMoko, Inc. stm32f446xx

Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

pi@Trident:~/CanBoot $ sudo make flash FLASH_DEVICE=2e8a:0003

  Flashing out/canboot.uf2

Loaded UF2 image with 31 pages

Found rp2040 device on USB bus 1 address 5

Flashing...

Resetting interface

Locking

Exiting XIP mode

Erasing

Flashing

Rebooting device

pi@Trident:~/CanBoot $ sudo nano /etc/network/interfaces.d/can0

image.thumb.png.f924181b41e01b21d0b9a41d8b69a5ca.png

pi@Trident:~/CanBoot $ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000

    link/ether e4:5f:01:ba:38:9a brd ff:ff:ff:ff:ff:ff

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether e4:5f:01:ba:38:9b brd ff:ff:ff:ff:ff:ff

    inet 192.168.131.208/24 brd 192.168.131.255 scope global dynamic noprefixroute wlan0

       valid_lft 3111sec preferred_lft 2661sec

    inet6 fda1:ec99:5d50:42c1:d22f:b0c4:3d04:2d87/64 scope global dynamic mngtmpaddr noprefixroute

       valid_lft 1755sec preferred_lft 1755sec

    inet6 fe80::5983:f624:f753:1a1/64 scope link

       valid_lft forever preferred_lft forever

END PI OUTPUT

Hiya, do you know what you did in order to fix this issue? I'm facing a very similar one currently, I have a can0 network, but my SB2040 has a flashing LED and is not showing up as a CanBoot device, my can0 file reads:

 

allow-hotplug can0
iface can0 can static
 bitrate 1000000
 up ifconfig $IFACE txqueuelen 1024
 pre-up ip link set can0 type can bitrate 1000000 
 pre-up ip link set can0 txqueuelen 1024

 

Link to comment
Share on other sites

  • 0
14 hours ago, onlinecryptid said:

Hiya, do you know what you did in order to fix this issue? I'm facing a very similar one currently, I have a can0 network, but my SB2040 has a flashing LED and is not showing up as a CanBoot device, my can0 file reads:

1. In the directory /etc/network/, there is are two files: interfaces and interfaces.new

From what I have read, network management in Linux has changed and the solution was to edit these files and change source-directory to source only:

Content of said file:

"# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd

# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d         ---------------------------->     source    /etc/network/interfaces.d"

 

2. Connect both the flashed (Canboot) octopus board and the SB2040 (with the jumper for the 120ohm resistor on the shown pins - canbus 120 ohm)) to the Raspi and in configuration of the CanBoot firmware for the SB2040 do not activate the LED

image.png.982828baf41e05b4465b9633316314b9.png

image.thumb.png.95eac4fe1258d6977bd1fc8f561bfed7.pngimage.png.3adbb3e12bb698a0c9dbea450dfe6649.png

Having done this seemed to fix the problem and flashed the SB2040 with the canboot image.

Then follow the instructions  here to complete flashing and setting up the boards.

Hope this solves your issue, as it did mine.

 

 

Link to comment
Share on other sites

  • 0
7 hours ago, mvdveer said:

2. Connect both the flashed (Canboot) octopus board and the SB2040 (with the jumper for the 120ohm resistor on the shown pins - canbus 120 ohm)) to the Raspi and in configuration of the CanBoot firmware for the SB2040 do not activate the LED

image.png.982828baf41e05b4465b9633316314b9.png

Happy you got it working in the end. Some of this can get a bit confusing. Re the status LED, are you saying that was the reason it didn't seem to flash correctly earlier?

Re manually bringing the can0 interface up, I'm blurry on some of the details myself, but I get the impression that either Klipper and/or some part of the kernel playing a role here. The interface is "static", which needs an address (e.g. IP address for TCP/IP interfaces) to be defined. Normally you hard-code one in the config, but my hunch is when Klipper connects to the microcontroller (flashed as a CAN bridge) it's getting the extra details it needs to configure the interface and bring it up.

If you really wanted to bring it up by itself, you could try changing "static" to "manual", then using ifup... not that this will really help get Klipper working.

Link to comment
Share on other sites

  • 0
59 minutes ago, danja said:

Happy you got it working in the end. Some of this can get a bit confusing. Re the status LED, are you saying that was the reason it didn't seem to flash correctly earlier?

It was, as this was the only setting I changed in menuconfig.

 

On previous attempts on two different boards, I had both "gpio pins to set to bootloader" as well as "Enable status LED" set to gpio24. This somehow caused an issue or conflict. As soon as I compiled without "Enable status LED", it compiled without a hitch. Once it compiled with canboot, I built the Klipper file and flashed the SB2040 first time round.

But then again, I only bridged the 120ohm resistor towards the end - perhaps this had an effect as well.

Thanks for your help and detailed instructions - helped a lot

Link to comment
Share on other sites

  • 0
3 hours ago, Daten said:

What method did you use to attach to the octopus's BUS RJ11 port,

Used an old telephone cable with connector, soldered it to the Data lines (high and low)

image.thumb.jpeg.f1ba880a2e9248f8caca60aa06de555a.jpeg

I used the instructions from the manual (p24) found here to correctly identify data H and data L (Mine was the side A configuratio :

 

image.thumb.png.139ab5ee0e5d4ddfacf4c56ae2d209d1.png

 

Link to comment
Share on other sites

  • 0
18 minutes ago, Wick said:

my Plan is to use an Adapter to avoid possible cabling/data errors that may be caused by different wire diameters

 

Sensible solution. Never ever seen one of these, therefor did not even consider. May have to look into that. Oh wifey is not going to be happy!

Link to comment
Share on other sites

  • 0

I soldered directly to an old telephone cable end and have not had any data errors in a couple of weeks
I didn't even bother twisting the data lines of the provided SB2040 wiring and it's rock solid

That being said, I will twist the wires and add one of those RJ11 screw terminal connectors when I get around to wire management

Edited by lemmingDev
Link to comment
Share on other sites

  • 0

 

On 1/21/2023 at 4:13 AM, Daten said:

@danja  Thank you for the excellent write up,  Quick question,  What method did you use to attach to the octopus's BUS RJ11 port, I'm thinking of using a screw terminal breakout but just interested to know how you approached it,  Thanks!

I had some old RJ plugs and crimper for doing Ethernet cables, I just checked the schematic to get the order of the wires right and crimped a plug on the end of the supplied loom. No issues as yet. Those adapters should work fine as well if prefer.

Link to comment
Share on other sites

  • 0

Hello everyone 🙂

after approx 15 hours, 8 clean installs of mainsail and everything I found on goggle (and here in this thread) x2 I think I finally found the solution of why "can0" is not showing up with akhamar manual from github (or any other variant I tried). And in the end the solution was (as often) very simple.

If you follow the guide and "ip a" doesn't show the can0 network, simply continue with the manual and flash the octopus with klipper and reboot! Directly afterwards can0 appears. (Did it twice for confirmation now, with different bitrates, mainsail x86 & x64 etc...)

Don't know if it everything works as expected yet because I don't have my printer.cfg written yet but at least everything looks like it's supposed to from "putty perspective". 🙂

Other than that I followed the manual 100% now (inkl. gpio24 pin, ensure that you type "gpio24" and not "24", 1000000 /1024...) and did nothing extra. Only set the 120Ohm jumper on the SB2040 at the getgo, and after flashing canboot to the SB2040 I unplugged usb and connected the can / power connector.)

 

---------
If someone has a Trident // SB2040 // Octopus printer.cfg as an example (mine is from a formbot kit) it would be much appreachiated.

 

 

Edited by chrizZztian
  • Like 2
Link to comment
Share on other sites

  • 0

Hey @all,

 

at the moment I'm really struggling to make this thing running.

I already flashed the boards 1000 times and are trying to make it run the whole week 😞

 

Using your instruction here i hoped it will run fast.

What already worked of @danjas instruction from above:

- Flash klipper onto the Octopus with USB to CAN bridge activated

- flash CanBoot to the SB2040 -> used here the hint from @mvdveer not activating the LED -> LED directly gets solid led (flash done)

- creating the can0 interface:

 

allow-hotplug can0
iface can0 can static
    bitrate 500000
    up ifconfig $IFACE txqueuelen 128

 

Bring it online with "sudo ifup can0"

image.png.5d80242ed2a48d63b2b20744816e7ef2.png

 

- Afterwards i connect the SB2040 to the Octopus by CANBUS with the following adapter 

image.png.4f6b51881188afa3431fc95332931956.png

 

At step 8 I have problems.

You need to query all the can devices to configure klipper mcus.

But only one CAN device shows up, which is the octopus board.

image.png.0965ab80cee1fda8659c48660d621dce.png

 

Hope someone can help me to make this thing running 😞

 

Greetings from Bavaria, Germany

Manuel

 

 

 

Edited by Mane660
Link to comment
Share on other sites

  • 0

 

Ok maybe i found the main issue for this. 

I did not flash the CanBoot Bootloader to my BTT Octopus.

After this I went on to go for it and noticed that I'm not able to go into DFU Mode with my Octopus.

I put the Jumper on the right place and pressed the reset button.

Does someone know why its not working?

image.png.0f6b672fc0d9d87a5f7f8718c5555b69.png

 

Solved: Jumper are low quality... -> had not contact therefore no DFU mode...

Edited by Mane660
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...