Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FastLED/FastLED.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Garcia <danielgarcia@gmail.com>2014-12-22 22:27:17 +0300
committerDaniel Garcia <danielgarcia@gmail.com>2014-12-22 22:27:17 +0300
commited19aede0bf095f28a381fad4f160a1725c14a2e (patch)
tree85397738552dd05ca43b377667e551033dd96939
parent44303ce7ced238da22853abbc571ac61d3c94d92 (diff)
Fixing up k20 related interrupt code
-rw-r--r--platforms/arm/k20/clockless_arm_k20.h4
-rw-r--r--platforms/arm/k20/clockless_block_arm_k20.h38
-rw-r--r--platforms/arm/k20/led_sysdefs_arm_k20.h3
3 files changed, 32 insertions, 13 deletions
diff --git a/platforms/arm/k20/clockless_arm_k20.h b/platforms/arm/k20/clockless_arm_k20.h
index 53b6f85b..0fb91222 100644
--- a/platforms/arm/k20/clockless_arm_k20.h
+++ b/platforms/arm/k20/clockless_arm_k20.h
@@ -99,9 +99,9 @@ protected:
#if (FASTLED_ALLOW_INTERRUPTS == 1)
cli();
- uint32_t next_mark = ARM_DWT_CYCCNT + (T1+T2+T3);
#endif
-
+ uint32_t next_mark = ARM_DWT_CYCCNT + (T1+T2+T3);
+
while(pixels.has(1)) {
pixels.stepDithering();
#if (FASTLED_ALLOW_INTERRUPTS == 1)
diff --git a/platforms/arm/k20/clockless_block_arm_k20.h b/platforms/arm/k20/clockless_block_arm_k20.h
index bebbf0d7..fb0bf1b3 100644
--- a/platforms/arm/k20/clockless_block_arm_k20.h
+++ b/platforms/arm/k20/clockless_block_arm_k20.h
@@ -17,7 +17,7 @@
#include "kinetis.h"
-template <uint8_t __LANES, int FIRST_PIN, int T1, int T2, int T3, EOrder RGB_ORDER = GRB, int XTRA0 = 0, bool FLIP = false, int WAIT_TIME = 50>
+template <uint8_t __LANES, int FIRST_PIN, int T1, int T2, int T3, EOrder RGB_ORDER = GRB, int XTRA0 = 0, bool FLIP = false, int WAIT_TIME = 40>
class InlineBlockClocklessController : public CLEDController {
typedef typename FastPin<FIRST_PIN>::port_ptr_t data_ptr_t;
typedef typename FastPin<FIRST_PIN>::port_t data_t;
@@ -66,14 +66,26 @@ public:
virtual void showColor(const struct CRGB & rgbdata, int nLeds, CRGB scale) {
MultiPixelController<LANES,PORT_MASK,RGB_ORDER> pixels(rgbdata,nLeds, scale, getDither() );
mWait.wait();
- showRGBInternal(pixels,nLeds);
+ uint32_t clocks = showRGBInternal(pixels,nLeds);
+ #if FASTLED_ALLOW_INTTERUPTS == 0
+ // Adjust the timer
+ long microsTaken = CLKS_TO_MICROS(clocks);
+ MS_COUNTER += (1 + (microsTaken / 1000));
+ #endif
+
mWait.mark();
}
virtual void show(const struct CRGB *rgbdata, int nLeds, CRGB scale) {
MultiPixelController<LANES,PORT_MASK,RGB_ORDER> pixels(rgbdata,nLeds, scale, getDither() );
mWait.wait();
- showRGBInternal(pixels,nLeds);
+ uint32_t clocks = showRGBInternal(pixels,nLeds);
+ #if FASTLED_ALLOW_INTTERUPTS == 0
+ // Adjust the timer
+ long microsTaken = CLKS_TO_MICROS(clocks);
+ MS_COUNTER += (1 + (microsTaken / 1000));
+ #endif
+
mWait.mark();
}
@@ -81,7 +93,14 @@ public:
virtual void show(const struct CARGB *rgbdata, int nLeds, CRGB scale) {
MultiPixelController<LANES,PORT_MASK,RGB_ORDER> pixels(rgbdata,nLeds, scale, getDither() );
mWait.wait();
- showRGBInternal(pixels,nLeds);
+ uint32_t clocks = showRGBInternal(pixels,nLeds);
+
+ #if FASTLED_ALLOW_INTTERUPTS == 0
+ // Adjust the timer
+ long microsTaken = CLKS_TO_MICROS(clocks);
+ MS_COUNTER += (1 + (microsTaken / 1000));
+ #endif
+
mWait.mark();
}
#endif
@@ -109,7 +128,7 @@ public:
next_mark = ARM_DWT_CYCCNT + (T1+T2+T3)-3;
*FastPin<FIRST_PIN>::sport() = PORT_MASK;
- while((next_mark - ARM_DWT_CYCCNT) > (T2+T3+6));
+ while((next_mark - ARM_DWT_CYCCNT) > (T2+T3+(2*(F_CPU/24000000))));
if(LANES>8) {
*FastPin<FIRST_PIN>::cport() = ((~b2.shorts[i]) & PORT_MASK);
} else {
@@ -120,7 +139,7 @@ public:
*FastPin<FIRST_PIN>::cport() = PORT_MASK;
b.bytes[i] = pixels.template loadAndScale<PX>(pixels,i,d,scale);
- b.bytes[i+(LANES/2)] = pixels.template loadAndScale<PX>(pixels,i,d,scale);
+ b.bytes[i+(LANES/2)] = pixels.template loadAndScale<PX>(pixels,i+(LANES/2),d,scale);
}
// if folks use an odd numnber of lanes, get the last byte's value here
@@ -132,7 +151,7 @@ public:
while(ARM_DWT_CYCCNT < next_mark);
next_mark = ARM_DWT_CYCCNT + (T1+T2+T3)-3;
*FastPin<FIRST_PIN>::sport() = PORT_MASK;
- while((next_mark - ARM_DWT_CYCCNT) > (T2+T3+6));
+ while((next_mark - ARM_DWT_CYCCNT) > (T2+T3+(2*(F_CPU/24000000))));
if(LANES>8) {
*FastPin<FIRST_PIN>::cport() = ((~b2.shorts[i]) & PORT_MASK);
} else {
@@ -180,10 +199,8 @@ public:
b0.bytes[i] = allpixels.loadAndScale0(i);
}
- #if (FASTLED_ALLOW_INTERRUPTS == 1)
cli();
uint32_t next_mark = ARM_DWT_CYCCNT + (T1+T2+T3);
- #endif
while(nLeds--) {
#if (FASTLED_ALLOW_INTERRUPTS == 1)
@@ -335,10 +352,8 @@ public:
b0.bytes[i] = allpixels.loadAndScale0(i);
}
- #if (FASTLED_ALLOW_INTERRUPTS == 1)
cli();
uint32_t next_mark = ARM_DWT_CYCCNT + (T1+T2+T3);
- #endif
while(nLeds--) {
allpixels.stepDithering();
@@ -364,6 +379,7 @@ public:
sei();
#endif
};
+ sei();
return ARM_DWT_CYCCNT;
}
diff --git a/platforms/arm/k20/led_sysdefs_arm_k20.h b/platforms/arm/k20/led_sysdefs_arm_k20.h
index ed87c026..a5a15429 100644
--- a/platforms/arm/k20/led_sysdefs_arm_k20.h
+++ b/platforms/arm/k20/led_sysdefs_arm_k20.h
@@ -31,4 +31,7 @@ typedef volatile uint8_t RoReg; /**< Read only 8-bit register (volatile co
typedef volatile uint8_t RwReg; /**< Read-Write 8-bit register (volatile unsigned int) */
#endif
+extern volatile uint32_t systick_millis_count;
+# define MS_COUNTER systick_millis_count
+
#endif