224 lines
6.7 KiB
C
Executable File
224 lines
6.7 KiB
C
Executable File
/*******************************************************************************
|
|
' Author: Dave Hein
|
|
' Version 0.54
|
|
' Copyright (c) 2012
|
|
' See end of file for terms of use.
|
|
'******************************************************************************/
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "spinsim.h"
|
|
|
|
extern int32_t pin_val;
|
|
extern int32_t eeprom;
|
|
|
|
static int32_t scl_prev = 1;
|
|
static int32_t sda_prev = 1;
|
|
static int32_t state = 0;
|
|
static int32_t count = 0;
|
|
static int32_t value = 0;
|
|
static int32_t control = 0;
|
|
static int32_t address = 0;
|
|
static int32_t drivepin = 0;
|
|
static int32_t driveval = 0;
|
|
|
|
static unsigned char memory[256*256];
|
|
|
|
void CheckEEProm()
|
|
{
|
|
int32_t scl = (pin_val >> 28) & 1;
|
|
int32_t sda = (pin_val >> 29) & 1;
|
|
|
|
if (!eeprom) return;
|
|
|
|
//printf("scl = %d, sda = %d\n", scl, sda);
|
|
|
|
if (!drivepin && scl_prev && sda_prev && scl && !sda)
|
|
{
|
|
//printf("Start\n");
|
|
count = 0;
|
|
state = 1;
|
|
control = 0;
|
|
drivepin = 0;
|
|
}
|
|
else if (!drivepin && scl_prev && !sda_prev && scl && sda)
|
|
{
|
|
//printf("Stop\n");
|
|
state = 0;
|
|
drivepin = 0;
|
|
}
|
|
else if (state && scl_prev && !scl)
|
|
{
|
|
drivepin = 0;
|
|
if (state == 1)
|
|
{
|
|
if (count) control = (control << 1) | sda_prev;
|
|
count++;
|
|
if (count == 9)
|
|
{
|
|
//printf("control = %2.2x\n", control);
|
|
if ((control & 0xf0) == 0xa0)
|
|
{
|
|
drivepin = 1;
|
|
driveval = 0;
|
|
count = 0;
|
|
if (control & 1)
|
|
state = 5;
|
|
else
|
|
state = 2;
|
|
}
|
|
else
|
|
{
|
|
state = 0;
|
|
}
|
|
}
|
|
}
|
|
else if (state == 2 || state == 3)
|
|
{
|
|
if (count) address = (address << 1) | sda_prev;
|
|
else if (state == 2) address = 0;
|
|
count++;
|
|
if (count == 9)
|
|
{
|
|
//if (state == 3) printf("address = %2.2x\n", address);
|
|
state++;
|
|
drivepin = 1;
|
|
driveval = 0;
|
|
count = 0;
|
|
}
|
|
}
|
|
else if (state == 4)
|
|
{
|
|
if (count) value = (value << 1) | sda_prev;
|
|
count++;
|
|
if (count == 9)
|
|
{
|
|
//printf("value = %2.2x\n", value);
|
|
memory[address] = value;
|
|
address = (address + 1) & 0xffff;
|
|
drivepin = 1;
|
|
driveval = 0;
|
|
count = 0;
|
|
eeprom = 2;
|
|
}
|
|
}
|
|
else if (state == 5)
|
|
{
|
|
if (count == 0)
|
|
{
|
|
if (sda_prev)
|
|
state = 0;
|
|
else
|
|
{
|
|
value = memory[address];
|
|
drivepin = 1;
|
|
driveval = (value >> 7) & 1;
|
|
value <<= 1;
|
|
count++;
|
|
address = (address + 1) & 0xffff;
|
|
}
|
|
}
|
|
else if (count < 8)
|
|
{
|
|
drivepin = 1;
|
|
driveval = (value >> 7) & 1;
|
|
value <<= 1;
|
|
count++;
|
|
}
|
|
else
|
|
{
|
|
count = 0;
|
|
drivepin = 0;
|
|
}
|
|
}
|
|
}
|
|
if (drivepin)
|
|
{
|
|
pin_val = (pin_val & (~(1 << 29))) | (driveval << 29);
|
|
sda = driveval;
|
|
}
|
|
scl_prev = scl;
|
|
sda_prev = sda;
|
|
}
|
|
|
|
static FILE *OpenFile(char *fname, char *mode)
|
|
{
|
|
FILE *file = fopen(fname, mode);
|
|
if (!file)
|
|
{
|
|
printf("Could not open %s\n", fname);
|
|
spinsim_exit(1);
|
|
}
|
|
return file;
|
|
}
|
|
|
|
void EEPromInit(char *fname)
|
|
{
|
|
FILE *file;
|
|
|
|
if (!eeprom) return;
|
|
|
|
//printf("EEPromInit(%s)\n", fname);
|
|
|
|
if (fname)
|
|
{
|
|
file = fopen("eeprom.dat", "r");
|
|
if (file)
|
|
{
|
|
fread(memory, 1, 65536, file);
|
|
fclose(file);
|
|
memset(memory, 0, 32768);
|
|
}
|
|
else
|
|
memset(memory, 0, 65536);
|
|
file = OpenFile(fname, "r");
|
|
fread(memory, 1, 65536, file);
|
|
fclose(file);
|
|
file = OpenFile("eeprom.dat", "w");
|
|
fwrite(memory, 1, 65536, file);
|
|
fclose(file);
|
|
return;
|
|
}
|
|
file = OpenFile("eeprom.dat", "r");
|
|
fread(memory, 1, 65536, file);
|
|
fclose(file);
|
|
}
|
|
|
|
void EEPromClose(void)
|
|
{
|
|
FILE *file;
|
|
|
|
if (eeprom == 2)
|
|
{
|
|
file = OpenFile("eeprom.dat", "w");
|
|
fwrite(memory, 1, 65536, file);
|
|
fclose(file);
|
|
}
|
|
}
|
|
|
|
void EEPromCopy(char *mem)
|
|
{
|
|
if (!eeprom) return;
|
|
|
|
//printf("EEPromCopy\n");
|
|
memcpy(mem, memory, 32768);
|
|
}
|
|
/*
|
|
+------------------------------------------------------------------------------------------------------------------------------+
|
|
| TERMS OF USE: MIT License |
|
|
+------------------------------------------------------------------------------------------------------------------------------+
|
|
|Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation |
|
|
|files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, |
|
|
|modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software|
|
|
|is furnished to do so, subject to the following conditions: |
|
|
| |
|
|
|The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.|
|
|
| |
|
|
|THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE |
|
|
|WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
|
|
|COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
|
|
|ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
+------------------------------------------------------------------------------------------------------------------------------+
|
|
*/
|