From 8c7ee88332652e7e79f6c1e4baacabe2183f7e8e Mon Sep 17 00:00:00 2001 From: root Date: Tue, 2 Mar 2021 12:54:03 +0000 Subject: working, with hybrid FLL/PLL, new refclk input and support for max7219 displays, neo 5 and neo 7 and a bazillion other fixes --- boot/max7219.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 155 insertions(+), 14 deletions(-) (limited to 'boot/max7219.c') diff --git a/boot/max7219.c b/boot/max7219.c index 3e06562..7a374eb 100644 --- a/boot/max7219.c +++ b/boot/max7219.c @@ -91,32 +91,173 @@ write_regs (uint8_t reg, uint8_t data1, uint8_t data2, uint8_t data3) set (0, 1, 0); } +#define SDP 0x80 +#define SA 0x40 +#define SB 0x20 +#define SC 0x10 +#define SD 0x08 +#define SE 0x04 +#define SF 0x02 +#define SG 0x01 + +static uint8_t hex (unsigned v) +{ + switch (v) { + case 0: + case '0': + return SA | SF | SB | SE | SC | SD; + + case 1: + case '1': + return SB | SC; + + case 2: + case '2': + case 'z': + return SA | SB | SG | SE | SD; + + case 3: + case '3': + return SA | SB | SG | SC | SD; + + case 4: + case '4': + return SF | SG | SB | SC; + + case 5: + case '5': + case 's': + return SA | SF | SG | SC | SD; + + case 6: + case '6': + return SA | SF | SG | SE | SC | SD; + + case 7: + case '7': + return SA | SB | SC; + + case 8: + case '8': + return SA | SF | SB | SG | SE | SC | SD; + + case 9: + case '9': + case 'g': + return SA | SF | SB | SG | SC | SD; + + case 0xa: + case 'a': + return SA | SF | SB | SG | SE | SC; + + case 0xb: + case 'b': + return SF | SG | SE | SC | SD; + + case 0xc: + case 'c': + return SG | SE | SD; + + case 0xd: + case 'd': + return SB | SG | SE | SC | SD; + + case 0xe: + case 'e': + return SA | SF | SG | SE | SD; + + case 0xf: + case 'f': + return SA | SF | SG | SE; + + case 'h': + return SF | SG | SE | SC; + + case 'i': + return SE; + + case 'j': + return SB | SC | SD; + + case 'k': + case 'x': + return SF | SB | SG | SE | SC; + + case 'l': + return SF | SE | SD; + + case 'm': + case 'n': + return SG | SE | SC; + + case 'o': + return SG | SE | SC | SD; + + case 'p': + return SA | SF | SB | SG | SE; + + case 'q': + return SA | SF | SB | SG | SC; + + case 'r': + return SG | SE; + + case 't': + return SF | SG | SE | SD; + + case 'u': + case 'w': + return SE | SC | SD; + + case 'y': + return SF | SB | SG | SC | SD; + + case '-': + return SG; + + case '.': + return SDP; + + } + + return 0; +} + +void max7219_report_addr (uint32_t baseaddr) +{ + unsigned i; + + for (i = 1; i <= 8; ++i) { + write_regs (i, hex (baseaddr & 0xf), 0, 0); + baseaddr >>= 4; + } +} + + void -max7219_init (void) +max7219 (const char *str) { MAP_OUTPUT_PP (SCK); MAP_OUTPUT_PP (NCS); MAP_OUTPUT_PP (MOSI); + unsigned reg; set (0, 1, 0); - write_reg (0xc, 0x1); //Power up - write_reg (0xf, 0x0); //normal mode + write_reg (0xc, 0x1); //Power up + write_reg (0xf, 0x0); //normal mode + + write_reg (0x9, 0x0); //No decode + write_reg (0xb, 0x7); //8 digits + write_regs (0xa, 15, 15, 15); //max brightness - write_reg (0x9, 0x0); //No decode - write_reg (0xb, 0x7); //8 digits - write_regs (0xa,15,15,15); //max brightness - write_reg (1,0); - write_reg (2,0); - write_reg (3,0); - write_reg (4,0); - write_reg (5,0); - write_regs (6,0xbe,0,0); - write_regs (7,0x47,0,0); - write_regs (8,0x3d,0,0); + for (reg = 8; reg && *str; reg--, str++) + write_regs (reg, hex (*str) | (!str[1] ? SDP : 0), 0, 0); + for (; reg; reg--) + write_reg (reg, 0); } -- cgit v1.2.3