Use software serial for Sun.
This commit is contained in:
parent
b64143d0dc
commit
6536dc9a14
@ -45,7 +45,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define MOUSEKEY_TIME_TO_MAX 20
|
#define MOUSEKEY_TIME_TO_MAX 20
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOUSEKEY_WHEEL_MAX_SPEED
|
#ifndef MOUSEKEY_WHEEL_MAX_SPEED
|
||||||
#define MOUSEKEY_WHEEL_MAX_SPEED 16
|
#define MOUSEKEY_WHEEL_MAX_SPEED 8
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX
|
#ifndef MOUSEKEY_WHEEL_TIME_TO_MAX
|
||||||
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40
|
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40
|
||||||
|
@ -38,12 +38,19 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <util/delay.h>
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stupid Inefficient Busy-wait Software Serial
|
||||||
|
* is still useful for negative logic signal like Sun protocol not supported by hardware USART.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WAIT_US (1000000/SERIAL_BAUD)
|
||||||
|
|
||||||
void serial_init(void)
|
void serial_init(void)
|
||||||
{
|
{
|
||||||
SERIAL_RX_INIT();
|
SERIAL_RXD_INIT();
|
||||||
}
|
}
|
||||||
|
|
||||||
// RX ring buffer
|
// RX ring buffer
|
||||||
@ -64,12 +71,44 @@ uint8_t serial_recv(void)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// USART RX complete interrupt
|
//ISR(INT2_vect)
|
||||||
ISR(SERIAL_RX_VECT)
|
ISR(SERIAL_RXD_VECT)
|
||||||
{
|
{
|
||||||
|
SERIAL_RXD_INT_ENTER()
|
||||||
|
|
||||||
|
uint8_t data = 0;
|
||||||
|
#ifdef SERIAL_BIT_ORDER_MSB
|
||||||
|
uint8_t pos = 0x80;
|
||||||
|
#else
|
||||||
|
uint8_t pos = 0x01;
|
||||||
|
#endif
|
||||||
|
// to center of start bit
|
||||||
|
_delay_us(WAIT_US/2);
|
||||||
|
do {
|
||||||
|
// to center of next bit
|
||||||
|
_delay_us(WAIT_US);
|
||||||
|
|
||||||
|
if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) {
|
||||||
|
data |= pos;
|
||||||
|
}
|
||||||
|
#ifdef SERIAL_BIT_ORDER_MSB
|
||||||
|
pos >>= 1;
|
||||||
|
#else
|
||||||
|
pos <<= 1;
|
||||||
|
#endif
|
||||||
|
} while (pos);
|
||||||
|
// to center of stop bit
|
||||||
|
_delay_us(WAIT_US);
|
||||||
|
|
||||||
|
#ifdef SERIAL_NEGATIVE_LOGIC
|
||||||
|
data = ~data;
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
|
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
|
||||||
if (next != rbuf_tail) {
|
if (next != rbuf_tail) {
|
||||||
rbuf[rbuf_head] = SERIAL_RX_DATA;
|
rbuf[rbuf_head] = data;
|
||||||
rbuf_head = next;
|
rbuf_head = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SERIAL_RXD_INT_EXIT();
|
||||||
}
|
}
|
2
rules.mk
2
rules.mk
@ -252,7 +252,7 @@ EXTMEMOPTS =
|
|||||||
# (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
|
# (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
|
||||||
#
|
#
|
||||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||||
LDFLAGS += -Wl,--relax
|
#LDFLAGS += -Wl,--relax
|
||||||
LDFLAGS += -Wl,--gc-sections
|
LDFLAGS += -Wl,--gc-sections
|
||||||
LDFLAGS += $(EXTMEMOPTS)
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
|
Reference in New Issue
Block a user