From 5e353f3431413fd123f3722dd4866d63a55fd3e1 Mon Sep 17 00:00:00 2001
From: Cleric-K <9365881+Cleric-K@users.noreply.github.com>
Date: Fri, 22 Feb 2019 23:00:22 +0200
Subject: [PATCH] Initial
---
.gitignore | 2 +
Makefile | 2 +
README.md | 109 +++++++++++++++++++++++++++++++
build/FS-I6X.bin | Bin 0 -> 97356 bytes
build/FS-I6X_with_bootloader.bin | Bin 0 -> 113740 bytes
images/bbsmooth.jpg | Bin 0 -> 66633 bytes
images/bbstepped.jpg | Bin 0 -> 60430 bytes
images/before_after.jpg | Bin 0 -> 69090 bytes
images/frames.jpg | Bin 0 -> 52465 bytes
images/p.jpg | Bin 0 -> 42007 bytes
images/smooth.jpg | Bin 0 -> 33902 bytes
images/stepped.jpg | Bin 0 -> 31470 bytes
images/updater.jpg | Bin 0 -> 40500 bytes
images/usb.jpg | Bin 0 -> 356690 bytes
images/ver.jpg | Bin 0 -> 70180 bytes
src/Makefile | 30 +++++++++
src/chan_hack.c | 46 +++++++++++++
src/fs-i6x.py | 48 ++++++++++++++
src/hooks.s | 6 ++
src/link.ld | 26 ++++++++
src/org.bin | Bin 0 -> 113680 bytes
21 files changed, 269 insertions(+)
create mode 100644 .gitignore
create mode 100644 Makefile
create mode 100644 README.md
create mode 100644 build/FS-I6X.bin
create mode 100644 build/FS-I6X_with_bootloader.bin
create mode 100644 images/bbsmooth.jpg
create mode 100644 images/bbstepped.jpg
create mode 100644 images/before_after.jpg
create mode 100644 images/frames.jpg
create mode 100644 images/p.jpg
create mode 100644 images/smooth.jpg
create mode 100644 images/stepped.jpg
create mode 100644 images/updater.jpg
create mode 100644 images/usb.jpg
create mode 100644 images/ver.jpg
create mode 100644 src/Makefile
create mode 100644 src/chan_hack.c
create mode 100644 src/fs-i6x.py
create mode 100644 src/hooks.s
create mode 100644 src/link.ld
create mode 100644 src/org.bin
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..20596b5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.o
+*.elf
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2840c18
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,2 @@
+all clean:
+ $(MAKE) -C src $@
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..68f78b0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,109 @@
+# FlySky FS-i6X Firmware Bug Fix
+
+## Why is this needed?
+
+The FlySky-i6X's official firmware has a bug which is decreasing its performance. It is not a hardware problem, but a software mistake. Unfortunately FlySky never addressed that bug with an official update. I tried on several occasions to get in contact with them and to ask them if they are even aware of the problem, but I never got any response back.
+
+The effect of this bug is not so pronounced that it makes the radio unusable (obviously). It is also technical enough that its nature can be grasped only when working with blackbox logs and applying some observation. For the average user it is simply the case that this radio seems to be _not_ of high enough quality compared to others.
+
+This firmware patch will not give your radio "superpowers" but it will simply make it work _as it was originally designed to_.
+
+This is how a single channel's data looks like before (with original firmware) and after (with bugfix):
+
+
+
+If you just want to install the update head over to the [How to flash](#how-to-flash) section.
+
+If you are interested in the details - read on.
+
+### The problem
+
+The radio data from the transmitter is sent over 2.4GHz in _frames_ (_packets_) of information. Each frame is a short sequence of binary data. There are different types of frames, carrying different kinds of information. The most important and most frequently sent frame type is the one that carries the _channel data_. These frames are sent at approximately 7 milliseconds interval (which is actually one of the best frame rates, compared to other radio brands).
+
+The problem is that although frames are sent every 7ms, most of the time we receive several frames which carry the _same channel data_!
+
+See this graph:
+
+
+
+This is just the first channel (roll). The rectangles represent the channel's value as it arrives with each frame. On the X axis we have time, on Y - the channel value [1000 - 2000]. Note how several consecutive frames carry the same channel value.
+
+In many cases this is not necessarily a problem. It simply means that the effective frame rate is lower. For example instead of getting fresh channel data every 7ms, you get it every 14 or 21ms.
+
+If you are flying airplanes or some other not-so-sensitive craft you might never sense a problem.
+
+The problem becomes more pronounced when the radio is used for higher-performance quad copters for example.
+
+Flight Controller software (Cleanflight, Betaflight) can detect quick movements of the sticks and apply further boost to the motors. This is much used in racing because it can provide more crisp and responsive behavior of the copter.
+
+In former versions this feature was called _Setpoint Weight_, now it has been extracted as the F (Feedforward) gain of the PID loop. The Feedforward component is a direct _derivative_ of the stick movement - if your stick is stationary F is zero, if your stick is moving F rises. The faster you move the stick, the higher F's value is (the sign of F depends on the _direction_ you are moving the stick).
+
+In the early days of flight controller software this has posed a problem: as we are using digital radio protocols and the channel data arrives in frames, channel values stay the same most of the time (between two frames) and then _jump_ to their new values when a new frame arrives. This does not work very well with F, because in the time between frames, when channel values stay the same, F should be zero. On the other hand, when new frame with different channel value arrives, F reacts to the _change_ and a _F kick_ is produced. On the next iteration of the PID loop F drops to zero again because channel data once again stays the same until the next frame.
+
+For this reason radio channel _interpolation_ was implemented (and later a low pass filter) - the software tries to smooth out the "staircase" shape of the axis values, so that the derivative is also smooth and F kicks are avoided.
+
+The following graph illustrates all this:
+
+
+
+It represents one channel (roll in the example). The curves are:
+* `debug[0]` is the _raw_ radio data. Notice how it jumps to new values as new frames arrive.
+* `RC Command` is the above radio data but after the interpolation/smoothing filter has been applied.
+* `Feedforward` is the _derivative_ of the above. Note that where `RC Command` is not changing (it is horizontal) F is zero and where `RC Command` is changing F has a value (the steeper the change of `RC Command`, the higher the value of F).
+
+As it's visible, the step-like shape of the `RC Command` produces _F kicks_ which can be quite significant. They translate to very erratic commands to the motors (they are asked very rapidly to increase speed then to reduce and so on) which decreases their effectiveness, increases heat and mechanical stress.
+
+Although this problem affects F the most, P is not immune to it either:
+
+
+
+We can see that P constantly changes direction while trying to keep the copter in sync with the stair case shaped commands.
+
+### So if the raw radio data passes through smoothing filter why is it still so step-like?
+
+The answer lies in the way the software configures the smoothing filter. By default the amount of smoothing is determined automatically based on the interval at which channel frames arrive (the frame rate). With FS-i6X this is about 7ms and the filter is setup in such a way that it has to "connect the dots" of two frames.
+> Keep in mind that when using filtering the `RC Command` curve is about one-frame-time behind of the actual radio data. This is because in realtime the flight controller does not know if it has to smooth the current value up or down until it sees the next frame. That's why interpolation/filtering always introduces some delay.
+
+
+
+Here with red we can see the actual frames (and because of the bug, several consecutive frames have the same value). As we can see the filter actually does pretty good job in smoothing out the curve _between two frames_. And here _"between two frames"_ is the key. Consider two frames with the same value - the smoothing actually works there, they are connected with a straight line - there's no reason for the filter to make a curvy line between points of the same value!
+
+In other words, from the filter's perspective there's no way to know that the arriving frame's data is _wrong_ - it looks like perfectly valid channel data (maybe we are somehow really moving our sticks in such a way) and it does its best to smooth out the line _between any two frames_.
+
+### The fix
+The firmware patch provided here fixes the software bug in the original firmware and sends the _actual_ axes values at _every frame_. Here's the result:
+
+
+
+
+
+Now the automatic RC filter achieves the desired effect and the F kicks are no longer present.
+
+> For more technical description of the fix see the [source code](src/chan_hack.c)
+
+## How to flash
+
+1. Head over to the [releases](../../releases) section and download the *bugfix* updater program. Just in case, the original firmware is also provided.
+
+2. You need a special cable. You can either buy one or you can create one yourself. Unlike the FS-i6, which uses UART communication, the FS-i6X uses USB:
+
+
+
+3. Connect the cable and open the `System`/`Firmware update` menu on your transmitter. Confirm that you want to enter the firmware update mode.
+
+4. Open the updater program. You should see the device detected:
+
+
+
+5. Click `Update`
+
+6. After the transmitter is restarted you can make sure the new version is active from the `System`/`Firmware ver.` menu:
+
+
+
+7. Enjoy!
+
+## Like it?
+
+If having the full potential of your device brought a smile on your face, you may shine back if you feel like it: [](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=L5789HZB5NAX4&lc=BG¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)\
+Thank you!!!
diff --git a/build/FS-I6X.bin b/build/FS-I6X.bin
new file mode 100644
index 0000000000000000000000000000000000000000..eda1c829b4ac949015cdb0fb6ccb0b961048e4e4
GIT binary patch
literal 97356
zcmb@u3w#^JwJ<)jyOLJ2Y|D=jSys%hY$q!xPMi=Rp%hlyu+iGi%L&f}D%lQ52`O?O
zRL-NwCQvy%Y6nW~gi?nV8fdvUb>n-Xmt5>XZwb)el}&ERgLXqH0$O_2mR9mh`p&HE
z5V-C4-QVy3w|}FZ_nbL1bLPxBXC~%G+-VW9?}B^eZp5Ph%ijgaGn4#V@c#~6;vcxS
zP5(3P_Kmr?PaglDX(zsg*wAB${SLT)ROc7ttNRg4`yP-{@<0ap(8|6~5gUX4Fuv$Y
z2Ev)dXaDYlh#dx4>jv{=EF+F{;VQG1FP|2_<28)Vk-sG><<;;jmd%ozDp2j8&exp?
z52C7S8436-t`fb-4c}_Tn@zo&{gD@`5VHWOiZ^^BIe7VTBh=Y>%pi+ZxCeEYYq-xP
z7s_=2n{|pgWH=mk^m%NfHn~i8LEN7wuX23TgTL*PF^72cU6lN2a+!UV2X%9DYXuU1
za~>Z?y>5AlY&w=ak
vwwSe`9c$UpMZ
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