mirror of
https://github.com/markqvist/OpenModem.git
synced 2024-10-01 03:15:46 -04:00
LED driver work
This commit is contained in:
parent
c22123b953
commit
372264d379
2
Makefile
2
Makefile
@ -28,7 +28,7 @@ FORMAT = ihex
|
|||||||
|
|
||||||
# List C source files here. (C dependencies are automatically generated.)
|
# List C source files here. (C dependencies are automatically generated.)
|
||||||
#SRC = $(TARGET).c
|
#SRC = $(TARGET).c
|
||||||
SRC = main.c hardware/Serial.c hardware/AFSK.c hardware/VREF.c util/CRC-CCIT.c protocol/AX25.c protocol/KISS.c
|
SRC = main.c hardware/Serial.c hardware/AFSK.c hardware/VREF.c hardware/LED.c util/CRC-CCIT.c protocol/AX25.c protocol/KISS.c
|
||||||
|
|
||||||
# If there is more than one source file, append them above, or modify and
|
# If there is more than one source file, append them above, or modify and
|
||||||
# uncomment the following:
|
# uncomment the following:
|
||||||
|
55
device.h
55
device.h
@ -13,6 +13,11 @@
|
|||||||
#define CONFIG_ADC_REF 128
|
#define CONFIG_ADC_REF 128
|
||||||
#define CONFIG_DAC_REF 255
|
#define CONFIG_DAC_REF 255
|
||||||
|
|
||||||
|
// TODO: Change this back to default
|
||||||
|
#define CONFIG_LED_INTENSITY 35
|
||||||
|
//#define CONFIG_LED_INTENSITY 192
|
||||||
|
#define COM_LED_TIMEOUT_MS 40
|
||||||
|
|
||||||
// Demodulator settings
|
// Demodulator settings
|
||||||
#define OPEN_SQUELCH true
|
#define OPEN_SQUELCH true
|
||||||
|
|
||||||
@ -39,10 +44,52 @@
|
|||||||
#if TARGET_CPU == m1284p
|
#if TARGET_CPU == m1284p
|
||||||
#define ADC_PORT PORTA
|
#define ADC_PORT PORTA
|
||||||
#define ADC_DDR DDRA
|
#define ADC_DDR DDRA
|
||||||
#define DAC_PORT PORTB
|
#define DAC_PORT PORTC
|
||||||
#define DAC_DDR DDRB
|
#define DAC_DDR DDRC
|
||||||
#define LED_PORT PORTC
|
#define VREF_PORT PORTD
|
||||||
#define LED_DDR DDRC
|
#define VREF_DDR DDRD
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_DDR DDRB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
PA0 ANALOG_IN
|
||||||
|
PA1
|
||||||
|
PA2
|
||||||
|
PA3
|
||||||
|
PA4
|
||||||
|
PA5
|
||||||
|
PA6
|
||||||
|
PA7
|
||||||
|
|
||||||
|
PB0 LED_RX
|
||||||
|
PB1 LED_TX
|
||||||
|
PB2 LED_STATUS
|
||||||
|
PB3 LED_DRAIN_PWM
|
||||||
|
PB4 LED_COM / SPI_SS PGM
|
||||||
|
PB5 SPI_MOSI SD/PGM
|
||||||
|
PB6 SPI_MISO SD/PGM
|
||||||
|
PB7 SPI_CLK SD/PGM
|
||||||
|
|
||||||
|
PC0 DAC_0
|
||||||
|
PC1 DAC_1
|
||||||
|
PC2 DAC_2
|
||||||
|
PC3 DAC_3
|
||||||
|
PC4 DAC_4
|
||||||
|
PC5 DAC_5
|
||||||
|
PC6 DAC_6
|
||||||
|
PC7 DAC_7
|
||||||
|
|
||||||
|
PD0 UART0_RX
|
||||||
|
PD1 UART0_TX
|
||||||
|
PD2 UART1_RX GPS
|
||||||
|
PD3 UART1_TX GPS
|
||||||
|
PD4
|
||||||
|
PD5
|
||||||
|
PD6 REF_DAC
|
||||||
|
PD7 REF_ADC
|
||||||
|
|
||||||
|
*/
|
@ -1,6 +1,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "AFSK.h"
|
#include "AFSK.h"
|
||||||
#include "util/time.h"
|
#include "util/time.h"
|
||||||
|
#include "hardware/LED.h"
|
||||||
#include "protocol/KISS.h"
|
#include "protocol/KISS.h"
|
||||||
|
|
||||||
// TODO: Remove testing vars ////
|
// TODO: Remove testing vars ////
|
||||||
@ -28,10 +29,6 @@ void AFSK_hw_init(void) {
|
|||||||
|
|
||||||
// Run DAC initialisation
|
// Run DAC initialisation
|
||||||
AFSK_dac_init();
|
AFSK_dac_init();
|
||||||
|
|
||||||
// Run LED initialisation
|
|
||||||
LED_TX_INIT();
|
|
||||||
LED_RX_INIT();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AFSK_dac_init(void) {
|
void AFSK_dac_init(void) {
|
||||||
|
@ -224,19 +224,6 @@ typedef struct Afsk
|
|||||||
#define AFSK_DAC_IRQ_START() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = true; } while (0)
|
#define AFSK_DAC_IRQ_START() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = true; } while (0)
|
||||||
#define AFSK_DAC_IRQ_STOP() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = false; } while (0)
|
#define AFSK_DAC_IRQ_STOP() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = false; } while (0)
|
||||||
|
|
||||||
// Here's some macros for controlling the RX/TX LEDs
|
|
||||||
// THE _INIT() functions writes to the DDR registers
|
|
||||||
// to configure the pins as output pins, and the _ON()
|
|
||||||
// and _OFF() functions writes to the PORT registers
|
|
||||||
// to turn the pins on or off.
|
|
||||||
#define LED_TX_INIT() do { LED_DDR |= _BV(1); } while (0)
|
|
||||||
#define LED_TX_ON() do { LED_PORT |= _BV(1); } while (0)
|
|
||||||
#define LED_TX_OFF() do { LED_PORT &= ~_BV(1); } while (0)
|
|
||||||
|
|
||||||
#define LED_RX_INIT() do { LED_DDR |= _BV(2); } while (0)
|
|
||||||
#define LED_RX_ON() do { LED_PORT |= _BV(2); } while (0)
|
|
||||||
#define LED_RX_OFF() do { LED_PORT &= ~_BV(2); } while (0)
|
|
||||||
|
|
||||||
void AFSK_init(Afsk *afsk);
|
void AFSK_init(Afsk *afsk);
|
||||||
void AFSK_adc_init(void);
|
void AFSK_adc_init(void);
|
||||||
void AFSK_dac_init(void);
|
void AFSK_dac_init(void);
|
||||||
|
57
hardware/LED.c
Normal file
57
hardware/LED.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#include "LED.h"
|
||||||
|
#include "util/time.h"
|
||||||
|
|
||||||
|
uint8_t ledIntensity = CONFIG_LED_INTENSITY;
|
||||||
|
uint32_t com_led_timeout = 0;
|
||||||
|
|
||||||
|
void LED_init(void) {
|
||||||
|
// Enable output for LED pins and drain pin
|
||||||
|
LED_DDR |= _BV(0) | // RX
|
||||||
|
_BV(1) | // TX
|
||||||
|
_BV(2) | // Status
|
||||||
|
_BV(3) | // PWM drain
|
||||||
|
_BV(4); // COM
|
||||||
|
|
||||||
|
LED_PORT &= 0b11100000;
|
||||||
|
|
||||||
|
TCCR0A = _BV(WGM00) |
|
||||||
|
_BV(WGM01) |
|
||||||
|
_BV(COM0A1)|
|
||||||
|
_BV(COM0A0);
|
||||||
|
|
||||||
|
TCCR0B = _BV(CS00);
|
||||||
|
|
||||||
|
OCR0A = ledIntensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LED_setIntensity(uint8_t value) {
|
||||||
|
ledIntensity = value;
|
||||||
|
OCR0A = ledIntensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LED_COM_ON(void) {
|
||||||
|
LED_PORT |= _BV(4);
|
||||||
|
int32_t xa = timer_clock();
|
||||||
|
com_led_timeout = xa + ms_to_ticks(COM_LED_TIMEOUT_MS);
|
||||||
|
if (xa > com_led_timeout) {
|
||||||
|
while(true) {
|
||||||
|
LED_COM_ON();
|
||||||
|
LED_RX_ON();
|
||||||
|
LED_TX_ON();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LED_COM_OFF(void) {
|
||||||
|
LED_PORT &= ~_BV(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_status(void) {
|
||||||
|
if (timer_clock() > com_led_timeout) {
|
||||||
|
if (LED_PORT & _BV(4)) {
|
||||||
|
printf("%d\r\n", timer_clock());
|
||||||
|
LED_COM_OFF();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
hardware/LED.h
Normal file
21
hardware/LED.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef LED_H
|
||||||
|
#define LED_H
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "device.h"
|
||||||
|
|
||||||
|
void LED_init(void);
|
||||||
|
void LED_setIntensity(uint8_t value);
|
||||||
|
|
||||||
|
#define LED_STATUS_ON() do { LED_PORT |= _BV(2); } while (0)
|
||||||
|
#define LED_STATUS_OFF() do { LED_PORT &= ~_BV(2); } while (0)
|
||||||
|
#define LED_TX_ON() do { LED_PORT |= _BV(1); } while (0)
|
||||||
|
#define LED_TX_OFF() do { LED_PORT &= ~_BV(1); } while (0)
|
||||||
|
#define LED_RX_ON() do { LED_PORT |= _BV(0); } while (0)
|
||||||
|
#define LED_RX_OFF() do { LED_PORT &= ~_BV(0); } while (0)
|
||||||
|
|
||||||
|
void LED_COM_ON(void);
|
||||||
|
void LED_COM_OFF(void);
|
||||||
|
void led_status(void);
|
||||||
|
|
||||||
|
#endif
|
@ -36,6 +36,7 @@ bool serial_available(uint8_t index) {
|
|||||||
|
|
||||||
|
|
||||||
int uart0_putchar(char c, FILE *stream) {
|
int uart0_putchar(char c, FILE *stream) {
|
||||||
|
LED_COM_ON();
|
||||||
loop_until_bit_is_set(UCSR0A, UDRE0);
|
loop_until_bit_is_set(UCSR0A, UDRE0);
|
||||||
UDR0 = c;
|
UDR0 = c;
|
||||||
return 1;
|
return 1;
|
||||||
@ -53,6 +54,7 @@ char uart0_getchar_nowait(void) {
|
|||||||
|
|
||||||
ISR(USART0_RX_vect) {
|
ISR(USART0_RX_vect) {
|
||||||
if (serial_available(0)) {
|
if (serial_available(0)) {
|
||||||
|
LED_COM_ON();
|
||||||
char c = uart0_getchar_nowait();
|
char c = uart0_getchar_nowait();
|
||||||
fifo_push(&serialFIFO, c);
|
fifo_push(&serialFIFO, c);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "util/FIFO.h"
|
#include "util/FIFO.h"
|
||||||
|
#include "hardware/LED.h"
|
||||||
|
|
||||||
typedef struct Serial {
|
typedef struct Serial {
|
||||||
FILE uart0;
|
FILE uart0;
|
||||||
|
@ -5,7 +5,7 @@ uint8_t dacReference = CONFIG_DAC_REF;
|
|||||||
|
|
||||||
void VREF_init(void) {
|
void VREF_init(void) {
|
||||||
// Enable output for OC2A and OC2B (PD7 and PD6)
|
// Enable output for OC2A and OC2B (PD7 and PD6)
|
||||||
DDRD |= _BV(7) | _BV(6);
|
VREF_DDR |= _BV(7) | _BV(6);
|
||||||
|
|
||||||
TCCR2A = _BV(WGM20) |
|
TCCR2A = _BV(WGM20) |
|
||||||
_BV(WGM21) |
|
_BV(WGM21) |
|
||||||
|
12
main.c
12
main.c
@ -5,6 +5,7 @@
|
|||||||
#include "hardware/VREF.h"
|
#include "hardware/VREF.h"
|
||||||
#include "hardware/AFSK.h"
|
#include "hardware/AFSK.h"
|
||||||
#include "hardware/Serial.h"
|
#include "hardware/Serial.h"
|
||||||
|
#include "hardware/LED.h"
|
||||||
#include "protocol/AX25.h"
|
#include "protocol/AX25.h"
|
||||||
#include "protocol/KISS.h"
|
#include "protocol/KISS.h"
|
||||||
#include "util/time.h"
|
#include "util/time.h"
|
||||||
@ -18,19 +19,25 @@ static void ax25_callback(struct AX25Ctx *ctx) {
|
|||||||
kiss_messageCallback(ctx);
|
kiss_messageCallback(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void system_check(void) {
|
||||||
|
// TODO: Implement this
|
||||||
|
LED_STATUS_ON();
|
||||||
|
}
|
||||||
|
|
||||||
void init(void) {
|
void init(void) {
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
// TODO: serial init was last before
|
|
||||||
serial_init(&serial);
|
serial_init(&serial);
|
||||||
stdout = &serial.uart0;
|
stdout = &serial.uart0;
|
||||||
stdin = &serial.uart0;
|
stdin = &serial.uart0;
|
||||||
|
|
||||||
VREF_init();
|
VREF_init();
|
||||||
|
LED_init();
|
||||||
AFSK_init(&modem);
|
AFSK_init(&modem);
|
||||||
ax25_init(&AX25, &modem, &modem.fd, ax25_callback);
|
ax25_init(&AX25, &modem, &modem.fd, ax25_callback);
|
||||||
|
|
||||||
kiss_init(&AX25, &modem, &serial);
|
kiss_init(&AX25, &modem, &serial);
|
||||||
|
|
||||||
|
system_check();
|
||||||
}
|
}
|
||||||
|
|
||||||
int main (void) {
|
int main (void) {
|
||||||
@ -40,6 +47,7 @@ int main (void) {
|
|||||||
ax25_poll(&AX25);
|
ax25_poll(&AX25);
|
||||||
kiss_poll();
|
kiss_poll();
|
||||||
kiss_csma();
|
kiss_csma();
|
||||||
|
led_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "hardware/Serial.h"
|
#include "hardware/Serial.h"
|
||||||
|
#include "hardware/LED.h"
|
||||||
#include "util/FIFO16.h"
|
#include "util/FIFO16.h"
|
||||||
#include "util/time.h"
|
#include "util/time.h"
|
||||||
#include "KISS.h"
|
#include "KISS.h"
|
||||||
@ -23,7 +24,7 @@ size_t packet_lengths_buf[CONFIG_QUEUE_MAX_LENGTH+1];
|
|||||||
AX25Ctx *ax25ctx;
|
AX25Ctx *ax25ctx;
|
||||||
Afsk *channel;
|
Afsk *channel;
|
||||||
Serial *serial;
|
Serial *serial;
|
||||||
volatile ticks_t last_serial_read = 0;
|
volatile last_serial_read = 0;
|
||||||
size_t frame_len;
|
size_t frame_len;
|
||||||
bool IN_FRAME;
|
bool IN_FRAME;
|
||||||
bool ESCAPE;
|
bool ESCAPE;
|
||||||
@ -222,6 +223,17 @@ void kiss_serialCallback(uint8_t sbyte) {
|
|||||||
// TODO: Remove this
|
// TODO: Remove this
|
||||||
} else if (command == CMD_FLUSHQUEUE_DEBUG) {
|
} else if (command == CMD_FLUSHQUEUE_DEBUG) {
|
||||||
kiss_flushQueueDebug();
|
kiss_flushQueueDebug();
|
||||||
|
} else if (command == CMD_LED_INTENSITY) {
|
||||||
|
if (sbyte == FESC) {
|
||||||
|
ESCAPE = true;
|
||||||
|
} else {
|
||||||
|
if (ESCAPE) {
|
||||||
|
if (sbyte == TFEND) sbyte = FEND;
|
||||||
|
if (sbyte == TFESC) sbyte = FESC;
|
||||||
|
ESCAPE = false;
|
||||||
|
}
|
||||||
|
LED_setIntensity(sbyte);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define CMD_SETHARDWARE 0x06
|
#define CMD_SETHARDWARE 0x06
|
||||||
#define CMD_FLUSHQUEUE 0x07
|
#define CMD_FLUSHQUEUE 0x07
|
||||||
#define CMD_FLUSHQUEUE_DEBUG 0x08
|
#define CMD_FLUSHQUEUE_DEBUG 0x08
|
||||||
|
#define CMD_LED_INTENSITY 0x09
|
||||||
#define CMD_READY 0x0F
|
#define CMD_READY 0x0F
|
||||||
#define CMD_RETURN 0xFF
|
#define CMD_RETURN 0xFF
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user