diff --git a/Makefile b/Makefile index cc51b97..59009c8 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ sniffer.hex: sniffer.elf avr-objcopy -j .text -j .data -O ihex sniffer.elf sniffer.hex sniffer.elf: sniffer.o com232.o avclandrv.o GlobalDef.o - $(CC) $(LFLAGS) $(DEFS) -o sniffer.elf sniffer.o com232.o avclandrv.o GlobalDef.o + $(CC) $(LFLAGS) -o sniffer.elf sniffer.o com232.o avclandrv.o GlobalDef.o sniffer.o: sniffer.c GlobalDef.h com232.h avclandrv.h $(CC) $(CFLAGS) $(DEFS) sniffer.c @@ -29,8 +29,11 @@ clean:: .PHONY: upload connect size -upload: sniffer.hex - avrdude -C/home/allen/Programs/arduino-1.6.5/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/arduino -b57600 -D -Uflash:w:sniffer.hex:i +upload-final: sniffer.hex + avrdude -C/home/allen/Programs/arduino-1.6.5/hardware/tools/avr/etc/avrdude.conf -patmega328p -cstk500v1 -P/dev/arduino -b19200 -D -U flash:w:sniffer.hex:i + +upload-arduino: sniffer.hex + avrdude -C/home/allen/Programs/arduino-1.6.5/hardware/tools/avr/etc/avrdude.conf -patmega328p -carduino -P/dev/arduino -b57600 -D -U flash:w:sniffer.hex:i connect: @picocom --nolock -b 115200 /dev/arduino ||: diff --git a/avclandrv.c b/avclandrv.c index d3948fa..490516d 100644 --- a/avclandrv.c +++ b/avclandrv.c @@ -1,996 +1,1038 @@ -/* - Copyright (C) 2015 Allen Hill . - - Portions of the following source code are: - Copyright (C) 2006 Marcin Slonicki . - - 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 2 - 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - ----------------------------------------------------------------------- - this file is a part of the TOYOTA Corolla MP3 Player Project - ----------------------------------------------------------------------- - http://www.softservice.com.pl/corolla/avc - - May 28 / 2009 - version 2 - -*/ - -#include -#include -#include - -#include "avclandrv.h" -#include "com232.h" -#include "GlobalDef.h" - - -//------------------------------------------------------------------------------ - -#define AVC_OUT_EN() sbi(PORTD, 6); sbi(DDRD, 6); sbi(DDRD, 7); sbi(ACSR, ACD); -#define AVC_OUT_DIS() cbi(PORTD, 6); cbi(DDRD, 6); cbi(DDRD, 7); cbi(ACSR, ACD); -#define AVC_SET_1() sbi(PORTD, 6); -#define AVC_SET_0() cbi(PORTD, 6); - - -byte CD_ID_1; -byte CD_ID_2; - -byte HU_ID_1; -byte HU_ID_2; - -byte parity_bit; - -byte repeatMode; -byte randomMode; - -byte playMode; - -byte cd_Disc; -byte cd_Track; -byte cd_Time_Min; -byte cd_Time_Sec; - -byte answerReq; - -cd_modes CD_Mode; - - -byte broadcast; -byte master1; -byte master2; -byte slave1; -byte slave2; -byte message_len; -byte message[MAXMSGLEN]; - -byte data_control; -byte data_len; -byte data[MAXMSGLEN]; - -// we need check answer (to avclan check) timeout -// when is more then 1 min, FORCE answer. -byte check_timeout; - -#define SW_ID 0x11 // 11 For my stereo - -// commands -const byte stat1[] = { 0x4, 0x00, 0x00, 0x01, 0x0A }; -const byte stat2[] = { 0x4, 0x00, 0x00, 0x01, 0x08 }; -const byte stat3[] = { 0x4, 0x00, 0x00, 0x01, 0x0D }; -const byte stat4[] = { 0x4, 0x00, 0x00, 0x01, 0x0C }; - -// broadcast -const byte lan_stat1[] = { 0x3, 0x00, 0x01, 0x0A }; -const byte lan_reg[] = { 0x3, SW_ID, 0x01, 0x00 }; -const byte lan_init[] = { 0x3, SW_ID, 0x01, 0x01 }; -const byte lan_check[] = { 0x3, SW_ID, 0x01, 0x20 }; -const byte lan_playit[] = { 0x4, SW_ID, 0x01, 0x45, 0x63 }; - - - -const byte play_req1[] = { 0x4, 0x00, 0x25, 0x63, 0x80 }; - -#ifdef __AVENSIS__ - const byte play_req2[] = { 0x6, 0x00, SW_ID, 0x63, 0x42 }; -#else - const byte play_req2[] = { 0x6, 0x00, SW_ID, 0x63, 0x42, 0x01, 0x00 }; -#endif - -const byte play_req3[] = { 0x6, 0x00, SW_ID, 0x63, 0x42, 0x41, 0x00 }; -const byte stop_req[] = { 0x5, 0x00, SW_ID, 0x63, 0x43, 0x01 }; -const byte stop_req2[] = { 0x5, 0x00, SW_ID, 0x63, 0x43, 0x41 }; - - -// answers -const byte CMD_REGISTER[] = {0x1, 0x05, 0x00, 0x01, SW_ID, 0x10, 0x63 }; -const byte CMD_STATUS1[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x1A }; -const byte CMD_STATUS2[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x18 }; -const byte CMD_STATUS3[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x1D }; -const byte CMD_STATUS4[] = {0x1, 0x05, 0x00, 0x01, 0x00, 0x1C, 0x00 }; -byte CMD_CHECK[] = {0x1, 0x06, 0x00, 0x01, SW_ID, 0x30, 0x00, 0x00 }; - -const byte CMD_STATUS5[] = {0x1, 0x05, 0x00, 0x5C, 0x12, 0x53, 0x02 }; -const byte CMD_STATUS5A[] = {0x0, 0x05, 0x5C, 0x31, 0xF1, 0x00, 0x00 }; - -const byte CMD_STATUS6[] = {0x1, 0x06, 0x00, 0x5C, 0x32, 0xF0, 0x02, 0x00 }; - - -const byte CMD_PLAY_OK1[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x50, 0x01 }; -const byte CMD_PLAY_OK2[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x52, 0x01 }; -const byte CMD_PLAY_OK3[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x80 }; -byte CMD_PLAY_OK4[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }; - -const byte CMD_STOP1[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x53, 0x01 }; -byte CMD_STOP2[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x00, 0x30, 0x00, 0x00,0x00, 0x00, 0x00, 0x80 }; - -const byte CMD_BEEP[] = {0x1, 0x05, 0x00, 0x63, 0x29, 0x60, 0x02 }; - -//------------------------------------------------------------------------------ - - -// DONE: Timing adjusted, however refactoring may make code more clear/efficient -//------------------------------------------------------------------------------ -void AVC_HoldLine() -{ - STOPEvent; - - // wait for free line - byte line_busy = 1; - - TCNT0 = 0; - do { - while (INPUT_IS_CLEAR) { - /* The comparison value was originally 25 with CK64 (tick period of 4.34 us) - at a clock frequency 14.7456MHz. - For a more accurate tick period of .5 us at 16MHz, the value should be approximately 225*/ - if (TCNT0 >= 225) break; - } - if (TCNT0 > 216) line_busy=0; - } while (line_busy); - - // switch to out mode - AVC_OUT_EN(); - AVC_SET_1(); - - STARTEvent; -} - -// DONE: No changes necessary -//------------------------------------------------------------------------------ -void AVC_ReleaseLine() -{ - AVC_SET_0(); - AVC_OUT_DIS(); -} -//------------------------------------------------------------------------------ - - -// DONE: No changes necessary -//------------------------------------------------------------------------------ -void AVCLan_Init() -{ - // OUTPUT ( set as input for comparator ) - cbi(PORTD, 6); - cbi(DDRD, 6); - - // INPUT - cbi(PORTD, 7); - cbi(DDRD, 7); - - // Analog comparator - - cbi(ADCSRB, ACME); // Analog Comparator Multiplexer Enable - NO - /* - cbi(ACSR, ACBG); // Analog Comparator Bandgap Select - // ACI: Analog Comparator Interrupt Flag - - cbi(ACSR, ACIE); // Analog Comparator Interrupt Enable - NO - cbi(ACSR, ACIC); // Analog Comparator Input Capture Enable - NO - */ - cbi(ACSR, ACIS1); // Analog Comparator Interrupt Mode Select - cbi(ACSR, ACIS0); // Comparator Interrupt on Output Toggle - - cbi(ACSR, ACD); // Analog Comparator Disable - NO - - TCCR0B = _BV(CS01); // Timer 0 prescaler = 8 ( 2 count / us ) - - message_len = 0; - answerReq = cmNull; - check_timeout = 0; - - cd_Disc = 1; - cd_Track = 1; - cd_Time_Min = 0; - cd_Time_Sec = 0; - repeatMode = 0; - randomMode = 0; - playMode = 0; - CD_Mode = stStop; - -} - -// DONE: Timing adjusted, however refactoring may make code more clear/efficient -//------------------------------------------------------------------------------ -byte AVCLan_Read_Byte(byte length) -{ - byte bite = 0; - - while (1) { - while (INPUT_IS_CLEAR); - TCNT0 = 0; - while (INPUT_IS_SET); // If input was set for less than a - if ( TCNT0 < 52 ) { // generous half period, bit was a 1 - bite++; - parity_bit++; - } - length--; - if (!length) return bite; - bite = bite << 1; - } -} - -// DONE: Timing adjusted -//------------------------------------------------------------------------------ -byte AVCLan_Send_StartBit() -{ - AVC_SET_1(); - TCNT0 = 0; - while( TCNT0 < 255 ); - TCNT0 = 0; - while( TCNT0 < 76 ); - - AVC_SET_0(); - TCNT0 = 0; - while( TCNT0 < 61 ); - - return 1; -} - -// DONE: Timing adjusted. Comparison values are timer ticks, not us. -//------------------------------------------------------------------------------ -void AVCLan_Send_Bit1() -{ - AVC_SET_1(); - TCNT0 = 0; - while( TCNT0 < 41 ); - - AVC_SET_0(); - TCNT0 = 0; - while( TCNT0 < 38 ); // 12-21 us -} - -// DONE: Timing adjusted -//------------------------------------------------------------------------------ -void AVCLan_Send_Bit0() -{ - AVC_SET_1(); - TCNT0 = 0; - while( TCNT0 < 65 ); // 28-37 us - - AVC_SET_0(); - TCNT0 = 0; - while( TCNT0 < 15 ); // 00-09 us -} - -// DONE: Timing adjusted. -//------------------------------------------------------------------------------ -byte AVCLan_Read_ACK() -{ - AVC_SET_1(); - TCNT0 = 0; - while( TCNT0 < 39 ); - - AVC_SET_0(); - TCNT0 = 0; - while( TCNT0 < 4 ); // Replace with AVC_ReleaseLine? - - - AVC_OUT_DIS(); // switch to read mode - TCNT0 = 1; - while(1) { - if (INPUT_IS_SET && (TCNT0 > 5)) break; // Make sure INPUT is not still set from us - // Line of experimentation: Try changing TCNT0 comparison value or remove check entirely - if (TCNT0 > 174 ) return 1; // Not sure if this fix is intent correct - } - - while(INPUT_IS_SET); - AVC_OUT_EN(); // back to write mode - return 0; - -} - -// DONE: Timing adjusted. -//------------------------------------------------------------------------------ -byte AVCLan_Send_ACK() -{ - TCNT0 = 0; - while (INPUT_IS_CLEAR) { - if (TCNT0 >= 225) return 0; // max wait time - } - - AVC_OUT_EN(); - - AVC_SET_1(); - TCNT0 = 0; - while( TCNT0 < 65 ); //28-37 - - AVC_SET_0(); - TCNT0 = 0; - while( TCNT0 < 15 ); //00-09 - - AVC_OUT_DIS(); - - return 1; -} - -// DONE: var 'byte' adjusted to 'bite' to avoid reserved word conflict -//------------------------------------------------------------------------------ -byte AVCLan_Send_Byte(byte bite, byte len) -{ - byte b; - if (len==8) { - b = bite; - } else { - b = bite << (8-len); - } - - while (1) { - if ( (b & 128)!=0 ) { - AVCLan_Send_Bit1(); - parity_bit++; - } else { - AVCLan_Send_Bit0(); - } - len--; - if (!len) { - //if (INPUT_IS_SET) RS232_Print_P(PSTR("SBER\n")); // Send Bit ERror - return 1; - } - b = b << 1; - } - -} - -// DONE: Nothing needed. -//------------------------------------------------------------------------------ -byte AVCLan_Send_ParityBit() -{ - if ( (parity_bit & 1)!=0 ) { - AVCLan_Send_Bit1(); - //parity_bit++; - } else { - AVCLan_Send_Bit0(); - } - parity_bit=0; - return 1; -} - -// DONE: Nothing needed. -//------------------------------------------------------------------------------ -byte CheckCmd(byte *cmd) -{ - byte i; - byte *c; - byte l; - - c = cmd; - l = *c++; - - for (i=0; i 255 ) { // 170 us - // // TCCR1B = 0; - // // TCCR1B |= (1 << WGM12)|(1 << CS12); // Set CTC, prescaler at 256 - // STARTEvent; - // RS232_Print_P(PSTR("LAN>T1\n")); - // return 0; - // } - // } - // - // if ( TCNT0 < 20 ) { // 20 us - // // TCCR1B = 0; - // // TCCR1B |= (1 << WGM12)|(1 << CS12); - // STARTEvent; - // RS232_Print_P(PSTR("LAN>T2\n")); - // return 0; - // } - AVCLan_Read_Byte(1); - - broadcast = AVCLan_Read_Byte(1); - - parity_bit = 0; - master1 = AVCLan_Read_Byte(4); - master2 = AVCLan_Read_Byte(8); - if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { - STARTEvent; - return 0; - } - - parity_bit = 0; - slave1 = AVCLan_Read_Byte(4); - slave2 = AVCLan_Read_Byte(8); - if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { - STARTEvent; - return 0; - } - // is this command for me ? - if ((slave1==CD_ID_1)&&(slave2==CD_ID_2)) { - for_me=1; - } - - if (for_me) AVCLan_Send_ACK(); - else AVCLan_Read_Byte(1); - - parity_bit = 0; - AVCLan_Read_Byte(4); // control - always 0xF - if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { - STARTEvent; - return 0; - } - if (for_me) AVCLan_Send_ACK(); - else AVCLan_Read_Byte(1); - - parity_bit = 0; - message_len = AVCLan_Read_Byte(8); - if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { - STARTEvent; - return 0; - } - if (for_me) AVCLan_Send_ACK(); - else AVCLan_Read_Byte(1); - - if (message_len > MAXMSGLEN) { - // RS232_Print_P(PSTR("LAN> Command error")); - STARTEvent; - return 0; - } - - for (i=0; i= 225 ) break; - } - if ( TCNT0 > 216 ) line_busy=0; - } while (line_busy); - - - // switch to output mode - AVC_OUT_EN(); - - AVCLan_Send_StartBit(); - AVCLan_Send_Byte(0x1, 1); // regular communication - - - parity_bit = 0; - AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master - AVCLan_Send_Byte(CD_ID_2, 8); - AVCLan_Send_ParityBit(); - - AVCLan_Send_Byte(HU_ID_1, 4); // HeadUnit ID as slave - AVCLan_Send_Byte(HU_ID_2, 8); - - AVCLan_Send_ParityBit(); - - if (AVCLan_Read_ACK()) { - AVC_OUT_DIS(); - STARTEvent; - RS232_Print_P(PSTR("Error ACK 1 (Transmission ACK)\n")); - return 1; - } - - - AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE - AVCLan_Send_ParityBit(); - if (AVCLan_Read_ACK()) { - AVC_OUT_DIS(); - STARTEvent; - RS232_Print_P(PSTR("Error ACK 2 (COMMMAND WRITE)\n")); - return 2; - } - - AVCLan_Send_Byte(data_len, 8);// data length - AVCLan_Send_ParityBit(); - if (AVCLan_Read_ACK()) { - AVC_OUT_DIS(); - STARTEvent; - RS232_Print_P(PSTR("Error ACK 3 (Data Length)\n")); - return 3; - } - - for (i=0;i= 225 ) break; - } - if ( TCNT0 > 216 ) line_busy=0; - } while (line_busy); - - - AVC_OUT_EN(); - - AVCLan_Send_StartBit(); - AVCLan_Send_Byte(0x0, 1); // broadcast - - parity_bit = 0; - AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master - AVCLan_Send_Byte(CD_ID_2, 8); - AVCLan_Send_ParityBit(); - - AVCLan_Send_Byte(0x1, 4); // all audio devices - AVCLan_Send_Byte(0xFF, 8); - AVCLan_Send_ParityBit(); - AVCLan_Send_Bit1(); - - AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE - AVCLan_Send_ParityBit(); - AVCLan_Send_Bit1(); - - AVCLan_Send_Byte(data_len, 8); // data lenght - AVCLan_Send_ParityBit(); - AVCLan_Send_Bit1(); - - for (i=0;i ")); - for (i=0; i. + + Portions of the following source code are: + Copyright (C) 2006 Marcin Slonicki . + + 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 2 + 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, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ----------------------------------------------------------------------- + this file is a part of the TOYOTA Corolla MP3 Player Project + ----------------------------------------------------------------------- + http://www.softservice.com.pl/corolla/avc + + May 28 / 2009 - version 2 + +*/ + +#include +#include +#include + +#include "avclandrv.h" +#include "com232.h" +#include "GlobalDef.h" + + +//------------------------------------------------------------------------------ + +#define AVC_OUT_EN() sbi(PORTD, 6); sbi(DDRD, 6); sbi(DDRD, 7); sbi(ACSR, ACD); // Write mode +#define AVC_OUT_DIS() cbi(PORTD, 6); cbi(DDRD, 6); cbi(DDRD, 7); cbi(ACSR, ACD); // Read mpde +#define AVC_SET_1() sbi(PORTD, 6); +#define AVC_SET_0() cbi(PORTD, 6); + + +byte CD_ID_1; +byte CD_ID_2; + +byte HU_ID_1; +byte HU_ID_2; + +byte parity_bit; + +byte repeatMode; +byte randomMode; + +byte playMode; + +byte cd_Disc; +byte cd_Track; +byte cd_Time_Min; +byte cd_Time_Sec; + +byte answerReq; + +cd_modes CD_Mode; + + +byte broadcast; +byte master1; +byte master2; +byte slave1; +byte slave2; +byte message_len; +byte message[MAXMSGLEN]; + +byte data_control; +byte data_len; +byte data[MAXMSGLEN]; + +// we need check answer (to avclan check) timeout +// when is more then 1 min, FORCE answer. +byte check_timeout; + +#define SW_ID 0x11 // 11 For my stereo + +// commands +const byte stat1[] = { 0x4, 0x00, 0x00, 0x01, 0x0A }; +const byte stat2[] = { 0x4, 0x00, 0x00, 0x01, 0x08 }; +const byte stat3[] = { 0x4, 0x00, 0x00, 0x01, 0x0D }; +const byte stat4[] = { 0x4, 0x00, 0x00, 0x01, 0x0C }; + +// broadcast +const byte lan_stat1[] = { 0x3, 0x00, 0x01, 0x0A }; +const byte lan_reg[] = { 0x3, SW_ID, 0x01, 0x00 }; +const byte lan_init[] = { 0x3, SW_ID, 0x01, 0x01 }; +const byte lan_check[] = { 0x3, SW_ID, 0x01, 0x20 }; +const byte lan_playit[] = { 0x4, SW_ID, 0x01, 0x45, 0x63 }; + +const byte play_req1[] = { 0x4, 0x00, 0x25, 0x63, 0x80 }; + +#ifdef __AVENSIS__ + const byte play_req2[] = { 0x6, 0x00, SW_ID, 0x63, 0x42 }; +#else + const byte play_req2[] = { 0x6, 0x00, SW_ID, 0x63, 0x42, 0x01, 0x00 }; +#endif + +const byte play_req3[] = { 0x5, 0x00, SW_ID, 0x63, 0x42, 0x41 }; +const byte stop_req[] = { 0x5, 0x00, SW_ID, 0x63, 0x43, 0x01 }; +const byte stop_req2[] = { 0x5, 0x00, SW_ID, 0x63, 0x43, 0x41 }; + + +// answers +const byte CMD_REGISTER[] = {0x1, 0x05, 0x00, 0x01, SW_ID, 0x10, 0x63 }; +const byte CMD_STATUS1[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x1A }; +const byte CMD_STATUS2[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x18 }; +const byte CMD_STATUS3[] = {0x1, 0x04, 0x00, 0x01, 0x00, 0x1D }; +const byte CMD_STATUS4[] = {0x1, 0x05, 0x00, 0x01, 0x00, 0x1C, 0x00 }; +byte CMD_CHECK[] = {0x1, 0x06, 0x00, 0x01, SW_ID, 0x30, 0x00, 0x00 }; + +const byte CMD_STATUS5[] = {0x1, 0x05, 0x00, 0x5C, 0x12, 0x53, 0x02 }; +const byte CMD_STATUS5A[] = {0x0, 0x05, 0x5C, 0x31, 0xF1, 0x00, 0x00 }; + +const byte CMD_STATUS6[] = {0x1, 0x06, 0x00, 0x5C, 0x32, 0xF0, 0x02, 0x00 }; + + +const byte CMD_PLAY_OK1[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x50, 0x01 }; +const byte CMD_PLAY_OK2[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x52, 0x01 }; +const byte CMD_PLAY_OK3[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x80 }; +byte CMD_PLAY_OK4[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }; + +const byte CMD_STOP1[] = {0x1, 0x05, 0x00, 0x63, SW_ID, 0x53, 0x01 }; +byte CMD_STOP2[] = {0x0, 0x0B, 0x63, 0x31, 0xF1, 0x00, 0x30, 0x00, 0x00,0x00, 0x00, 0x00, 0x80 }; + +const byte CMD_BEEP[] = {0x1, 0x05, 0x00, 0x63, 0x29, 0x60, 0x02 }; + +//------------------------------------------------------------------------------ + + +// DONE: Timing adjusted, however refactoring may make code more clear/efficient +//------------------------------------------------------------------------------ +void AVC_HoldLine() +{ + STOPEvent; + + // wait for free line + byte line_busy = 1; + + TCNT0 = 0; + do { + while (INPUT_IS_CLEAR) { + /* The comparison value was originally 25 with CK64 (tick period of 4.34 us) + at a clock frequency 14.7456MHz. + For a more accurate tick period of .5 us at 16MHz, the value should be approximately 225*/ + if (TCNT0 >= 225) break; + } + if (TCNT0 > 216) line_busy=0; + } while (line_busy); + + // switch to out mode + AVC_OUT_EN(); + AVC_SET_1(); + + STARTEvent; +} + +// DONE: No changes necessary +//------------------------------------------------------------------------------ +void AVC_ReleaseLine() +{ + AVC_SET_0(); + AVC_OUT_DIS(); +} +//------------------------------------------------------------------------------ + + +// DONE: No changes necessary +//------------------------------------------------------------------------------ +void AVCLan_Init() +{ + // OUTPUT ( set as input for comparator ) + cbi(PORTD, 6); + cbi(DDRD, 6); + + // INPUT + cbi(PORTD, 7); + cbi(DDRD, 7); + + // Analog comparator + + cbi(ADCSRB, ACME); // Analog Comparator Multiplexer Enable - NO + //cbi(ADCSRA, ADEN); + /* + cbi(ACSR, ACBG); // Analog Comparator Bandgap Select + // ACI: Analog Comparator Interrupt Flag + + cbi(ACSR, ACIE); // Analog Comparator Interrupt Enable - NO + cbi(ACSR, ACIC); // Analog Comparator Input Capture Enable - NO + */ + cbi(ACSR, ACIS1); // Analog Comparator Interrupt Mode Select + cbi(ACSR, ACIS0); // Comparator Interrupt on Output Toggle + + cbi(ACSR, ACD); // Analog Comparator Disable - NO + + TCCR0B = _BV(CS01); // Timer 0 prescaler = 8 ( 2 count / us ) + + message_len = 0; + answerReq = cmNull; + check_timeout = 0; + + cd_Disc = 1; + cd_Track = 1; + cd_Time_Min = 0; + cd_Time_Sec = 0; + repeatMode = 0; + randomMode = 0; + playMode = 0; + CD_Mode = stStop; + +} + +// DONE: Timing adjusted, however refactoring may make code more clear/efficient +//------------------------------------------------------------------------------ +byte AVCLan_Read_Byte(byte length) +{ + byte bite = 0; + + while (1) { + while (INPUT_IS_CLEAR); + TCNT0 = 0; + while (INPUT_IS_SET); // If input was set for less than a + if ( TCNT0 < 52 ) { // generous half period, bit was a 1 + bite++; + parity_bit++; + } + length--; + if (!length) return bite; + bite = bite << 1; + } +} + +// DONE: Timing adjusted +//------------------------------------------------------------------------------ +byte AVCLan_Send_StartBit() +{ + AVC_SET_1(); + TCNT0 = 0; + while( TCNT0 < 255 ); + TCNT0 = 0; + while( TCNT0 < 77 ); + + AVC_SET_0(); + TCNT0 = 0; + while( TCNT0 < 38 ); + + return 1; +} + +// DONE: Timing adjusted. Comparison values are timer ticks, not us. +//------------------------------------------------------------------------------ +void AVCLan_Send_Bit1() +{ + AVC_SET_1(); + TCNT0 = 0; + while( TCNT0 < 41 ); + + AVC_SET_0(); + TCNT0 = 0; + while( TCNT0 < 38 ); // 12-21 us +} + +// DONE: Timing adjusted +//------------------------------------------------------------------------------ +void AVCLan_Send_Bit0() +{ + AVC_SET_1(); + TCNT0 = 0; + while( TCNT0 < 68 ); // 28-37 us + + AVC_SET_0(); + TCNT0 = 0; + while( TCNT0 < 11 ); // 00-09 us +} + +// DONE: Timing adjusted. +//------------------------------------------------------------------------------ +byte AVCLan_Read_ACK() +{ + AVC_SET_1(); + TCNT0 = 0; + while( TCNT0 < 38 ); + + AVC_SET_0(); // Replace with AVC_ReleaseLine? + AVC_OUT_DIS(); // switch to read mode + + while(1) { + if (INPUT_IS_SET && (TCNT0 > 52 )) break; // Make sure INPUT is not still set from us + // Line of experimentation: Try changing TCNT0 comparison value or remove check entirely + if (TCNT0 > 75 ) return 1; // Not sure if this fix is intent correct + } + + while(INPUT_IS_SET); + AVC_OUT_EN(); // back to write mode + return 0; + +} + +// DONE: Timing adjusted. +//------------------------------------------------------------------------------ +byte AVCLan_Send_ACK() +{ + TCNT0 = 0; + while (INPUT_IS_CLEAR) { + if (TCNT0 >= 225) return 0; // max wait time + } + + AVC_OUT_EN(); + + AVC_SET_1(); + TCNT0 = 0; + while( TCNT0 < 68 ); //28-37 + + AVC_SET_0(); + TCNT0 = 0; + while( TCNT0 < 11 ); //00-09 + + AVC_OUT_DIS(); + + return 1; +} + +// DONE: var 'byte' adjusted to 'bite' to avoid reserved word conflict +//------------------------------------------------------------------------------ +byte AVCLan_Send_Byte(byte bite, byte len) +{ + byte b; + if (len==8) { + b = bite; + } else { + b = bite << (8-len); + } + + while (1) { + if ( (b & 128)!=0 ) { + AVCLan_Send_Bit1(); + parity_bit++; + } else { + AVCLan_Send_Bit0(); + } + len--; + if (!len) { + //if (INPUT_IS_SET) RS232_Print_P(PSTR("SBER\n")); // Send Bit ERror + return 1; + } + b = b << 1; + } + +} + +// DONE: Nothing needed. +//------------------------------------------------------------------------------ +byte AVCLan_Send_ParityBit() +{ + if ( (parity_bit & 1)!=0 ) { + AVCLan_Send_Bit1(); + //parity_bit++; + } else { + AVCLan_Send_Bit0(); + } + parity_bit=0; + return 1; +} + +// DONE: Nothing needed. +//------------------------------------------------------------------------------ +byte CheckCmd(byte *cmd) +{ + byte i; + byte *c; + byte l; + + c = cmd; + l = *c++; + + for (i=0; i 255 ) { // 170 us + // // TCCR1B = 0; + // // TCCR1B |= (1 << WGM12)|(1 << CS12); // Set CTC, prescaler at 256 + // STARTEvent; + // RS232_Print_P(PSTR("LAN>T1\n")); + // return 0; + // } + // } + // + // if ( TCNT0 < 20 ) { // 20 us + // // TCCR1B = 0; + // // TCCR1B |= (1 << WGM12)|(1 << CS12); + // STARTEvent; + // RS232_Print_P(PSTR("LAN>T2\n")); + // return 0; + // } + AVCLan_Read_Byte(1); + + broadcast = AVCLan_Read_Byte(1); + + parity_bit = 0; + master1 = AVCLan_Read_Byte(4); + master2 = AVCLan_Read_Byte(8); + if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { + STARTEvent; + return 0; + } + + parity_bit = 0; + slave1 = AVCLan_Read_Byte(4); + slave2 = AVCLan_Read_Byte(8); + if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { + STARTEvent; + return 0; + } + // is this command for me ? + if ((slave1==CD_ID_1)&&(slave2==CD_ID_2)) { + for_me=1; + } + + if (for_me) AVCLan_Send_ACK(); + else AVCLan_Read_Byte(1); + + parity_bit = 0; + AVCLan_Read_Byte(4); // control - always 0xF + if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { + STARTEvent; + return 0; + } + if (for_me) AVCLan_Send_ACK(); + else AVCLan_Read_Byte(1); + + parity_bit = 0; + message_len = AVCLan_Read_Byte(8); + if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { + STARTEvent; + return 0; + } + if (for_me) AVCLan_Send_ACK(); + else AVCLan_Read_Byte(1); + + if (message_len > MAXMSGLEN) { + // RS232_Print_P(PSTR("LAN> Command error")); + STARTEvent; + return 0; + } + + for (i=0; i= 225 ) break; + } + if ( TCNT0 > 216 ) line_busy=0; + } while (line_busy); + + + // switch to output mode + AVC_OUT_EN(); + + AVCLan_Send_StartBit(); + AVCLan_Send_Byte(0x1, 1); // regular communication + + + parity_bit = 0; + AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master + AVCLan_Send_Byte(CD_ID_2, 8); + AVCLan_Send_ParityBit(); + + AVCLan_Send_Byte(HU_ID_1, 4); // HeadUnit ID as slave + AVCLan_Send_Byte(HU_ID_2, 8); + + AVCLan_Send_ParityBit(); + + if (AVCLan_Read_ACK()) { + AVC_OUT_DIS(); + STARTEvent; + RS232_Print_P(PSTR("Error ACK 1 (Transmission ACK)\n")); + return 1; + } + + + AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE + AVCLan_Send_ParityBit(); + if (AVCLan_Read_ACK()) { + AVC_OUT_DIS(); + STARTEvent; + RS232_Print_P(PSTR("Error ACK 2 (COMMMAND WRITE)\n")); + return 2; + } + + AVCLan_Send_Byte(data_len, 8);// data length + AVCLan_Send_ParityBit(); + if (AVCLan_Read_ACK()) { + AVC_OUT_DIS(); + STARTEvent; + RS232_Print_P(PSTR("Error ACK 3 (Data Length)\n")); + return 3; + } + + for (i=0;i= 225 ) break; + } + if ( TCNT0 > 216 ) line_busy=0; + } while (line_busy); + + + AVC_OUT_EN(); + + AVCLan_Send_StartBit(); + AVCLan_Send_Byte(0x0, 1); // broadcast + + parity_bit = 0; + AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master + AVCLan_Send_Byte(CD_ID_2, 8); + AVCLan_Send_ParityBit(); + + AVCLan_Send_Byte(0x1, 4); // all audio devices + AVCLan_Send_Byte(0xFF, 8); + AVCLan_Send_ParityBit(); + AVCLan_Send_Bit1(); + + AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE + AVCLan_Send_ParityBit(); + AVCLan_Send_Bit1(); + + AVCLan_Send_Byte(data_len, 8); // data lenght + AVCLan_Send_ParityBit(); + AVCLan_Send_Bit1(); + + for (i=0;i ")); + for (i=0; i. - - Portions of the following source code are: - Copyright (C) 2006 Marcin Slonicki . - - 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 2 - 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - ----------------------------------------------------------------------- - this file is a part of the TOYOTA Corolla MP3 Player Project - ----------------------------------------------------------------------- - http://www.softservice.com.pl/corolla/avc - - May 28 / 2009 - version 2 - -*/ - - -#ifndef __AVCLANDRV_H -#define __AVCLANDRV_H -//------------------------------------------------------------------------------ -#include "GlobalDef.h" - -#define STOPEvent cbi(TIMSK1, TOIE1); cbi(UCSR0B, RXCIE0); -#define STARTEvent sbi(TIMSK1, TOIE1); sbi(UCSR0B, RXCIE0); - - -#define CHECK_AVC_LINE if (INPUT_IS_SET) AVCLan_Read_Message(); - -void AVC_HoldLine(); -void AVC_ReleaseLine(); - -#define MAXMSGLEN 32 - -// Head Unid ID -extern byte HU_ID_1; // 0x01 -extern byte HU_ID_2; // 0x40 - -extern byte CD_ID_1; // 0x03 -extern byte CD_ID_2; // 0x60 - - -// DVD CHANGER -//#define CD_ID_1 0x02 -//#define CD_ID_2 0x50 - -#define cmNull 0 -#define cmStatus1 1 -#define cmStatus2 2 -#define cmStatus3 3 -#define cmStatus4 4 - - -#define cmRegister 100 -#define cmInit 101 -#define cmCheck 102 -#define cmPlayIt 103 -#define cmBeep 110 - -#define cmNextTrack 120 -#define cmPrevTrack 121 -#define cmNextDisc 122 -#define cmPrevDisc 123 - -#define cmScanModeOn 130 -#define cmScanModeOff 131 - -#define cmPlayReq1 5 -#define cmPlayReq2 6 -#define cmPlayReq3 7 -#define cmStopReq 8 -#define cmStopReq2 9 - -typedef enum { stStop=0, stPlay=1 } cd_modes; -extern cd_modes CD_Mode; - - -extern byte broadcast; -extern byte master1; -extern byte master2; -extern byte slave1; -extern byte slave2; -extern byte message_len; -extern byte message[MAXMSGLEN]; - -extern byte data_control; -extern byte data_len; -extern byte data[MAXMSGLEN]; - -byte AVCLan_Read_Message(); -void AVCLan_Send_Status(); - -void AVCLan_Init(); -void AVCLan_Register(); -byte AVCLan_SendData(); -byte AVCLan_SendAnswer(); -byte AVCLan_SendDataBroadcast(); -byte AVCLan_Command(byte command); - -byte HexInc(byte data); -byte HexDec(byte data); -byte Dec2Toy(byte data); - -extern byte check_timeout; - -extern byte cd_Disc; -extern byte cd_Track; -extern byte cd_Time_Min; -extern byte cd_Time_Sec; - -extern byte playMode; - -byte AVCLan_SendMyData(byte *data_tmp, byte s_len); -byte AVCLan_SendMyDataBroadcast(byte *data_tmp, byte s_len); - -void ShowInMessage(); -void ShowOutMessage(); - -void AVCLan_Measure(); - -//------------------------------------------------------------------------------ -extern byte answerReq; -//------------------------------------------------------------------------------ -#endif +/* + Copyright (C) 2015 Allen Hill . + + Portions of the following source code are: + Copyright (C) 2006 Marcin Slonicki . + + 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 2 + 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, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ----------------------------------------------------------------------- + this file is a part of the TOYOTA Corolla MP3 Player Project + ----------------------------------------------------------------------- + http://www.softservice.com.pl/corolla/avc + + May 28 / 2009 - version 2 + +*/ + + +#ifndef __AVCLANDRV_H +#define __AVCLANDRV_H +//------------------------------------------------------------------------------ +#include "GlobalDef.h" + +#define STOPEvent cbi(TIMSK1, TOIE1); cbi(UCSR0B, RXCIE0); +#define STARTEvent sbi(TIMSK1, TOIE1); sbi(UCSR0B, RXCIE0); + + +#define CHECK_AVC_LINE if (INPUT_IS_SET) AVCLan_Read_Message(); + +void AVC_HoldLine(); +void AVC_ReleaseLine(); + +#define MAXMSGLEN 32 + +// Head Unid ID +extern byte HU_ID_1; // 0x01 +extern byte HU_ID_2; // 0x40 + +extern byte CD_ID_1; // 0x03 +extern byte CD_ID_2; // 0x60 + + +// DVD CHANGER +//#define CD_ID_1 0x02 +//#define CD_ID_2 0x50 + +#define cmNull 0 +#define cmStatus1 1 +#define cmStatus2 2 +#define cmStatus3 3 +#define cmStatus4 4 + + +#define cmRegister 100 +#define cmInit 101 +#define cmCheck 102 +#define cmPlayIt 103 +#define cmBeep 110 + +#define cmNextTrack 120 +#define cmPrevTrack 121 +#define cmNextDisc 122 +#define cmPrevDisc 123 + +#define cmScanModeOn 130 +#define cmScanModeOff 131 + +#define cmPlayReq1 5 +#define cmPlayReq2 6 +#define cmPlayReq3 7 +#define cmStopReq 8 +#define cmStopReq2 9 + +typedef enum { stStop=0, stPlay=1 } cd_modes; +extern cd_modes CD_Mode; + + +extern byte broadcast; +extern byte master1; +extern byte master2; +extern byte slave1; +extern byte slave2; +extern byte message_len; +extern byte message[MAXMSGLEN]; + +extern byte data_control; +extern byte data_len; +extern byte data[MAXMSGLEN]; + +byte AVCLan_Read_Message(); +void AVCLan_Send_Status(); + +void AVCLan_Init(); +void AVCLan_Register(); +byte AVCLan_SendData(); +byte AVCLan_SendAnswer(); +byte AVCLan_SendDataBroadcast(); +byte AVCLan_Command(byte command); + +byte HexInc(byte data); +byte HexDec(byte data); +byte Dec2Toy(byte data); + +extern byte check_timeout; + +extern byte cd_Disc; +extern byte cd_Track; +extern byte cd_Time_Min; +extern byte cd_Time_Sec; + +extern byte playMode; + +byte AVCLan_SendMyData(byte *data_tmp, byte s_len); +byte AVCLan_SendMyDataBroadcast(byte *data_tmp, byte s_len); + +void ShowInMessage(); +void ShowOutMessage(); + +#ifdef SOFTWARE_DEBUG + void AVCLan_Measure(); +#endif +#ifdef HARDWARE_DEBUG + void SetHighLow(); +#endif + +//------------------------------------------------------------------------------ +extern byte answerReq; +//------------------------------------------------------------------------------ +#endif diff --git a/capture.md b/capture.md new file mode 100644 index 0000000..c85c6ae --- /dev/null +++ b/capture.md @@ -0,0 +1,124 @@ +``` c +HU < (bro) 190| FFF| 11 01 00 // lan_reg +out > 00 01 11 10 63 // CMD_REGISTER +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use +HU < (bro) 190| FFF| 11 01 01 // lan_init +out > 63 31 F1 00 80 FF FF FF FF 00 80 // /* +out > 63 31 F3 00 3F 00 00 00 00 02 +out > 63 31 F3 00 3F 00 01 00 01 02 +out > 63 31 F3 00 3D 00 01 00 01 02 +out > 63 31 F3 00 39 00 01 00 01 02 // Registration gobbledygook +out > 63 31 F3 00 31 00 01 00 01 02 // probably not all necessary +out > 63 31 F3 00 21 00 01 00 01 02 +out > 63 31 F1 00 90 01 FF FF FF 00 80 +out > 63 31 F3 00 01 00 01 00 01 02 +out > 63 31 F1 00 30 01 FF FF FF 00 80 // */ +HU < (dir) 190| 360| 00 31 63 E0 // Similar to play_req1 + // Logic device ID 31 => Me (63) + // Command E0 + // What is logic device 31??? + +HU < (dir) 190| 360| 00 25 63 E4 // Also similar to play_req1 + +HU < (bro) 190| FFF| 01 01 59 39 // Nothing heard? +HU < (bro) 190| FFF| 01 01 59 39 // What is logic device 59??? +HU < (dir) 190| 360| 00 31 63 E0 + +HU < (dir) 190| 360| 00 31 63 E0 // Try again? +HU < (dir) 190| 360| 00 31 63 E0 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (bro) 190| FFF| 11 01 00 +out > 00 01 11 10 63 +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use +HU < (bro) 190| FFF| 11 01 01 +out > 63 31 F1 00 80 FF FF FF FF 00 80 +out > 63 31 F3 00 3F 00 00 00 00 02 +out > 63 31 F3 00 3F 00 01 00 01 02 +out > 63 31 F3 00 3D 00 01 00 01 02 +out > 63 31 F3 00 39 00 01 00 01 02 +out > 63 31 F3 00 31 00 01 00 01 02 +out > 63 31 F3 00 21 00 01 00 01 02 +out > 63 31 F1 00 90 01 FF FF FF 00 80 +out > 63 31 F3 00 01 00 01 00 01 02 +out > 63 31 F1 00 30 01 FF FF FF 00 80 +HU < (dir) 190| 360| 00 31 63 E0 + +HU < (dir) 190| 360| 00 25 63 E4 + +HU < (bro) 190| FFF| 01 01 59 39 +HU < (bro) 190| FFF| 01 01 59 39 +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use +HU < (bro) 190| FFF| 01 01 59 39 +HU < (dir) 190| 360| 00 31 63 E0 + +HU < (dir) 190| 360| 00 31 63 E0 +HU < (dir) 190| 360| 00 31 63 E0 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 42 41 + +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 31 63 E2 +HU < (dir) 190| 360| 00 25 63 80 // play_req1 +out > 00 63 11 50 01 // CMD_PLAY_OK1 +HU < (dir) 190| 360| 00 11 63 43 01 // stop_req +out > 00 63 11 53 01 // CMD_STOP1 +out > 63 31 F1 00 30 01 01 00 00 00 80 // Player Status +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use + + + +HU < (dir) 190| 360| 00 25 63 80 // play_req1 +out > 00 63 11 50 01 // CMD_PLAY_OK1 +HU < (dir) 190| 360| 00 11 63 42 41 // play_req3 but without ending 00 + +HU < (dir) 190| 360| 00 11 63 42 41 // Trying again? +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 43 01 +out > 00 63 11 53 01 +out > 63 31 F1 00 30 01 01 00 00 00 80 +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use + +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 42 41 + +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 43 01 +out > 00 63 11 53 01 +out > 63 31 F1 00 30 01 01 00 00 00 80 +HU < (bro) 190| FFF| 11 01 45 60 // Tuner in use + +HU < (dir) 190| 360| 00 25 63 80 +out > 00 63 11 50 01 +HU < (dir) 190| 360| 00 11 63 42 41 + +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 11 63 42 41 +HU < (dir) 190| 360| 00 11 63 43 01 +out > 00 63 11 53 01 +out > 63 31 F1 00 30 01 01 00 00 00 80 + +``` diff --git a/com232.c b/com232.c index 1e0a122..4b1bfae 100644 --- a/com232.c +++ b/com232.c @@ -1,129 +1,149 @@ -/* - Copyright (C) 2006 Marcin Slonicki . - - 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 2 - 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - ----------------------------------------------------------------------- - this file is a part of the TOYOTA Corolla MP3 Player Project - ----------------------------------------------------------------------- - http://www.softservice.com.pl/corolla/avc - - May 28 / 2009 - version 2 - -*/ - -#include -#include -#include -#include "com232.h" - -byte RS232_RxCharBuffer[25], RS232_RxCharBegin, RS232_RxCharEnd; -byte readkey; - -//------------------------------------------------------------------------------ -void RS232_Init(void) -{ - // init LED - sbi(DDRB, 5); - cbi(PORTB, 5); - - RS232_RxCharBegin = RS232_RxCharEnd = 0; - - UCSR0A = 0; - UCSR0B = ((1< 9600 - // 51 => 19200 - // 25 => 38400 - // 8 => 115200 - // 3 => 250000 - -} -//------------------------------------------------------------------------------ -ISR(USART_RX_vect) -{ - RS232_RxCharBuffer[RS232_RxCharEnd] = UDR0; // Store received character to the End of Buffer - RS232_RxCharEnd++; -} -//------------------------------------------------------------------------------ -void RS232_SendByte(byte Data) -{ - while ((UCSR0A & _BV(UDRE0)) != _BV(UDRE0)); // wait for UART to become available - UDR0 = Data; // send character -} -//------------------------------------------------------------------------------ -void RS232_Print_P(const char * str_addr) -{ - register byte c; - while ( (c = pgm_read_byte(str_addr++) ) ) - { - if (c == '\n') - RS232_SendByte('\r'); - RS232_SendByte(c); - } -} -//------------------------------------------------------------------------------ -void RS232_Print(const char *pBuf) -{ - register byte c; - while ((c = *pBuf++)) - { - if (c == '\n') - RS232_SendByte('\r'); - RS232_SendByte(c); - } -} -//------------------------------------------------------------------------------ -void RS232_PrintHex4(byte Data) -{ - byte Character = Data & 0x0f; - Character += '0'; - if (Character > '9') - Character += 'A' - '0' - 10; - RS232_SendByte(Character); -} -//------------------------------------------------------------------------------ -void RS232_PrintHex8(byte Data) -{ - RS232_PrintHex4(Data >> 4); - RS232_PrintHex4(Data); -} -//------------------------------------------------------------------------------ -void RS232_PrintDec(byte Data) -{ - if (Data>99) { - RS232_SendByte('*'); - return; - } - if (Data<10) { - RS232_SendByte('0'+Data); - return; - } - byte c; - unsigned short v,v1; - v = Data; - v1 = v/10; - c = '0' + (v-v1*10); - RS232_SendByte('0'+v1); - RS232_SendByte(c); -} -//------------------------------------------------------------------------------ -void RS232_PrintDec2(byte Data) -{ - if (Data<10) RS232_SendByte('0'); - RS232_PrintDec(Data); -} -//------------------------------------------------------------------------------ +/* + Copyright (C) 2006 Marcin Slonicki . + + 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 2 + 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, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ----------------------------------------------------------------------- + this file is a part of the TOYOTA Corolla MP3 Player Project + ----------------------------------------------------------------------- + http://www.softservice.com.pl/corolla/avc + + May 28 / 2009 - version 2 + +*/ + +#include +#include +#include +#include "com232.h" + +byte RS232_RxCharBuffer[25], RS232_RxCharBegin, RS232_RxCharEnd; +byte readkey; + +//------------------------------------------------------------------------------ +void RS232_Init(void) +{ + // init LED + sbi(DDRB, 5); + cbi(PORTB, 5); + + RS232_RxCharBegin = RS232_RxCharEnd = 0; + + UCSR0A = 0; + UCSR0B = ((1< 9600 + // 51 => 19200 + // 25 => 38400 + // 8 => 115200 + // 3 => 250000 + +} +//------------------------------------------------------------------------------ +ISR(USART_RX_vect) +{ + RS232_RxCharBuffer[RS232_RxCharEnd] = UDR0; // Store received character to the End of Buffer + RS232_RxCharEnd++; +} +//------------------------------------------------------------------------------ +void RS232_SendByte(byte Data) +{ + while ((UCSR0A & _BV(UDRE0)) != _BV(UDRE0)); // wait for UART to become available + UDR0 = Data; // send character +} +//------------------------------------------------------------------------------ +void RS232_Print_P(const char * str_addr) +{ + register byte c; + while ( (c = pgm_read_byte(str_addr++) ) ) + { + if (c == '\n') + RS232_SendByte('\r'); + RS232_SendByte(c); + } +} +//------------------------------------------------------------------------------ +void RS232_Print(const char *pBuf) +{ + register byte c; + while ((c = *pBuf++)) + { + if (c == '\n') + RS232_SendByte('\r'); + RS232_SendByte(c); + } +} +//------------------------------------------------------------------------------ +void RS232_PrintHex4(byte Data) +{ + byte Character = Data & 0x0f; + Character += '0'; + if (Character > '9') + Character += 'A' - '0' - 10; + RS232_SendByte(Character); +} +//------------------------------------------------------------------------------ +void RS232_PrintHex8(byte Data) +{ + RS232_PrintHex4(Data >> 4); + RS232_PrintHex4(Data); +} +//------------------------------------------------------------------------------ +void RS232_PrintDec(byte Data) +{ + if (Data>99) { + RS232_SendByte('*'); + return; + } + if (Data<10) { + RS232_SendByte('0'+Data); + return; + } + byte c; + unsigned short v,v1; + v = Data; + v1 = v/10; + c = '0' + (v-v1*10); + RS232_SendByte('0'+v1); + RS232_SendByte(c); +} +//------------------------------------------------------------------------------ +void RS232_PrintDec2(byte Data) +{ + if (Data<10) RS232_SendByte('0'); + RS232_PrintDec(Data); +} + +char* itoa(int i, char b[]){ + char const digit[] = "0123456789"; + char* p = b; + if(i<0){ + *p++ = '-'; + i *= -1; + } + int shifter = i; + do{ //Move to where representation ends + ++p; + shifter = shifter/10; + }while(shifter); + *p = '\0'; + do{ //Move back, inserting digits as u go + *--p = digit[i%10]; + i = i/10; + }while(i); + return b; +} +//------------------------------------------------------------------------------ diff --git a/com232.h b/com232.h index 890ce5c..cd1d911 100644 --- a/com232.h +++ b/com232.h @@ -44,6 +44,7 @@ extern void RS232_PrintHex4(byte Data); extern void RS232_PrintHex8(byte Data); extern void RS232_PrintDec(byte Data); extern void RS232_PrintDec2(byte Data); +extern char* itoa(int i, char b[]); //------------------------------------------------------------------------------ // LED diff --git a/sniffer.c b/sniffer.c index 90db922..9dcec29 100644 --- a/sniffer.c +++ b/sniffer.c @@ -1,298 +1,267 @@ -/* - Copyright (C) 2006 Marcin Slonicki . - - 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 2 - 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - ----------------------------------------------------------------------- - this file is a part of the TOYOTA Corolla MP3 Player Project - ----------------------------------------------------------------------- - http://www.softservice.com.pl/corolla/avc - - May 28 / 2009 - version 2 - -*/ - - - -#include -#include -#include - -#include "GlobalDef.h" -#include "com232.h" -#include "avclandrv.h" - - -// ------------------------------------------------------------------------------------- -void Setup(); - -byte rcv_command[5]; -byte rcv_pos = 0; -byte rcv_time_clr = 0; - -// ------------------------------------------------------------------------------------- - - - - -// ------------------------------------------------------------------------------------- -// MAIN PROGRAM -// -int main() -{ -// byte h; - - - byte readSeq = 0; - byte s_len = 0; - byte s_dig = 0; - byte s_c[2]; - byte i; - byte data_tmp[32]; - - Setup(); - TCNT0 = 0; - while( TCNT0 < 250 ); - TCNT0 = 0; - while( TCNT0 < 250 ); - TCNT0 = 0; - while( TCNT0 < 250 ); - - - - RS232_Print("AVCLan reader 1.00\nReady\n\n"); - LED_OFF(); - RS232_Print_P(PSTR("D - device id\nH - HU id\nS - read sequence\nW - send command\nQ - send broadcast\nL/l - log on/off\nK/k - seq. echo on/off\nR/r - register device\nB - Beep\nT - Measure interval\n")); - - - - while (1) { - - if (INPUT_IS_SET) { // if message from some device on AVCLan begin - LED_ON(); - AVCLan_Read_Message(); - // show message - } else { - LED_OFF(); - // check command from HU - if (answerReq != 0) AVCLan_SendAnswer(); - } - - // HandleEvent - switch (Event) { - case EV_STATUS: Event &= ~EV_STATUS; - AVCLan_Send_Status(); - break; - } - - - // Key handler - if (RS232_RxCharEnd) { - cbi(UCSR0B, RXCIE0); // disable RX complete interrupt - readkey = RS232_RxCharBuffer[RS232_RxCharBegin];// read begin of received Buffer - RS232_RxCharBegin++; - if (RS232_RxCharBegin == RS232_RxCharEnd) // if Buffer is empty - RS232_RxCharBegin = RS232_RxCharEnd = 0; // do reset Buffer - sbi(UCSR0B, RXCIE0); // enable RX complete interrupt - switch (readkey) { - case 'D': if (readSeq) { - CD_ID_1 = data_tmp[0]; - CD_ID_2 = data_tmp[1]; - RS232_Print_P(PSTR("DEV ID SET: 0x")); - RS232_PrintHex8(CD_ID_1); - RS232_PrintHex8(CD_ID_2); - RS232_Print_P(PSTR("\n")); - showLog = 1; - readSeq=0; - } else { - showLog = 0; - RS232_Print_P(PSTR("DEV ID > \n")); - readSeq = 1; - s_len=0; - s_dig=0; - s_c[0]=s_c[1]=0; - } - break; - - case 'H': if (readSeq) { - HU_ID_1 = data_tmp[0]; - HU_ID_2 = data_tmp[1]; - RS232_Print_P(PSTR("HU ID SET: 0x")); - RS232_PrintHex8(HU_ID_1); - RS232_PrintHex8(HU_ID_2); - RS232_Print_P(PSTR("\n")); - showLog = 1; - readSeq=0; - } else { - showLog = 0; - RS232_Print_P(PSTR("HU ID > \n")); - readSeq = 1; - s_len=0; - s_dig=0; - s_c[0]=s_c[1]=0; - } - break; - - case 'S': showLog = 0; - RS232_Print_P(PSTR("READ SEQUENCE > \n")); - readSeq = 1; - s_len=0; - s_dig=0; - s_c[0]=s_c[1]=0; - break; - case 'W' : showLog = 1; - readSeq=0; - AVCLan_SendMyData(data_tmp, s_len); - break; - case 'Q' : showLog = 1; - readSeq=0; - AVCLan_SendMyDataBroadcast(data_tmp, s_len); - break; - - - case 'R': RS232_Print_P(PSTR("REGIST:\n")); - AVCLan_Command( cmRegister ); - TCNT0 = 0; - while( TCNT0 < 135 ); - CHECK_AVC_LINE; - break; - case 'r': AVCLan_Register(); - break; - - - case 'l': RS232_Print_P(PSTR("Log OFF\n")); - showLog = 0; - break; - case 'L': RS232_Print_P(PSTR("Log ON\n")); - showLog = 1; - break; - - case 'k': RS232_Print_P(PSTR("str OFF\n")); - showLog2 = 0; - break; - case 'K': RS232_Print_P(PSTR("str ON\n")); - showLog2 = 1; - break; - case 'B': - data_tmp[0] = 0x00; - data_tmp[0] = 0x5E; - data_tmp[0] = 0x29; - data_tmp[0] = 0x60; - data_tmp[0] = 0x01; - s_len = 5; - AVCLan_SendMyData(data_tmp, s_len); - break; - case 'T': - AVCLan_Measure(); - break; - - default : - if (readSeq==1) { - s_c[s_dig]=readkey; - - s_dig++; - if (s_dig==2) { - if (s_c[0]<':') s_c[0] -= 48; - else s_c[0] -= 55; - data_tmp[s_len] = 16 * s_c[0]; - if (s_c[1]<':') s_c[1] -= 48; - else s_c[1] -= 55; - data_tmp[s_len] += s_c[1]; - s_len++; - s_dig=0; - s_c[0]=s_c[1]=0; - } - if (showLog2) { - RS232_Print_P(PSTR("CURRENT SEQUENCE > ")); - for (i=0; i. + + 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 2 + 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, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ----------------------------------------------------------------------- + this file is a part of the TOYOTA Corolla MP3 Player Project + ----------------------------------------------------------------------- + http://www.softservice.com.pl/corolla/avc + + May 28 / 2009 - version 2 + +*/ + + + +#include +#include +#include + +#include "GlobalDef.h" +#include "com232.h" +#include "avclandrv.h" + + +// ------------------------------------------------------------------------------------- +void Setup(); + +byte rcv_command[5]; +byte rcv_pos = 0; +byte rcv_time_clr = 0; + +// ------------------------------------------------------------------------------------- + + + + +// ------------------------------------------------------------------------------------- +// MAIN PROGRAM +// +int main() +{ + + byte readSeq = 0; + byte s_len = 0; + byte s_dig = 0; + byte s_c[2]; + byte i; + byte data_tmp[32]; + + Setup(); + + RS232_Print("AVCLan reader 1.00\nReady\n\n"); + LED_OFF(); + RS232_Print_P(PSTR("\nS - read sequence\nW - send command\nQ - send broadcast\nL/l - log on/off\nK/k - seq. echo on/off\n")); + RS232_Print_P(PSTR("R/r - register device\nB - Beep\n")); +#ifdef HARDWARE_DEBUG + RS232_Print_P(PSTR("1 - Hold High/low\nE - Print line status\n")); +#endif +#ifdef SOFTWARE_DEBUG + RS232_Print_P(PSTR("M - Measure high and low lengths\n")); +#endif + + while (1) { + + if (INPUT_IS_SET) { // if message from some device on AVCLan begin + LED_ON(); + AVCLan_Read_Message(); + // show message + } else { + LED_OFF(); + // check command from HU + if (answerReq != 0) AVCLan_SendAnswer(); + } + + // HandleEvent + switch (Event) { + case EV_STATUS: Event &= ~EV_STATUS; + AVCLan_Send_Status(); + break; + } + + + // Key handler + if (RS232_RxCharEnd) { + cbi(UCSR0B, RXCIE0); // disable RX complete interrupt + readkey = RS232_RxCharBuffer[RS232_RxCharBegin];// read begin of received Buffer + RS232_RxCharBegin++; + if (RS232_RxCharBegin == RS232_RxCharEnd) // if Buffer is empty + RS232_RxCharBegin = RS232_RxCharEnd = 0; // do reset Buffer + sbi(UCSR0B, RXCIE0); // enable RX complete interrupt + switch (readkey) { + case 'S': showLog = 0; + RS232_Print_P(PSTR("READ SEQUENCE > \n")); + readSeq = 1; + s_len=0; + s_dig=0; + s_c[0]=s_c[1]=0; + break; + case 'W' : showLog = 1; + readSeq=0; + AVCLan_SendMyData(data_tmp, s_len); + break; + case 'Q' : showLog = 1; + readSeq=0; + AVCLan_SendMyDataBroadcast(data_tmp, s_len); + break; + case 'R': RS232_Print_P(PSTR("REGIST:\n")); + AVCLan_Command( cmRegister ); + TCNT0 = 0; + while( TCNT0 < 135 ); + CHECK_AVC_LINE; + break; + case 'r': AVCLan_Register(); + break; + case 'l': RS232_Print_P(PSTR("Log OFF\n")); + showLog = 0; + break; + case 'L': RS232_Print_P(PSTR("Log ON\n")); + showLog = 1; + break; + case 'k': RS232_Print_P(PSTR("str OFF\n")); + showLog2 = 0; + break; + case 'K': RS232_Print_P(PSTR("str ON\n")); + showLog2 = 1; + break; + case 'B': + data_tmp[0] = 0x00; + data_tmp[1] = 0x5E; + data_tmp[2] = 0x29; + data_tmp[3] = 0x60; + data_tmp[4] = 0x01; + s_len = 5; + AVCLan_SendMyData(data_tmp, s_len); + break; + +#ifdef HARDWARE_DEBUG + case '1': + SetHighLow(); + break; + case 'E': + if(INPUT_IS_SET) { + RS232_Print_P(PSTR("Set/High/1\n")); + } else if (INPUT_IS_CLEAR) { + RS232_Print_P(PSTR("Unset/Low/0\n")); + } else { + RS232_Print_P(PSTR("WTF?\n")); + } + break; +#endif +#ifdef SOFTWARE_DEBUG + case 'M': + AVCLan_Measure(); + break; +#endif + + default : + if (readSeq==1) { + s_c[s_dig]=readkey; + + s_dig++; + if (s_dig==2) { + if (s_c[0]<':') s_c[0] -= 48; + else s_c[0] -= 55; + data_tmp[s_len] = 16 * s_c[0]; + if (s_c[1]<':') s_c[1] -= 48; + else s_c[1] -= 55; + data_tmp[s_len] += s_c[1]; + s_len++; + s_dig=0; + s_c[0]=s_c[1]=0; + } + if (showLog2) { + RS232_Print_P(PSTR("CURRENT SEQUENCE > ")); + for (i=0; i