diff options
Diffstat (limited to 'src/arch/msp430fr5969lp')
-rw-r--r-- | src/arch/msp430fr5969lp/Makefile.inc | 37 | ||||
-rw-r--r-- | src/arch/msp430fr5969lp/arch.cc | 150 | ||||
-rw-r--r-- | src/arch/msp430fr5969lp/driver/gpio.cc | 43 |
3 files changed, 230 insertions, 0 deletions
diff --git a/src/arch/msp430fr5969lp/Makefile.inc b/src/arch/msp430fr5969lp/Makefile.inc new file mode 100644 index 0000000..04069ae --- /dev/null +++ b/src/arch/msp430fr5969lp/Makefile.inc @@ -0,0 +1,37 @@ +# vim:ft=make + +CPU = 430x +MCU = msp430fr5969 + +INCLUDES += -Iinclude/msp430fr5969lp -I/opt/msp430/ti/gcc/include +COMMON_FLAGS += -mcpu=${CPU} -mmcu=${MCU} + +CC = /opt/msp430/ti/gcc/bin/msp430-elf-gcc +CXX = /opt/msp430/ti/gcc/bin/msp430-elf-g++ +OBJCOPY = /opt/msp430/ti/gcc/bin/msp430-elf-objcopy + +TARGETS += src/arch/msp430fr5969lp/arch.cc src/arch/msp430fr5969lp/driver/gpio.cc + +OBJECTS = ${TARGETS:.cc=.o} + +.cc.o: + ${CXX} ${INCLUDES} ${COMMON_FLAGS} ${CXXFLAGS} -c -o $@ ${@:.o=.cc} + +build/system.elf: ${OBJECTS} + ${CXX} ${INCLUDES} ${COMMON_FLAGS} ${CXXFLAGS} \ + -Wl,--library-path=/opt/msp430/ti/gcc/include/ \ + -flto -o $@ ${OBJECTS} + +build/system.hex: build/system.elf + ${OBJCOPY} -O ihex ${@:.hex=.elf} $@ + +program: build/system.hex + LD_LIBRARY_PATH=/home/derf/var/projects/msp430/MSP430Flasher_1.3.7 \ + /home/derf/var/projects/msp430/MSP430Flasher_1.3.7/MSP430Flasher \ + -w build/system.hex -v -g -z '[VCC]' + +arch_clean: + rm -f ${OBJECTS} + rm -f build/system.hex + +.PHONY: arch_clean program 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); + } + } + } +} +*/ diff --git a/src/arch/msp430fr5969lp/driver/gpio.cc b/src/arch/msp430fr5969lp/driver/gpio.cc new file mode 100644 index 0000000..e1179af --- /dev/null +++ b/src/arch/msp430fr5969lp/driver/gpio.cc @@ -0,0 +1,43 @@ +#include "driver/gpio.h" +#include <msp430.h> + +void GPIO::setup() +{ + P1OUT = 0; + P2OUT = 0; + P3OUT = 0; + P4OUT = 0; + P1DIR = BIT0; + P2DIR = 0; + P3DIR = 0; + P4DIR = BIT6; +} + +void GPIO::led_on(unsigned char id) +{ + if (id == 0) { + P1OUT |= BIT0; + } else { + P4OUT |= BIT6; + } +} + +void GPIO::led_off(unsigned char id) +{ + if (id == 0) { + P1OUT &= ~BIT0; + } else { + P4OUT &= ~BIT6; + } +} + +void GPIO::led_toggle(unsigned char id) +{ + if (id == 0) { + P1OUT ^= BIT0; + } else { + P4OUT ^= BIT6; + } +} + +GPIO gpio; |