diff options
author | Daniel Friesel <derf@finalrewind.org> | 2017-12-04 15:19:25 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2017-12-04 15:19:25 +0100 |
commit | 7b5284023070b841293d0c5a6be0c6c345372cde (patch) | |
tree | 5f2c70451cf61ef6744813cac3a221cef210b213 /src/arch/msp430fr5969lp/arch.cc |
Add basic system: LED GPIO on MSP430FR5969 Launchpad and faked GPIO on POSIX
Diffstat (limited to 'src/arch/msp430fr5969lp/arch.cc')
-rw-r--r-- | src/arch/msp430fr5969lp/arch.cc | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/arch/msp430fr5969lp/arch.cc b/src/arch/msp430fr5969lp/arch.cc new file mode 100644 index 0000000..19416e1 --- /dev/null +++ b/src/arch/msp430fr5969lp/arch.cc @@ -0,0 +1,150 @@ +#include "arch.h" +#include <msp430.h> + +void Arch::setup(void) +{ + WDTCTL = WDTPW | WDTHOLD; + + PJSEL0 = BIT4 | BIT5; + + PM5CTL0 &= ~LOCKLPM5; + + FRCTL0 = FWPW; + FRCTL0_L = 0x10; + FRCTL0_H = 0xff; + + // 16MHz DCO + CSCTL0_H = CSKEY >> 8; + CSCTL1 = DCORSEL | DCOFSEL_4; + CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; + CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; + CSCTL0_H = 0; + + // enable LXFT for RTC + CSCTL0_H = CSKEY >> 8; + CSCTL4 &= ~LFXTOFF; + while (SFRIFG1 & OFIFG) { + CSCTL5 &= ~LFXTOFFG; + SFRIFG1 &= ~OFIFG; + } + CSCTL0_H = 0; + + __delay_cycles(1000000); + //P1OUT = 0; + //P4OUT = 0; +} + +void Arch::idle_loop(void) +{ + while (1); +} + +Arch arch; + +/* +void uart_setup(void) +{ + UCA0CTLW0 = UCSWRST | UCSSEL__SMCLK; + UCA0MCTLW = UCOS16 | (2<<5) | 0xD600; + UCA0BR0 = 104; + + UCA0IRCTL = 0; + UCA0ABCTL = 0; + + P2SEL0 &= ~(BIT0 | BIT1); + P2SEL1 |= BIT0 | BIT1; + P2DIR |= BIT0; + + UCA0CTLW0 &= ~UCSWRST; + + UCA0IE |= UCRXIE; +} + +void uart_putchar(char c) +{ + while (!(UCA0IFG & UCTXIFG)); + UCA0TXBUF = c; + + if (c == '\n') + uart_putchar('\r'); +} + +__attribute__((interrupt(USCI_A0_VECTOR))) void USCI_A0_ISR(void) +{ + static char prompt[64]; + static unsigned int prompt_pos = 0; + + char buf; + unsigned char raw_p_pos, parse_p_pos; + + char parsed_prompt[64]; + unsigned char argc = 0; + char *argv[32]; + + if (UCA0IFG & UCRXIFG) { + buf = UCA0RXBUF; + if (buf == '\r') { + + uart_putchar('\n'); + if (prompt_pos > 0) { + + parse_p_pos = 0; + argv[0] = parsed_prompt; + + for (raw_p_pos = 0; raw_p_pos < prompt_pos; raw_p_pos++) { + if (prompt[raw_p_pos] != ' ') { + parsed_prompt[parse_p_pos++] = prompt[raw_p_pos]; + } else if ((raw_p_pos > 0) && (prompt[raw_p_pos-1] != ' ')) { + argc++; + parsed_prompt[parse_p_pos++] = 0; + argv[argc] = parsed_prompt + parse_p_pos; + } + } + + if (parse_p_pos < 64) + parsed_prompt[parse_p_pos] = 0; + else + parsed_prompt[63] = 0; + + check_command(argc, argv); + prompt_pos = 0; + *prompt = 0; + } + uart_puts(COL_YELLOW "msp430fr5969" COL_GREEN " > " COL_RESET); + + } else if (buf == '\f') { + + uart_puts("\n" COL_YELLOW "msp430fr5969" COL_GREEN " > " COL_RESET); + uart_nputs(prompt, prompt_pos); + + } else if (buf == 0x7f) { + + if (prompt_pos) { + prompt_pos--; + uart_puts("\e[D \e[D"); + } + + } else if (buf == 0x15) { // ^U + + for ( ; prompt_pos > 0; prompt_pos-- ) + uart_puts("\e[D \e[D"); + *prompt = 0; + + } else if (buf == 0x17) { // ^W + + for ( ; (prompt_pos > 0) && (prompt[prompt_pos] != ' '); prompt_pos-- ) + uart_puts("\e[D \e[D"); + for ( ; (prompt_pos > 0) && (prompt[prompt_pos-1] == ' '); prompt_pos-- ) + uart_puts("\e[D \e[D"); + prompt[prompt_pos] = 0; + + } else if (buf >= ' ') { + + if (prompt_pos < sizeof(prompt)-1) { + prompt[prompt_pos++] = buf; + uart_putchar(buf); + } + } + } +} +*/ |