|
@@ -286,10 +286,10 @@ static int iguanair_receiver(struct iguanair *ir, bool enable)
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- * The iguana ir creates the carrier by busy spinning after each pulse or
|
|
|
|
- * space. This is counted in CPU cycles, with the CPU running at 24MHz. It is
|
|
|
|
|
|
+ * The iguanair creates the carrier by busy spinning after each half period.
|
|
|
|
+ * This is counted in CPU cycles, with the CPU running at 24MHz. It is
|
|
* broken down into 7-cycles and 4-cyles delays, with a preference for
|
|
* broken down into 7-cycles and 4-cyles delays, with a preference for
|
|
- * 4-cycle delays.
|
|
|
|
|
|
+ * 4-cycle delays, minus the overhead of the loop itself (cycle_overhead).
|
|
*/
|
|
*/
|
|
static int iguanair_set_tx_carrier(struct rc_dev *dev, uint32_t carrier)
|
|
static int iguanair_set_tx_carrier(struct rc_dev *dev, uint32_t carrier)
|
|
{
|
|
{
|
|
@@ -316,7 +316,14 @@ static int iguanair_set_tx_carrier(struct rc_dev *dev, uint32_t carrier)
|
|
sevens = (4 - cycles) & 3;
|
|
sevens = (4 - cycles) & 3;
|
|
fours = (cycles - sevens * 7) / 4;
|
|
fours = (cycles - sevens * 7) / 4;
|
|
|
|
|
|
- /* magic happens here */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The firmware interprets these values as a relative offset
|
|
|
|
+ * for a branch. Immediately following the branches, there
|
|
|
|
+ * 4 instructions of 7 cycles (2 bytes each) and 110
|
|
|
|
+ * instructions of 4 cycles (1 byte each). A relative branch
|
|
|
|
+ * of 0 will execute all of them, branch further for less
|
|
|
|
+ * cycle burning.
|
|
|
|
+ */
|
|
ir->packet->busy7 = (4 - sevens) * 2;
|
|
ir->packet->busy7 = (4 - sevens) * 2;
|
|
ir->packet->busy4 = 110 - fours;
|
|
ir->packet->busy4 = 110 - fours;
|
|
}
|
|
}
|