c5ecde4ca0
- First in 8051def.h, it appears the uip_arch-asm.S file was copied from z80 and am unsure it will work properly. I modified the 8051def.h to prevent the UIP code from using these routines. - In dma.c the config routine provides access to all of the DMA channel options, except for the word mode flag. In order to maintain compatibility with any existing code I created a second routine and converted the original routine into a wrapper routine with a fixed word mode value. - uart.c::uart0_init was missing blocking access to the higher baud rates. I am not sure why, so I corrected this. - I also copied over to header files that provide some useful macros from the msp430 cpu. The files are lpm.h and hwconf.h. The lpm.h is for switching power modes, I think. The hwconf.h has various macros for configuring port I/O. By porting these files the led/button api's can be ported with minimal modifications.
183 lines
4.7 KiB
C
183 lines
4.7 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "cc2430_sfr.h"
|
|
|
|
#include "dev/leds.h"
|
|
#include "dev/uart.h"
|
|
|
|
static int (*uart0_input_handler)(unsigned char c);
|
|
static int (*uart1_input_handler)(unsigned char c);
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart0_init(uint32_t speed)
|
|
{
|
|
if(speed == 115200) {
|
|
U0BAUD=216; /*115200*/
|
|
U0GCR =11; /*LSB first and 115200*/
|
|
}
|
|
else if(speed == 38400) {
|
|
U0BAUD=59; /*38400*/
|
|
U0GCR =10; /*LSB first and 38400*/
|
|
}
|
|
else if(speed == 9600) {
|
|
U0BAUD= 59; /* 9600 */
|
|
U0GCR = 8; /*LSB first and 9600*/
|
|
}
|
|
else { return; }
|
|
|
|
#ifdef UART0_ALTERNATIVE_2
|
|
PERCFG |= U0CFG; /*alternative port 2 = P1.5-2*/
|
|
#ifdef UART0_RTSCTS
|
|
P1SEL |= 0x3C; /*peripheral select for TX and RX, RTS, CTS*/
|
|
#else
|
|
P1SEL |= 0x30; /*peripheral select for TX and RX*/
|
|
P1 &= ~0x08; /*RTS down*/
|
|
#endif
|
|
P1DIR |= 0x28; /*RTS, TX out*/
|
|
P1DIR &= ~0x14; /*CTS & RX in*/
|
|
#else
|
|
PERCFG &= ~U0CFG; /*alternative port 1 = P0.5-2*/
|
|
#ifdef UART0_RTSCTS
|
|
P0SEL |= 0x3C; /*peripheral select for TX and RX, RTS, CTS*/
|
|
#else
|
|
P0SEL |= 0x0C; /*peripheral select for TX and RX*/
|
|
P0 &= ~0x20; /*RTS down*/
|
|
#endif
|
|
P0DIR |= 0x28; /*RTS & TX out*/
|
|
P0DIR &= ~0x14; /*CTS & RX in*/
|
|
#endif
|
|
|
|
|
|
#ifdef UART0_RTSCTS
|
|
U0UCR = 0x42; /*defaults: 8N1, RTS/CTS, high stop bit*/
|
|
#else
|
|
U0UCR = 0x02; /*defaults: 8N1, no flow control, high stop bit*/
|
|
#endif
|
|
|
|
U0CSR = U_MODE | U_RE | U_TXB; /*UART mode, receiver enable, TX done*/
|
|
|
|
/*set priority group of group 3 to highest, so the UART won't miss bytes*/
|
|
IP1 |= IP1_3;
|
|
IP0 |= IP0_3;
|
|
|
|
IEN0_URX0IE = 1;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Write one byte over the UART. */
|
|
void
|
|
uart0_writeb(uint8_t byte)
|
|
{
|
|
IRCON2_UTX0IF = 0;
|
|
U0BUF = byte;
|
|
while(!IRCON2_UTX0IF); /* Wait until byte has been transmitted. */
|
|
IRCON2_UTX0IF = 0;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart0_set_input(int (*input)(unsigned char c))
|
|
{
|
|
uart0_input_handler = input;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart0_rxISR(void) __interrupt (URX0_VECTOR)
|
|
{
|
|
TCON_URX0IF = 0;
|
|
if(uart0_input_handler != NULL) {
|
|
uart0_input_handler(U0BUF);
|
|
}
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart0_txISR( void ) __interrupt (UTX0_VECTOR)
|
|
{
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
/* UART1 initialization */
|
|
void
|
|
uart1_init(uint32_t speed)
|
|
{
|
|
#ifdef UART1_ALTERNATIVE_1
|
|
PERCFG &= ~U1CFG; /*alternative port 1 = P0.5-2*/
|
|
#ifdef UART1_RTSCTS
|
|
P0SEL |= 0x3C; /*peripheral select for TX and RX, RTS, CTS*/
|
|
#else
|
|
P0SEL |= 0x30; /*peripheral select for TX and RX*/
|
|
P0 &= ~0x08; /*RTS down*/
|
|
#endif
|
|
P0DIR |= 0x18; /*RTS, TX out*/
|
|
P0DIR &= ~0x24; /*CTS, RX in*/
|
|
#else
|
|
PERCFG |= U1CFG; /*alternative port 2 = P1.7-4*/
|
|
#ifdef UART1_RTSCTS
|
|
P1SEL |= 0xF0; /*peripheral select for TX and RX*/
|
|
#else
|
|
P1SEL |= 0xC0; /*peripheral select for TX and RX*/
|
|
P1 &= ~0x20; /*RTS down*/
|
|
#endif
|
|
P1DIR |= 0x60; /*RTS, TX out*/
|
|
P1DIR &= ~0x90; /*CTS, RX in*/
|
|
#endif
|
|
|
|
if(speed == 115200) {
|
|
U1BAUD=216; /*115200*/
|
|
U1GCR =11; /*LSB first and 115200*/
|
|
}
|
|
|
|
if(speed == 38400) {
|
|
U1BAUD=59; /*38400*/
|
|
U1GCR =10; /*LSB first and 38400*/
|
|
}
|
|
|
|
if(speed == 9600) {
|
|
U1BAUD= 59; /* 9600 */
|
|
U1GCR = 8; /*LSB first and 9600*/
|
|
}
|
|
|
|
#ifdef UART1_RTSCTS
|
|
U1UCR = 0x42; /*defaults: 8N1, RTS/CTS, high stop bit*/
|
|
#else
|
|
U1UCR = 0x02; /*defaults: 8N1, no flow control, high stop bit*/
|
|
#endif
|
|
|
|
U1CSR = U_MODE | U_RE | U_TXB; /*UART mode, receiver enable, TX done*/
|
|
|
|
/*set priority group of group 3 to highest, so the UART won't miss bytes*/
|
|
IP1 |= IP1_3;
|
|
IP0 |= IP0_3;
|
|
|
|
IEN0_URX1IE = 1; /* Enable the RX interrupt */
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Write one byte over the UART. */
|
|
void
|
|
uart1_writeb(uint8_t byte)
|
|
{
|
|
IRCON2_UTX1IF = 0;
|
|
U1BUF = byte;
|
|
while(!IRCON2_UTX1IF); /* Wait until byte has been transmitted. */
|
|
IRCON2_UTX1IF = 0;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart1_set_input(int (*input)(unsigned char c))
|
|
{
|
|
uart1_input_handler = input;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart1_rxISR(void) __interrupt (URX1_VECTOR)
|
|
{
|
|
TCON_URX1IF = 0;
|
|
if(uart1_input_handler != NULL) {
|
|
uart1_input_handler(U1BUF);
|
|
}
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
void
|
|
uart1_txISR( void ) __interrupt (UTX1_VECTOR)
|
|
{
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|