Compare commits

..

No commits in common. "master" and "JTAG" have entirely different histories.
master ... JTAG

40 changed files with 293 additions and 2347 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,176 +0,0 @@
##############################################
# $Id: $
package main;
use strict;
use warnings;
use SetExtensions;
my %sets = (
"clear:noArg" => "",
"time:noArg" => "",
"raw" => "",
);
sub
Betty_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "^y.*";
$hash->{SetFn} = "Betty_Set";
$hash->{DefFn} = "Betty_Define";
$hash->{ParseFn} = "Betty_Parse";
$hash->{AttrList} = "IODev ". $readingFnAttributes;
}
###################################
sub
Betty_Set($@) {
my ($hash, @a) = @_;
return "set $hash->{NAME} needs at least one parameter" if(@a < 2);
my $me = shift @a;
my $cmd = shift @a;
my $arg = shift @a;
my $arg2 = shift @a;
return join(" ", sort keys %sets) if ($cmd eq "?");
if ($cmd eq "clear") {
my @cH = ($hash);
delete $_->{READINGS} foreach (@cH);
return undef;
} elsif ($cmd eq "raw") {
my $msg = $arg;
#IOWrite( $hash, $msg );
IOWrite( $hash, "y", $msg );
return undef;
} elsif ($cmd eq "time") {
my $address = $hash->{ADDRESS};
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $m = sprintf("%02d%02d%02d%02d",$mday,$wday,$month+1, $year-100);
my $n = sprintf("%02d%02d%02d",$sec, $min, $hour );
my $msg = "w".$address;
IOWrite( $hash, "y", $msg );
$msg = "s0a".$address."0003".$m.$n;
IOWrite( $hash, "y", $msg );
return undef;
}
return "Unknown argument $cmd, choose one of ". join(" ", sort keys %sets);
}
#############################
sub
Betty_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "wrong syntax: define <name> Betty <address>"
if(int(@a) < 2 || int(@a) > 4);
my $address = uc($a[2]);
$hash->{ADDRESS} = $address;
$modules{Betty}{defptr}{$address} = $hash;
AssignIoPort($hash);
readingsSingleUpdate($hash, "state", "Initialized", 1);
return undef;
}
sub
Betty_Parse($$)
{
my ($hash,$msg) = @_;
my ($len,$dest,$src,$service,$data) = unpack 'x1A2A2A2A2A*',$msg;
my $def = $modules{Betty}{defptr}{$src};
if(!$def) {
DoTrigger("global","UNDEFINED Betty_$src Betty $src");
$def = $modules{Betty}{defptr}{$src};
if(!$def) {
Log3 $hash, 1, "Betty UNDEFINED, address $src";
return "UNDEFINED Betty_$src Betty $src";
}
}
$hash = $def;
my $name = $hash->{NAME};
# packet_RFenc
if ($service eq '04') {
my ($addr,$key) = unpack 'A2A2',$data;
if($hash->{helper}{lastkey } ne $key) {
$hash->{helper}{lastkey } = $key;
$key = sprintf "%02x", hex($key) & 0x7F;
readingsSingleUpdate($hash, "key", $addr."_".$key , 1);
}
# packet_test
} elsif ($service eq '01') {
$data = latin1ToUtf8(pack("H*",$data));
readingsSingleUpdate($hash, "test", $data , 1);
# packet_time
} elsif ($service eq '03') {
my ($request) = unpack 'A2',$data;
if($request eq "FF") {
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $m = sprintf("%02d%02d%02d%02d",$mday,$wday,$month+1, $year-100);
my $n = sprintf("%02d%02d%02d",$sec, $min, $hour );
$msg = "s0a".$src."0003".$m.$n;
IOWrite( $hash, "y", $msg );
}
} else {
Log3 $hash, 4, "Betty UNKNOWN MESSAGE $service: $data";
}
return $name;
}
1;
=pod
=item summary devices communicating with the Betty remote control
=item summary_DE Anbindung der Betty Fernbedienung
=begin html
<a name="Betty"></a>
<h3>Betty</h3>
<ul>
Todo
</ul>
=end html
=cut

View file

@ -55,7 +55,7 @@ ifeq ($(MAKECMDGOALS),debug)
COMPILE += -D DEBUGMODE
OPTFLAGS = -O0
else
OPTFLAGS = -Og
OPTFLAGS = -Os
endif
ifeq ($(MAKECMDGOALS),release)

View file

@ -157,7 +157,7 @@ void beep(unsigned char n) {
SIDsetfrq(0,5001);
break;
}
//PWMPR = 0;
PWMPR = 0;
switchSound(SOUND_ON);
SID.flags |= SIDenable;
SID.reg[REG_Control] |= GATE;

View file

@ -101,12 +101,12 @@ struct SID_ {
struct SID_ SID;
extern unsigned int playtone_cb;
extern unsigned char *playtone[3];
extern unsigned char playstate;
extern unsigned char tonelen[3];
extern unsigned short playcounter;
extern unsigned short playcountermax;
unsigned int playtone_cb;
unsigned char *playtone[3];
unsigned char playstate;
unsigned char tonelen[3];
unsigned short playcounter;
unsigned short playcountermax;
void SIDsetfrq(unsigned char voice, unsigned short frq);
void SIDsetadsr(unsigned char voice,unsigned char attack, unsigned char decay, unsigned char sustain, unsigned char release);

View file

@ -769,7 +769,6 @@ const unsigned char song1[] = {
0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70,
0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70,
0xa2,0x25,0x00,0x00,0x21,0x11,0x70,0xd2,0x0f,0x00,0x00,0x21,0x00,0x70,
/*
0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70,
0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70,
0x1f,0x15,0x00,0x00,0x21,0x11,0x70,0xc3,0x10,0x00,0x00,0x21,0x00,0x70,
@ -1002,5 +1001,4 @@ const unsigned char song1[] = {
0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70,
0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70,
0xc1,0x2c,0x00,0x00,0x21,0x11,0x70,0x31,0x1c,0x00,0x00,0x21,0x00,0x70
*/
};

View file

@ -20,7 +20,6 @@
#include "sound.h"
#include "soundirq.h"
#include "lpc2220.h"
#include "pwm.h"
#define AUTO_OFF_TIME 0x4000
@ -38,7 +37,7 @@ unsigned char timeout;
unsigned int auto_timeout;
void startSoundIRQ(void)
{/*
{
timeout = 0;
auto_timeout = 0;
out1 = 0;
@ -58,7 +57,6 @@ void startSoundIRQ(void)
//VICVectCntl0 = VIC_SLOT_EN | INT_SRC_PWM;
VICIntSelect |= INT_PWM;
VICIntEnable = INT_PWM;
*/
}
void initSound(void)
@ -69,18 +67,12 @@ void initSound(void)
tval = 0;
last_sample = 0;
bl_val = 0x3F;
timeout = 0;
auto_timeout = 0;
out1 = 0;
}
void switchSound(unsigned char onoff)
{
if(onoff)
{
PWM_set_frequency(30864);
sound_shutdown = 0;
PINSEL0 &= ~(3 << (2 * SND_PWM)); // IO
PINSEL0 |= (2 << (2 * SND_PWM)); // PWM
@ -89,7 +81,6 @@ void switchSound(unsigned char onoff)
FIODIR0 |= (1<<SND_ON) | (1<<SND_EN);
FIOSET0 = (1<<SND_EN);
FIOCLR0 = (1<<SND_ON);
}
else
{

View file

@ -21,7 +21,6 @@
#include "sound.h"
#include "sid.h"
#include "lpc2220.h"
#include "pwm.h"
#define AUTO_OFF_TIME 0x4000
@ -36,21 +35,20 @@ extern volatile char last_sample;
*/
unsigned int tval;
unsigned char bl_val, cmp_val; // backlight PWM
unsigned int slen;
unsigned char *sdata;
unsigned char sact;
unsigned char out1;
unsigned char last_sample;
unsigned char sound_shutdown;
unsigned char tcount;
const unsigned char prevvoice[3] = {2,0,1};
void __attribute__ ((section(".text.fastcode"))) soundIRQ (void)
{
PWMIR = 0x01;
/*
// play sample
if(sact != 0)
{
@ -78,9 +76,8 @@ void __attribute__ ((section(".text.fastcode"))) soundIRQ (void)
PWMLER = 0x04;
}
}
// synthesize
else */if(SID.flags & SIDenable)
else if(SID.flags & SIDenable)
{
unsigned short tempphase;
unsigned char x;
@ -214,4 +211,16 @@ void __attribute__ ((section(".text.fastcode"))) soundIRQ (void)
}
}
// backlight pwm
cmp_val += bl_val;
if (cmp_val >= 63)
{
FIODIR0 |= (1<<4); // sck0/P0.4
cmp_val -= 63;
}
else
{
FIODIR0 &= ~(1<<4); // sck0/P0.4
}
}

View file

@ -71,9 +71,9 @@ proc betty_init { } {
# Memory Bank Configuration
# BCFG0: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 0 @ 0x80000000
mww 0xffe00000 0x10001CA0
mww 0xffe00000 0x10000420
# BCFG2: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 1 @ 0x82000000
mww 0xffe00008 0x10001CA0
mww 0xffe00008 0x10000420
# BCFG1: 8 bit, 3 sram wst, rble, 5 wst 3 idcy : Betty: LCD @ 0x81000000
mww 0xffe00004 0x00000400
@ -108,8 +108,8 @@ proc flash_boop {IMAGE} {
flash erase_check 0
flash erase_sector 0 0 last
flash erase_check 0
flash write_bank 0 $IMAGE 0
reset run
flash write_bank 0 $IMAGE 0
reset run
}
proc start_debug {} {

Binary file not shown.

View file

@ -26,74 +26,58 @@
#include "cc1100.h"
#include "irq.h"
// Deviation = 21.423340
// Base frequency = 433.254913
// Carrier frequency = 433.254913
// Channel number = 0
// Carrier frequency = 433.254913
// Modulated = true
// Modulation format = GFSK
// Manchester enable = false
// Sync word qualifier mode = 30/32 sync word bits detected
// Preamble count = 4
// Channel spacing = 184.982300
// Carrier frequency = 433.254913
// Data rate = 37.4908
// RX filter BW = 210.937500
// Data format = Normal mode
// CRC enable = true
// Whitening = false
// Device address = 1
// Address config = Address check and 0 (0x00) broadcast
// CRC autoflush = true
// PA ramping = false
// TX power = 0
// Rf settings for CC1101
const unsigned char conf[] = {
0x29, // IOCFG2 GDO2 Output Pin Configuration
0x2E, // IOCFG1 GDO1 Output Pin Configuration
0x06, // IOCFG0 GDO0 Output Pin Configuration
0x47, // FIFOTHR RX FIFO and TX FIFO Thresholds
0xD3, // SYNC1 Sync Word, High Byte
0x91, // SYNC0 Sync Word, Low Byte
0x3E, // PKTLEN Packet Length
0x1A, // PKTCTRL1 Packet Automation Control
0x05, // PKTCTRL0 Packet Automation Control
0x01, // ADDR Device Address
0x00, // CHANNR Channel Number
0x06, // FSCTRL1 Frequency Synthesizer Control
0x00, // FSCTRL0 Frequency Synthesizer Control
0x10, // FREQ2 Frequency Control Word, High Byte
0x0B, // FREQ1 Frequency Control Word, Middle Byte
0xE6, // FREQ0 Frequency Control Word, Low Byte
0x8A, // MDMCFG4 Modem Configuration
0x6C, // MDMCFG3 Modem Configuration
0x13, // MDMCFG2 Modem Configuration
0x22, // MDMCFG1 Modem Configuration
0xC1, // MDMCFG0 Modem Configuration
0x35, // DEVIATN Modem Deviation Setting
0x04, // MCSM2 Main Radio Control State Machine Configuration
0x0C, // MCSM1 Main Radio Control State Machine Configuration
0x38, // MCSM0 Main Radio Control State Machine Configuration
0x16, // FOCCFG Frequency Offset Compensation Configuration
0x6C, // BSCFG Bit Synchronization Configuration
0x43, // AGCCTRL2 AGC Control
0x40, // AGCCTRL1 AGC Control
0x91, // AGCCTRL0 AGC Control
0x46, // WOREVT1 High Byte Event0 Timeout
0x50, // WOREVT0 Low Byte Event0 Timeout
0x78, // WORCTRL Wake On Radio Control
0x56, // FREND1 Front End RX Configuration
0x10, // FREND0 Front End TX Configuration
0xE9, // FSCAL3 Frequency Synthesizer Calibration
0x2A, // FSCAL2 Frequency Synthesizer Calibration
0x00, // FSCAL1 Frequency Synthesizer Calibration
0x1F, // FSCAL0 Frequency Synthesizer Calibration
0x41, // RCCTRL1 RC Oscillator Configuration
0x00, // RCCTRL0 RC Oscillator Configuration
//setting 6_WOR
const unsigned char conf[0x2F] = {
0x29, // IOCFG2
0x2E, // IOCFG1
0x06, // IOCFG0
0x47, // FIFOTHR
0xD3, // SYNC1
0x91, // SYNC0
0x3E, // PKTLEN
0x1A, // PKTCTRL1
0x45, // PKTCTRL0
0x01, // ADDR
0x01, // CHANNR
0x06, // FSCTRL1
0x00, // FSCTRL0
0x10, // FREQ2 #
0x0B, // FREQ1 #
0xDA, // FREQ0 # -> 433,249969 MHz
0x8A, // MDMCFG4
0x75, // MDMCFG3
0x13, // MDMCFG2
0x22, // MDMCFG1
0xC1, // MDMCFG0 CHANSPC_M
0x35, // DEVIATN
0x04, // MCSM2
0x0C, // MCSM1 0c
0x38, // MCSM0
0x16, // FOCCFG
0x6C, // BSCFG
0x43, // AGCCTRL2
0x40, // AGCCTRL1
0x91, // AGCCTRL0
0x46, // WOREVT1
0x50, // WOREVT0
0x78, // WORCTRL
0x56, // FREND1
0x10, // FREND0
0xA9, // FSCAL3
0x0A, // FSCAL2
0x00, // FSCAL1
0x11, // FSCAL0
0x41, // RCCTRL1
0x00, // RCCTRL0
0x57, // FSTEST
0x7F, // PTEST
0x3F, // AGCTEST
0x98, // TEST2
0x31, // TEST1
0x0B // TEST0
};
const unsigned char confasync[] = {
const unsigned char confasync[0x2F] = {
0x0D, // IOCFG2
0x0D, // IOCFG1
0x2E, // IOCFG0
@ -136,6 +120,12 @@ const unsigned char confasync[] = {
0x1F, // FSCAL0
0x41, // RCCTRL1
0x00, // RCCTRL0
0x59, // FSTEST
0x7F, // PTEST
0x3F, // AGCTEST
0x81, // TEST2
0x35, // TEST1
0x09 // TEST0
};
void cc1100_init(void) {
@ -174,7 +164,7 @@ void cc1100_init(void) {
while (SSPSR & (1<<4));
xx = SSPDR;
cc1100_write((0x00 | BURST ),(unsigned char*)conf,sizeof(conf));
cc1100_write((0x00 | BURST ),(unsigned char*)conf,0x2f);
cc1100_write1(PATABLE,0xC0);
cc1100_strobe(SIDLE);
cc1100_strobe(SPWD);

View file

@ -118,8 +118,8 @@
#define MARCSTATE_IDLE 0x01
#define MARCSTATE_RX 0x0d
extern const unsigned char conf[]; //__attribute__((aligned(0x4)));
extern const unsigned char confasync[];// __attribute__((aligned(0x4)));
const unsigned char conf[0x2F] __attribute__((aligned(0x4)));
const unsigned char confasync[0x2F] __attribute__((aligned(0x4)));
void cc1100_init(void);
unsigned char cc1100_write(unsigned char addr, unsigned char* data, unsigned char length);

View file

@ -485,14 +485,14 @@ void RFasyncmode(unsigned char on) {
RF_changestate(RFidle);
while(RF.state != RFidle);
stopRFIRQ();
cc1100_write((0x00 | BURST ),(unsigned char*)confasync,sizeof((unsigned char*)confasync));
cc1100_write((0x00 | BURST ),(unsigned char*)confasync,0x2f);
cc1100_write1(PATABLE,0xf0);
PINSEL1 &= 0xfffffffc; // GDO0 as GPIO
FIODIR0 |= GDO0; // output
}
else {
PINSEL1 |= 1; // GDO0 as EINT0
cc1100_write((0x00 | BURST ),(unsigned char*)conf,sizeof((unsigned char*)conf));
cc1100_write((0x00 | BURST ),(unsigned char*)conf,0x2f);
cc1100_write1(PATABLE,0xC0);
cc1100_strobe(SIDLE);
load_RF_setting();

View file

@ -182,7 +182,7 @@ Reset_Handler:
/* --+--+-+-+-+-+--------+-----+-------+-+---- */
/* ldr r1, =0x10000400 /* 00|01|0|0|0|0|00000000|00000|1|00000|0|0000 16bit, rble, 3wst - 10 mhz*/
/* ldr r1, =0x10000420 /* 00|01|0|0|0|0|00000000|00000|1|00001|0|0000 16bit, rble, 4wst - 30 mhz*/
ldr r1, =0x10001CA0 /* 00|01|0|0|0|0|00000000|00101|1|00101|0|0000 16bit, rble, 6wst - 60 mhz*/
ldr r1, =0x100004A0 /* 00|01|0|0|0|0|00000000|00000|1|00101|0|0000 16bit, rble, 6wst - 60 mhz*/
str r1,[r0] /* set bcfg0 (flash) */
str r1,[r0,#0x08] /* set bcfg2 (flash) */

View file

@ -29,7 +29,6 @@
#include "ir_selector.h"
#include "infrared.h"
#include "sid.h"
#include "sidfiles.h"
#include "timerfuncs.h"
#include "sound.h"
#include "lpc2220.h"
@ -862,35 +861,6 @@ void test_RF(void) {
cur_ep->bufferlen = 3;
cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce | EPsendwor;
RF_changestate(RFtx);
} else if(KEY_1)
{
struct RFendpoint_* cur_ep;
cur_ep = openEP(0,0, packet_test);
if(cur_ep) {
cur_ep->dest = destAddr;
cur_ep->data[0] = 'X';
cur_ep->data[1] = '1';
cur_ep->data[2] = 0x00;
cur_ep->bufferlen = 3;
cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce;
RF_changestate(RFtx);
}
}
else if(KEY_2)
{
struct RFendpoint_* cur_ep;
cur_ep = openEP(0,0, packet_test);
cur_ep->dest = destAddr;
cur_ep->data[0] = 'X';
cur_ep->data[1] = '2';
cur_ep->data[2] = 0x00;
cur_ep->bufferlen = 3;
cur_ep->flags |= EPenabled | EPoutput | EPnewdata | EPonce ;
RF_changestate(RFtx);
}
}
@ -964,9 +934,6 @@ void test_sid(void) {
draw_string (0, 95, "color keys", LCD_COLOR_B, DRAW_PUT);
draw_string (0, 104, "set waveform", LCD_COLOR_B, DRAW_PUT);
draw_string (0, 120, "Mute", LCD_COLOR_B, DRAW_PUT);
draw_string (0, 129, "Raiders March", LCD_COLOR_B, DRAW_PUT);
sysInfo |= SYS_IR;
SID.noise = 0xaa;
playstate = 0x00;
@ -1085,20 +1052,6 @@ void test_sid(void) {
playtone_cb = addTimerCB(SIDplaytone, 4);
startCB(playtone_cb);
}
} else if (KEY_Mute)
{
if (playstate == 0)
{
playstate = 1;
playtone[0] = (unsigned char*)&song1[0];
playcounter = 0;
playcountermax = sizeof(song1)/14;
playtone_cb = addTimerCB(SIDplaydump, 4);
startCB(playtone_cb);
}
}
} while (!KEY_Exit);
sysInfo &= ~SYS_IR;

View file

@ -1,5 +1,5 @@
THUMBSRCS := infrared.c codes.c encoders.c ir_capture.c ir_selector.c
SRCS := infraredirq.c pwm.c
THUMBSRCS := infrared.c codes.c encoders.c ir_capture.c ir_selector.c
SRCS := infraredirq.c
THUMBSRCSUNOPT := ir_itt.c ir_nrc17.c \
ir_raw.c ir_rc5.c ir_rc6.c ir_rca.c ir_rcmm.c ir_rec80.c ir_recs80.c ir_rf.c \
ir_sirc.c ir_spaceenc.c ir_lirc.c

View file

@ -222,7 +222,7 @@ const struct TABLES_N RAW =
const struct TABLES_L LIRC =
{
10,
9,
{
{
#include "ir_codes/lirc/ufs922"
@ -259,10 +259,6 @@ const struct TABLES_L LIRC =
{
#include "ir_codes/lirc/samsung_ue46b6000"
"Samsung TV"
},
{
#include "ir_codes/lirc/beo4"
"bang & olufsen"
}
}
}
};

View file

@ -25,7 +25,6 @@
#include "encoders.h"
#include "codes.h"
#include "ir_selector.h"
#include "pwm.h"
volatile unsigned char mod_enable;
volatile unsigned char hi_border;
@ -62,9 +61,9 @@ void startIrIRQ(void)
// T1PR = 0x01;
T1MCR = 0x03;
VICVectAddr1 = (unsigned long)&(irIRQ);
VICVectCntl1 = VIC_SLOT_EN | INT_SRC_TIMER1;
//VICIntSelect |= INT_TIMER1;
//VICVectAddr1 = (unsigned long)&(irIRQ);
//VICVectCntl1 = VIC_SLOT_EN | INT_SRC_TIMER1;
VICIntSelect |= INT_TIMER1;
VICIntEnable = INT_TIMER1;
}
@ -110,21 +109,11 @@ void defStopper(void)
void runIR(void)
{
T1TCR = 0x01;
PWM_set_IR_duty_cycle(0);
}
void setIRspeed(struct irModule module)
{
PWM_set_frequency(15000000 / (module.tval * module.lo_border));
ir.duty_cycle =(module.hi_border * 100) / module.lo_border;
}
void stopIR(void)
{
T1TCR = 0x03;
PWM_set_IR_duty_cycle(0);
}
void copyMapC(unsigned char *map)

View file

@ -63,8 +63,28 @@ struct IR_VARS_ {
unsigned long actpre_data;
unsigned long post_data; // data which the remote sends after actual keycode
unsigned long actpost_data;
unsigned long cycles_counter;
unsigned short flags; // flags
unsigned short phead,shead; // header
unsigned short plead; // leading pulse
unsigned short ptrail; // trailing pulse
unsigned short pfoot,sfoot; // foot
unsigned short pre_p,pre_s; // signal between pre_data and keycode
unsigned short post_p,post_s; // signal between keycode and post_code
unsigned short gap;
unsigned short repeat_gap;
unsigned short prepeat,srepeat;
unsigned short cycles_counter;
unsigned char bits; // bits (length of code)
unsigned char pre_data_bits; // length of pre_data
unsigned char post_data_bits; // length of post_data
unsigned char rc6_bit; // doubles signal length of this bit (only used for RC-6)
unsigned char pthree,sthree; // 3 (only used for RC-MM)
unsigned char ptwo,stwo; // 2 (only used for RC-MM)
unsigned char pone,sone; // 1
unsigned char pzero,szero; // 0
unsigned char min_repeat;
unsigned char bit;
unsigned char map;
unsigned char stop;
unsigned char repeats;
} lirc;
@ -73,12 +93,11 @@ struct IR_VARS_ {
unsigned int actcmd;
unsigned char toggle;
unsigned char state;
unsigned char duty_cycle;
} ir;
//#define setIRspeed( _m ) { if(sysInfo & 0x80) T1MR0 = _m.tval1; else T1MR0 = _m.tval; }
//#define setIRspeed( _m ) { T1MR0 = _m.tval; }
#define setIRspeed( _m ) { T1MR0 = _m.tval; }
void __attribute__ ((section(".text.fastcode"))) defIR(void);
void defSender(unsigned long cmd);
@ -90,7 +109,6 @@ void startIrIRQ(void);
void setIR(struct irModule module);
void runIR(void);
void stopIR(void);
void setIRspeed(struct irModule module);
unsigned long setEncoder( unsigned char _x, unsigned char _y );

View file

@ -23,8 +23,9 @@
#include "keyboard.h"
#include "rf.h"
#include "cc1100.h"
#include "pwm.h"
static unsigned int c_cnt = 0;
static unsigned int b_len = 0;
extern volatile unsigned char mod_enable;
extern volatile unsigned char hi_border;
extern volatile unsigned char lo_border;
@ -34,15 +35,33 @@ extern ir_fn irEncoder;
void __attribute__ ((section(".text.fastcode"))) irIRQ(void)
{
irEncoder();
if(mod_enable) {
PWM_set_IR_duty_cycle(ir.duty_cycle);
} else {
PWM_set_IR_duty_cycle(0);
c_cnt++;
if(c_cnt <= hi_border)
{
FIOSET0 = (mod_enable<<21);
}
else
{
FIOCLR0 = (1<<21);
if(c_cnt >= lo_border)
{
c_cnt = 0;
b_len++;
if(b_len >= cycles)
{
irEncoder();
b_len = 0;
if(!hi_border) { //RF mode
if(mod_enable)
FIOCLR0 = GDO0;
else
FIOSET0 = GDO0;
}
}
}
}
T1IR = 1;
// VICVectAddr = 0;
}

View file

@ -1 +0,0 @@
/* infrared codes for bang & olufsen Copyright (C) 2017 <kölnsolar> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /*pre_data*/ 0x00000000, // 2. start bit /*post_data*/ 0x00000000, /*toggle_bit_mask*/ 0x00, /*gap*/ 18000, // final gap to prevent collision /*repeat_gap*/ 0, /*bits*/ 17, // last(4.) start bit logical low as first data bit ==> 1+16 data bits = 17 /*pre_data_bits*/ 1, // 2. start bit /*post_data_bits*/ 0, /*rc6_bit*/ 0, /*frequency*/ 455000, // regular freq is 455kHz but to get a valid result 454,5 is used /*flags*/ LIRC_BO, /*header*/ 200,3125, // 1. start bit /*three*/ 0,0, /*two*/ 0,0, /*one*/ 200,9375, /*zero*/ 200,3125, /*plead*/ 0, /*ptrail*/ 200, // stop bit /*foot*/ 0,0, /*pre*/ 200,15625, //3. start bit /*post*/ 200,12500, // post bit /*repeat*/ 0,0, /*min_repeat*/ 0, /*duty cycle*/ 30, { 0x0000, // A -> 0x0000, // B -> 0x0000, // C -> 0x0000, // D -> 0x0000, // Betty -> 0xB44B, // Exit -> Exit 0x06F9, // Up -> UP 0x8679, // Down -> Down 0xA659, // Left -> Left 0x46B9, // Right -> Right 0x16E9, // OK -> OK 0x0160, // Vol+ -> Vol+ 0x0164, // Vol- -> Vol- 0xF00F, // Mute -> Mute 0x48B7, // Prog+ -> Prog+ 0x48B7, // Prog- -> Prog- 0x0101, // 1 -> 1 0x0102, // 2 -> 2 0x609F, // 3 -> 3 0x10EF, // 4 -> 4 0x906F, // 5 -> 5 0x50AF, // 6 -> 6 0x30CF, // 7 -> 7 0xB04F, // 8 -> 8 0x708F, // 9 -> 9 0x8877, // 0 -> 0 0xF20D, // -/-- -> Guide 0x0181, // AV -> Source 0x0f0c, // Menu -> Menue 0xD22D, // PiP -> Tools 0x1AE5, // A/B -> Return 0x7C83, // 16:9 -> P.Size 0xF807, // Info -> Info 0xD629, // VTX1 -> Ch.List 0x0000, // VTX2 -> 0xC837, // VTX3 -> Pre-CH 0x6897, // Blue -> Blue 0xA857, // Yello -> Yellow 0x28D7, // Green -> Green 0x36C9, // Red -> Red 0xC23D, // TV -> TV/DTV 0x0f0C // Power -> Standby },

View file

@ -126,7 +126,6 @@ void __attribute__ ((section(".text.fastcode"))) ITT_Encode (void)
}
break;
}
T1MR0 = cycles * ITT2_Module.lo_border * ITT2_Module.tval;
}
void ITT_LoadMap(unsigned char map)

View file

@ -25,16 +25,18 @@
#include "lcd.h"
#include "rf.h"
#include "cc1100.h"
#include "pwm.h"
#include "global.h"
extern volatile unsigned char mod_enable;
extern volatile unsigned int cycles;
extern volatile unsigned long keyMap[42];
struct CODE_TABLE_L *lirctable;
unsigned int prev_cycles; /* needed for handling of b&o specific protocol added MN2017325 */
/*
#define RAW_IDLE 0x00
#define RAW_HI 0x01
#define RAW_LO 0x02
*/
#define LIRC_IDLE 0x00
#define LIRC_HEAD_P 0x01
@ -71,7 +73,7 @@ const struct irModule LIRC_Module =
unsigned char __attribute__ ((section(".text.fastcode"))) send_data (unsigned long data, unsigned char pulse) {
const unsigned short* bittimes[4] = {&(lirctable->pzero), &(lirctable->pone), &(lirctable->ptwo), &(lirctable->pthree)};
const unsigned char* bittimes[4] = {&(ir.lirc.pzero), &(ir.lirc.pone), &(ir.lirc.ptwo), &(ir.lirc.pthree)};
unsigned char notpulse = 1;
if(pulse) {
@ -110,7 +112,7 @@ unsigned char __attribute__ ((section(".text.fastcode"))) send_data (unsigned lo
cycles = bittimes[0][notpulse];
mod_enable = pulse;
}
if((ir.lirc.bit+1 == lirctable->rc6_bit))
if((ir.lirc.bit+1 == ir.lirc.rc6_bit))
cycles <<= 1;
}
else {
@ -130,97 +132,86 @@ unsigned char __attribute__ ((section(".text.fastcode"))) send_data (unsigned lo
}
void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) {
unsigned long gap;
unsigned short gap;
ir.lirc.cycles_counter += cycles;
switch(ir.state)
{
case LIRC_IDLE:
cycles = lirctable->pone;
cycles = ir.lirc.pone;
mod_enable = 0;
break;
case LIRC_HEAD_P:
ir.lirc.cycles_counter = 0;
if(has_header && (!ir.lirc.repeats || (!(lirctable->flags&LIRC_NO_HEAD_REP) && !has_repeat) || (lirctable->flags&LIRC_REPEAT_HEADER))) { //
if(has_header && (!ir.lirc.repeats || (!(ir.lirc.flags&LIRC_NO_HEAD_REP) && !has_repeat) || (ir.lirc.flags&LIRC_REPEAT_HEADER))) { //
mod_enable = 1;
cycles = lirctable->phead;
cycles = ir.lirc.phead;
ir.state++;
break;
case LIRC_HEAD_S:
mod_enable = 0;
cycles = lirctable->shead;
cycles = ir.lirc.shead;
ir.state++;
break;
}
ir.state = LIRC_LEAD_P;
case LIRC_LEAD_P:
if(lirctable->plead) {
if(ir.lirc.plead) {
mod_enable = 1;
cycles = lirctable->plead;
cycles = ir.lirc.plead;
ir.state++;
break;
}
ir.state++;
case LIRC_PRE_DAT_P:
if(!has_repeat || !(ir.lirc.repeats)) {
if(lirctable->pre_data_bits) {
if(ir.lirc.pre_data_bits) {
send_data(ir.lirc.pre_data,1);
ir.state++;
break;
case LIRC_PRE_DAT_S:
ir.lirc.pre_data <<= send_data(ir.lirc.pre_data,0);
if(ir.lirc.bit >= lirctable->pre_data_bits)
if(ir.lirc.bit >= ir.lirc.pre_data_bits)
ir.state++;
else
ir.state--;
break;
case LIRC_PRE_P:
if(lirctable->pre_p && lirctable->pre_s) {
if(ir.lirc.pre_p && ir.lirc.pre_s) {
mod_enable = 1;
cycles = lirctable->pre_p;
cycles = ir.lirc.pre_p;
ir.state++;
break;
case LIRC_PRE_S:
mod_enable = 0;
cycles = lirctable->pre_s;
cycles = ir.lirc.pre_s;
ir.state++;
break;
}
}
ir.state = LIRC_DATA_P;
prev_cycles = 0;
ir.state = LIRC_DATA_P;
case LIRC_DATA_P:
send_data(ir.cmd,1);
ir.state++;
break;
case LIRC_DATA_S:
ir.cmd <<= send_data(ir.cmd,0);
/* handling for b&o specific protocol added MN2017325
special r-bit coding, if current bit is equal previous bit */
if(is_BO) {
if (prev_cycles == cycles) {
prev_cycles = cycles;
cycles = lirctable->szero * 2 ;
} else {
prev_cycles = cycles;
}
}
if(ir.lirc.bit >= lirctable->pre_data_bits + lirctable->bits)
if(ir.lirc.bit >= ir.lirc.pre_data_bits + ir.lirc.bits)
ir.state++;
else
ir.state--;
break;
case LIRC_POST_P:
if(lirctable->post_data_bits) {
if(lirctable->post_p && lirctable->post_s) {
if(ir.lirc.post_data_bits) {
if(ir.lirc.post_p && ir.lirc.post_s) {
mod_enable = 1;
cycles = lirctable->post_p;
cycles = ir.lirc.post_p;
ir.state++;
break;
case LIRC_POST_S:
mod_enable = 0;
cycles = lirctable->post_s;
cycles = ir.lirc.post_s;
ir.state++;
break;
}
@ -230,8 +221,8 @@ void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) {
ir.state++;
break;
case LIRC_POST_DAT_S:
ir.lirc.post_data <<= send_data(ir.lirc.post_data,0);
if(ir.lirc.bit >= lirctable->pre_data_bits + lirctable->bits + lirctable->post_data_bits)
ir.lirc.post_data <<= send_data(ir.lirc.post_data,0);
if(ir.lirc.bit >= ir.lirc.pre_data_bits + ir.lirc.bits +ir.lirc.post_data_bits)
ir.state = LIRC_TRAIL_P;
else
ir.state--;
@ -242,33 +233,33 @@ void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) {
case LIRC_REPEAT_P:
if(has_repeat && ir.lirc.repeats) {
mod_enable = 1;
cycles = lirctable->prepeat;
cycles = ir.lirc.prepeat;
ir.state++;
break;
case LIRC_REPEAT_S:
mod_enable = 0;
cycles = lirctable->srepeat;
cycles = ir.lirc.srepeat;
ir.state++;
break;
}
ir.state = LIRC_TRAIL_P;
case LIRC_TRAIL_P:
if(lirctable->ptrail) {
if(ir.lirc.ptrail) {
mod_enable = 1;
cycles = lirctable->ptrail;
cycles = ir.lirc.ptrail;
ir.state++;
break;
}
ir.state++;
case LIRC_FOOT_S:
if(has_foot && (!ir.lirc.repeats || !(lirctable->flags&LIRC_NO_FOOT_REP)) && (!has_repeat || !ir.lirc.repeats)) {
if(has_foot && (!ir.lirc.repeats || !(ir.lirc.flags&LIRC_NO_FOOT_REP)) && (!has_repeat || !ir.lirc.repeats)) {
mod_enable = 0;
cycles = lirctable->sfoot;
cycles = ir.lirc.sfoot;
ir.state++;
break;
case LIRC_FOOT_P:
mod_enable = 1;
cycles = lirctable->pfoot;
cycles = ir.lirc.pfoot;
ir.state++;
break;
}
@ -280,17 +271,17 @@ void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) {
ir.lirc.pre_data = ir.lirc.actpre_data;
ir.lirc.post_data = ir.lirc.actpost_data;
if((lirctable->repeat_gap && has_repeat && ir.lirc.repeats) | (is_RF && (ir.lirc.repeats >= lirctable->min_repeat)))
gap = lirctable->repeat_gap;
if((ir.lirc.repeat_gap && has_repeat && ir.lirc.repeats) | (is_RF && (ir.lirc.repeats >= ir.lirc.min_repeat)))
gap = ir.lirc.repeat_gap;
else
gap = lirctable->gap;
gap = ir.lirc.gap;
if(is_const && (ir.lirc.cycles_counter < gap))
cycles = gap - ir.lirc.cycles_counter;
else
cycles = gap;
if((ir.lirc.repeats >= lirctable->min_repeat) && ir.lirc.stop) {
if((ir.lirc.repeats >= ir.lirc.min_repeat) && ir.lirc.stop) {
ir.state = LIRC_IDLE;
}
else {
@ -299,14 +290,12 @@ void __attribute__ ((section(".text.fastcode"))) LIRC_Encode (void) {
ir.state = LIRC_HEAD_P;
}
}
T1MR0 = 15 * cycles;
}
void LIRC_Init(unsigned char map)
{
unsigned long freq;
struct CODE_TABLE_L *lirctable;
if(map < LIRC.num_tables) {
@ -316,32 +305,90 @@ void LIRC_Init(unsigned char map)
setIR(LIRC_Module);
if(lirctable->flags&LIRC_RF) {
ir.duty_cycle = 50;
hi_border = 0;
lo_border = 1;
freq = 20000;
}
else {
freq = lirctable->freq;
if(!freq)
freq = 38000;
ir.duty_cycle = lirctable->duty_cycle;
if(!lirctable->duty_cycle) { //default 50%
ir.duty_cycle = 50;
if(lirctable->duty_cycle == 0) { //default 50%
hi_border = 1;
lo_border = 2;
}
else if(lirctable->duty_cycle <= 25) {
hi_border = 1;
lo_border = 4;
}
else if(lirctable->duty_cycle <= 33) {
hi_border = 1;
lo_border = 3;
}
else if(lirctable->duty_cycle <= 50) {
hi_border = 1;
lo_border = 2;
}
else if(lirctable->duty_cycle <= 66) {
hi_border = 2;
lo_border = 3;
}
else { //75%
hi_border = 3;
lo_border = 4;
}
}
PWM_set_frequency(freq);
T1MR0 = 15000000 / (freq);
T1MR0 = 15000000 / (freq * lo_border);
ir.lirc.phead = (lirctable->phead * freq) / 1000000;
ir.lirc.shead = (lirctable->shead * freq) / 1000000;
ir.lirc.plead = (lirctable->plead * freq) / 1000000;
ir.lirc.actpre_data = (lirctable->pre_data)<<(32-lirctable->pre_data_bits);
ir.lirc.pre_data_bits = lirctable->pre_data_bits;
ir.lirc.pre_p = (lirctable->pre_p * freq) / 1000000;
ir.lirc.pre_s = (lirctable->pre_s * freq) / 1000000;
ir.lirc.post_p = (lirctable->post_p * freq) / 1000000;
ir.lirc.post_s = (lirctable->post_s * freq) / 1000000;
ir.lirc.actpost_data = (lirctable->post_data)<<(32-lirctable->post_data_bits);
ir.lirc.post_data_bits = lirctable->post_data_bits;
ir.lirc.ptrail = (lirctable->ptrail * freq) / 1000000;
ir.lirc.pfoot = (lirctable->pfoot * freq) / 1000000;
ir.lirc.sfoot = (lirctable->sfoot * freq) / 1000000;
ir.lirc.prepeat = (lirctable->prepeat * freq) / 1000000;
ir.lirc.srepeat = (lirctable->srepeat * freq) / 1000000;
ir.lirc.pzero = (lirctable->pzero * freq) / 1000000;
ir.lirc.szero = (lirctable->szero * freq) / 1000000;
ir.lirc.pone = (lirctable->pone * freq) / 1000000;
ir.lirc.sone = (lirctable->sone * freq) / 1000000;
ir.lirc.ptwo = (lirctable->ptwo * freq) / 1000000;
ir.lirc.stwo = (lirctable->stwo * freq) / 1000000;
ir.lirc.pthree = (lirctable->pthree * freq) / 1000000;
ir.lirc.sthree = (lirctable->sthree * freq) / 1000000;
ir.lirc.gap = (lirctable->gap * freq) / 1000000;
ir.lirc.repeat_gap = (lirctable->repeat_gap * freq) / 1000000;
ir.lirc.rc6_bit = lirctable->rc6_bit;
ir.lirc.flags = lirctable->flags;
ir.lirc.bits = lirctable->bits;
ir.lirc.min_repeat = lirctable->min_repeat;
ir.cmd = 0;
ir.actcmd = 0;
ir.lirc.stop = 0;
ir.state = LIRC_IDLE;
ir.lirc.bit = 0;
ir.lirc.map = map;
}
}
@ -352,19 +399,19 @@ void LIRC_Send(unsigned long cmd)
if(cmd != 0x0000) {
ir.lirc.pre_data = ir.lirc.actpre_data;
ir.actcmd = cmd<<(32-lirctable->bits);
ir.actcmd = cmd<<(32-ir.lirc.bits);
ir.lirc.post_data = ir.lirc.actpost_data;
ir.lirc.stop = 0;
ir.lirc.repeats = 0;
if(ir.toggle & 0x01) {
togglemask = (unsigned long)(lirctable->toggle_bit_mask) << (32-lirctable->post_data_bits);
togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask) << (32-ir.lirc.post_data_bits);
ir.lirc.post_data ^= togglemask;
togglemask = (unsigned long)(lirctable->toggle_bit_mask>>lirctable->post_data_bits) << (32-lirctable->bits);
togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask>>ir.lirc.post_data_bits) << (32-ir.lirc.bits);
ir.actcmd ^= togglemask;
togglemask = (unsigned long)(lirctable->toggle_bit_mask>>(lirctable->post_data_bits + lirctable->bits)) << (32-lirctable->pre_data_bits);
togglemask = (unsigned long)(LIRC.table[ir.lirc.map].toggle_bit_mask>>(ir.lirc.post_data_bits + ir.lirc.bits)) << (32-ir.lirc.pre_data_bits);
ir.lirc.pre_data ^= togglemask;
}
@ -374,9 +421,9 @@ void LIRC_Send(unsigned long cmd)
ir.state++;
if(is_RF) {
RFasyncmode(true);
cc1100_write1(FREQ2,((lirctable->freq)>>16) & 0xFF);
cc1100_write1(FREQ1,((lirctable->freq)>>8) & 0xFF);
cc1100_write1(FREQ0,(lirctable->freq) & 0xFF);
cc1100_write1(FREQ2,((LIRC.table[ir.lirc.map].freq)>>16) & 0xFF);
cc1100_write1(FREQ1,((LIRC.table[ir.lirc.map].freq)>>8) & 0xFF);
cc1100_write1(FREQ0,(LIRC.table[ir.lirc.map].freq) & 0xFF);
cc1100_strobe(STX);
}
runIR();
@ -391,7 +438,7 @@ void LIRC_Repeat(void) {
void LIRC_Stop(void)
{
ir.lirc.stop = 1;
if(lirctable->bits){
if(ir.lirc.bits){
while(ir.state != LIRC_IDLE);
}

View file

@ -28,10 +28,10 @@
//#define LIRC_SPACE_FIRST 0x0020 /* bits are encoded as space+pulse */
//#define LIRC_GOLDSTAR 0x0040 /* encoding found on Goldstar remote */
//#define LIRC_GRUNDIG 0x0080 /* encoding found on Grundig remote */
#define LIRC_BO 0x0100 /* encoding found on Bang & Olufsen remote */
#define LIRC_RF 0x0200 /* RF ASK/OOK modulator */
//#define LIRC_SERIAL 0x0400 /* serial protocol */
//#define LIRC_XMP 0x0800 /* XMP protocol */
//#define LIRC_BO 0x0100 /* encoding found on Bang & Olufsen remote */
#define LIRC_RF 0x0100 /* RF ASK/OOK modulator */
//#define LIRC_SERIAL 0x0200 /* serial protocol */
//#define LIRC_XMP 0x0400 /* XMP protocol */
/* additinal flags: can be orred together with protocol flag */
//#define REVERSE 0x0800
@ -40,15 +40,14 @@
#define LIRC_CONST_LENGTH 0x4000 /* signal length+gap is always constant */
#define LIRC_REPEAT_HEADER 0x8000 /* header is also sent before repeat code */
#define is_rc6 (lirctable->flags & LIRC_RC6)
#define is_biphase ((lirctable->flags & LIRC_RC5) || is_rc6)
#define is_rcmm (lirctable->flags & LIRC_RCMM)
#define is_const (lirctable->flags & LIRC_CONST_LENGTH)
#define is_RF (lirctable->flags & LIRC_RF)
#define is_BO (lirctable->flags & LIRC_BO) /* flag for b&o specific protocol MN2017325 */
#define has_header (lirctable->phead && lirctable->shead)
#define has_foot (lirctable->pfoot && lirctable->sfoot)
#define has_repeat (lirctable->prepeat && lirctable->srepeat)
#define is_rc6 (ir.lirc.flags & LIRC_RC6)
#define is_biphase ((ir.lirc.flags & LIRC_RC5) || is_rc6)
#define is_rcmm (ir.lirc.flags & LIRC_RCMM)
#define is_const (ir.lirc.flags & LIRC_CONST_LENGTH)
#define is_RF (ir.lirc.flags & LIRC_RF)
#define has_header (ir.lirc.phead && ir.lirc.shead)
#define has_foot (ir.lirc.pfoot && ir.lirc.sfoot)
#define has_repeat (ir.lirc.prepeat && ir.lirc.srepeat)
//FS20 Protocol description see http://fhz4linux.info/tiki-index.php?page=FS20%20Protocol
#define calcFS20pre(HC1,par1,HC2,par2) ((1<<18) | (HC1<<10) | (par1<<9) | (HC2<<1) | par2)

View file

@ -115,7 +115,6 @@ void __attribute__ ((section(".text.fastcode"))) NRC17_Encode(void)
break;
}
T1MR0 = cycles * NRC17_Module.lo_border * NRC17_Module.tval;
}
/*
void NRC17_CopyMap(unsigned char xtra, unsigned short *map)

View file

@ -98,7 +98,6 @@ void __attribute__ ((section(".text.fastcode"))) RC5_Encode (void)
}
break;
}
T1MR0 = cycles * RC5_Module.lo_border * RC5_Module.tval;
}
void RC5_Init(unsigned char map)

View file

@ -148,7 +148,6 @@ void __attribute__ ((section(".text.fastcode"))) RC6_Encode (void)
}
break;
}
T1MR0 = cycles * RC6_Module.lo_border * RC6_Module.tval;
}
void RC6_Init(unsigned char map)

View file

@ -120,7 +120,6 @@ void __attribute__ ((section(".text.fastcode"))) RCA_Encode (void)
}
break;
}
T1MR0 = cycles * RCA_Module.lo_border * RCA_Module.tval;
}
void RCA_LoadMap(unsigned char map)

View file

@ -117,7 +117,6 @@ void __attribute__ ((section(".text.fastcode"))) RCMM_Encode (void)
}
T1MR0 = cycles * RCMM_Module.lo_border * RCMM_Module.tval;
}
void RCMM_LoadMap(unsigned char map)

View file

@ -117,7 +117,6 @@ void __attribute__ ((section(".text.fastcode"))) REC80_Encode (void)
}
break;
}
T1MR0 = cycles * REC80_Module.lo_border * REC80_Module.tval;
}
void REC80_LoadMap(unsigned char map)

View file

@ -90,7 +90,6 @@ void __attribute__ ((section(".text.fastcode"))) RECS80_Encode (void)
}
break;
}
T1MR0 = cycles * RECS80_Module.lo_border * RECS80_Module.tval;
}
void RECS80_Init(unsigned char map)

View file

@ -42,7 +42,7 @@ extern volatile unsigned long keyMap[42];
#define IRRF_WAIT 0x01
#define IRRF_BITTIME 40
#define IRRF_WAITTIME 100
#define IRRF_WAITTIME 125
void __attribute__ ((section(".text.fastcode"))) IRRF_Encode (void)
{
@ -63,7 +63,6 @@ void __attribute__ ((section(".text.fastcode"))) IRRF_Encode (void)
}
break;
}
T1MR0 = 15*1000;
}
void IRRF_Init(unsigned char map)
@ -101,10 +100,9 @@ void IRRF_Repeat(void)
struct RFendpoint_* cur_ep;
cur_ep = (struct RFendpoint_*)ir.general.trail;
if((cur_ep) && !(cur_ep->flags & EPnewdata)) {
cur_ep->dest = 0;
cur_ep->data[1] = (ir.actcmd & 0x00ff);
cur_ep->data[0] = (ir.actcmd & 0xff00) >> 8;
cur_ep->bufferlen = 2;
cur_ep->dest = (ir.actcmd & 0xff00) >> 8;
cur_ep->data[0] = (ir.actcmd & 0x00ff);
cur_ep->bufferlen = 1;
cur_ep->flags |= EPenabled | EPoutput | EPnewdata;
RF_changestate(RFtx);

View file

@ -103,8 +103,6 @@ void __attribute__ ((section(".text.fastcode"))) SIRC_Encode (void)
break;
}
T1MR0 = cycles * SIRC_Module.lo_border * SIRC_Module.tval;
}
void SIRC_Init(unsigned char map)

View file

@ -137,7 +137,6 @@ void __attribute__ ((section(".text.fastcode"))) SPACEENC_Encode (void)
}
break;
}
T1MR0 = cycles * SPACEENC_Module.lo_border * SPACEENC_Module.tval;
}
void SPACEENC_LoadMap(unsigned char map)

View file

@ -1,82 +0,0 @@
/*
pwm.c - pwm control
Copyright (C) 2017 <telekatz@gmx.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "global.h"
#include "lpc2220.h"
#include "irq.h"
void PWM_init(void)
{
//Set pin P0.21 IR_OUT as PWM
PINSEL1 &= ~(3 << (10)); // IO
PINSEL1 |= (1 << (10)); // PWM5
PWMTC = 0; //Timer Counter
PWMPR = 0; //Prescale Register
PWMPC = 0; //Prescale Counter
PWMMR0 = 416; // pwm rate
PWMMR2 = 0x00; // pwm value sound
PWMMR5 = 0x00; // pwm value IR
PWMLER = 0x26; //Latch Enable
PWMMCR = 0x03; //Match Control
PWMPCR |= (1<<13) | (1<<10);
PWMTCR = 0x03;
PWMTCR = 0x09;
/* PWMTC = 0;
PWMPR = 7;
PWMMR0 = 0x1E6; // pwm rate
PWMMR2 = 0x00; // pwm value
PWMLER = 0x05;
PWMPCR = (1<<10);
*/
//VICVectAddr0 = (unsigned long)&(soundIRQ);
//VICVectCntl0 = VIC_SLOT_EN | INT_SRC_PWM;
VICIntSelect |= INT_PWM;
VICIntEnable = INT_PWM;
}
void PWM_set_frequency(unsigned long f)
{
if(f<5000) {
PWMPR = 7;
PWMMR0 = 1875000 / f;
} else {
PWMPR = 0;
PWMMR0 = 15000000 / f;
}
PWMLER |= 0x01; //Latch Enable
if(f < 32000) {
PWMMCR = 0x03;
} else {
PWMMCR = 0x02;
}
}
void PWM_set_IR_duty_cycle(unsigned char d) {
PWMMR5 = (PWMMR0 * d) / 100;
PWMLER |= 0x20;
}

View file

@ -1,26 +0,0 @@
/*
pwm.h - pwm control
Copyright (C) 2017 <telekatz@gmx.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
void PWM_init(void);
void PWM_set_frequency(unsigned long f);
void PWM_set_IR_duty_cycle(unsigned char d);

View file

@ -71,12 +71,12 @@ unsigned restoreIRQ(unsigned oldCPSR)
// (where's the vector? in lpc2220_rom.ld ?)
void __attribute__ ((section(".text.fastcode"))) FIQ_Routine (void)
{
//while ((PWMIR == 0x01))
while ((PWMIR == 0x01) || (T1IR == 1))
{
if (PWMIR == 0x01)
soundIRQ(); // sound, backlight
//if (T1IR == 1)
// irIRQ(); // IR
if (T1IR == 1)
irIRQ(); // IR
}
}

View file

@ -31,7 +31,6 @@
//#include "sounds.h"
//#include "sound3.h"
#include "infrared.h"
#include "pwm.h"
#include "codes.h"
#include "encoders.h"
#include "ir_selector.h"
@ -88,8 +87,8 @@ void setSpeed(unsigned char sp)
VPBDIV = 0x00;
BCFG0 = 0x10001CA0;
BCFG2 = 0x10001CA0;
BCFG0 = 0x100004A0;
BCFG2 = 0x100004A0;
BCFG1 = 0x00000C21;
sysInfo |= SYS_TURBO;
break;
@ -103,8 +102,8 @@ void setSpeed(unsigned char sp)
VPBDIV = 0x02;
BCFG0 = 0x10000A20;
BCFG2 = 0x10000A20;
BCFG0 = 0x10000420;
BCFG2 = 0x10000420;
BCFG1 = 0x00000400;
sysInfo &= ~SYS_TURBO;
break;
@ -199,8 +198,6 @@ void cpu_idle ()
if(U0SCR)
return;
return;
/* only idle mode instead of power down when:
* * backlight on
* * IR transmission
@ -243,8 +240,7 @@ int main(void)
FIOSET0 |= (1<<12);
FIOCLR0 |= (1<<4);
setSpeed(SPEED_60);
BFS_Mount(); // flash file system
setSpeed(SPEED_30);
lcd_init(0);
serial_init();
@ -255,13 +251,11 @@ int main(void)
initKeys();
initSound();
//startSoundIRQ();
startSoundIRQ();
initIR();
startIrIRQ();
PWM_init();
RF_init();
load_RF_setting();
startRFIRQ();
@ -285,8 +279,10 @@ int main(void)
set_font(BOLDFONT);
load_setting(); // display settings
BFS_Mount(); // flash file system
load_RC_setting(); // learned remote codes
load_setting(); // display settings
// recorded raw IR commands
{

View file

@ -42,7 +42,7 @@ void startTimerIRQ(void)
T0TCR = 0x02; // reset timer
T0TC = 1870;
T0PR = 0x0e; // 15.000.000 Hz / 15 = 1.000.000 Hz --> PR = 15 - 1 = 0x0e
T0MR0 = 250; // 1.000.000 Hz / 250 = 4000 Hz = 0,25msec intervall time
T0MR0 = 5000; // 1.000.000 Hz / 5000 = 200 Hz = 5 msec intervall time
T0MCR = 0x03; // reset and issue IRQ on TC == MR0
T0TCR = 0x01; // enable timer

View file

@ -21,37 +21,14 @@
#include "timerfuncs.h"
#include "lcd.h"
#define TIMER_PRESCALER 20
struct CB callbacks[MAX_CB];
unsigned long* timeouts[MAX_TO];
unsigned char timerPrescaler = TIMER_PRESCALER;
unsigned char bl_val, cmp_val; // backlight PWM
// wird alle 0.25 ms aufgerufen (s. startTimerIRQ() in timerfuncs)
// wird alle 5 ms aufgerufen (s. startTimerIRQ() in timerfuncs)
// bearbeitet eingetragene "timer"
void __attribute__ ((section(".text.fastcode"))) timerIRQ(void)
{
// backlight pwm
cmp_val += bl_val;
if (cmp_val >= 63)
{
FIODIR0 |= (1<<4); // sck0/P0.4
cmp_val -= 63;
}
else
{
FIODIR0 &= ~(1<<4); // sck0/P0.4
}
if(--timerPrescaler) {
T0IR = 1;
return;
}
timerPrescaler = TIMER_PRESCALER;
//5 msec intervall time
unsigned int cnt;
struct CB *cur_cb;