123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #include <stdbool.h>
- #include <stdint.h>
- #include "config.h"
- #include "led.h"
- struct ledda_ip {
- uint32_t _rsvd0;
- uint32_t pwrr;
- uint32_t pwrg;
- uint32_t pwrb;
- uint32_t _rsvd1;
- uint32_t bcrr;
- uint32_t bcfr;
- uint32_t _rsvd2;
- uint32_t cr0;
- uint32_t br;
- uint32_t onr;
- uint32_t ofr;
- } __attribute__((packed,aligned(4)));
- #define LEDDA_IP_CR0_LEDDEN (1 << 7)
- #define LEDDA_IP_CR0_FR250 (1 << 6)
- #define LEDDA_IP_CR0_OUTPOL (1 << 5)
- #define LEDDA_IP_CR0_OUTSKEW (1 << 4)
- #define LEDDA_IP_CR0_QUICK_STOP (1 << 3)
- #define LEDDA_IP_CR0_PWM_LINEAR (0 << 2)
- #define LEDDA_IP_CR0_PWM_LFSR (1 << 2)
- #define LEDDA_IP_CR0_SCALE_MSB(x) (((x) >> 8) & 3)
- #define LEDDA_IP_BR_SCALE_LSB(x) ((x) & 0xff)
- #define LEDDA_IP_ONOFF_TIME_MS(x) (((x) >> 5) & 0xff)
- #define LEDDA_IP_BREATHE_ENABLE (1 << 7)
- #define LEDDA_IP_BREATHE_MODULATE (1 << 5)
- #define LEDDA_IP_BREATHE_TIME_MS(x) (((x) >> 7) & 0x0f)
- struct led {
- uint32_t csr;
- uint32_t _rsvd[15];
- struct ledda_ip ip;
- } __attribute__((packed,aligned(4)));
- #define LED_CSR_LEDDEXE (1 << 1)
- #define LED_CSR_RGBLEDEN (1 << 2)
- #define LED_CSR_CURREN (1 << 3)
- static volatile struct led * const led_regs = (void*)(LED_BASE);
- static const uint32_t led_cr0_base =
- LEDDA_IP_CR0_FR250 |
- LEDDA_IP_CR0_OUTSKEW |
- LEDDA_IP_CR0_QUICK_STOP |
- LEDDA_IP_CR0_PWM_LFSR |
- LEDDA_IP_CR0_SCALE_MSB(480);
- void
- led_init(void)
- {
- led_regs->ip.pwrr = 0;
- led_regs->ip.pwrg = 0;
- led_regs->ip.pwrb = 0;
- led_regs->ip.bcrr = 0;
- led_regs->ip.bcfr = 0;
- led_regs->ip.onr = 0;
- led_regs->ip.ofr = 0;
- led_regs->ip.br = LEDDA_IP_BR_SCALE_LSB(480);
- led_regs->ip.cr0 = led_cr0_base;
- led_regs->csr = LED_CSR_LEDDEXE | LED_CSR_RGBLEDEN | LED_CSR_CURREN;
- }
- void
- led_color(uint8_t r, uint8_t g, uint8_t b)
- {
- #if defined(BOARD_ICEBREAKER)
-
- led_regs->ip.pwrr = b;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = r;
- #elif defined(BOARD_BITSY_V0)
-
- led_regs->ip.pwrr = g;
- led_regs->ip.pwrg = r;
- led_regs->ip.pwrb = b;
- #elif defined(BOARD_BITSY_V1)
-
- led_regs->ip.pwrr = r;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = b;
- #elif defined(BOARD_ICE1USB)
-
- led_regs->ip.pwrr = b;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = r;
- #elif defined(BOARD_ICEPICK)
-
- led_regs->ip.pwrr = b;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = r;
- #elif defined(BOARD_E1TRACER)
-
- led_regs->ip.pwrr = b;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = r;
- #else
-
- led_regs->ip.pwrr = r;
- led_regs->ip.pwrg = g;
- led_regs->ip.pwrb = b;
- #endif
- }
- void
- led_state(bool on)
- {
- if (on)
- led_regs->ip.cr0 = led_cr0_base | LEDDA_IP_CR0_LEDDEN;
- else
- led_regs->ip.cr0 = led_cr0_base;
- }
- void
- led_blink(bool enabled, int on_time_ms, int off_time_ms)
- {
-
- led_regs->csr = LED_CSR_RGBLEDEN | LED_CSR_CURREN;
-
- if (enabled) {
- led_regs->ip.onr = LEDDA_IP_ONOFF_TIME_MS(on_time_ms);
- led_regs->ip.ofr = LEDDA_IP_ONOFF_TIME_MS(off_time_ms);
- } else {
- led_regs->ip.onr = 0;
- led_regs->ip.ofr = 0;
- }
-
- led_regs->csr = LED_CSR_LEDDEXE | LED_CSR_RGBLEDEN | LED_CSR_CURREN;
- }
- void
- led_breathe(bool enabled, int rise_time_ms, int fall_time_ms)
- {
- if (enabled) {
- led_regs->ip.bcrr = LEDDA_IP_BREATHE_ENABLE |
- LEDDA_IP_BREATHE_MODULATE |
- LEDDA_IP_BREATHE_TIME_MS(rise_time_ms);
- led_regs->ip.bcfr = LEDDA_IP_BREATHE_ENABLE |
- LEDDA_IP_BREATHE_MODULATE |
- LEDDA_IP_BREATHE_TIME_MS(fall_time_ms);
- } else {
- led_regs->ip.bcrr = 0;
- led_regs->ip.bcfr = 0;
- }
- }
|