commit
1128ebf5f6
@ -0,0 +1,13 @@
|
|||||||
|
DEFINES += -DF_CPU=16000000
|
||||||
|
CFLAGS += -save-temps
|
||||||
|
CFLAGS += -std=gnu99 -Wall # implements C99, for <util/atomic.h>
|
||||||
|
# this removes dead code and does global linker optimization
|
||||||
|
#CFLAGS += -ffunction-sections -Wl,--gc-sections -Wl,--relax
|
||||||
|
CFLAGS += -Wall -Os -I. -mmcu=atmega88
|
||||||
|
|
||||||
|
# further optimization:
|
||||||
|
#CFLAGS += --param inline-call-cost=2
|
||||||
|
CFLAGS += -fno-move-loop-invariants # suggestions from from v-usb
|
||||||
|
CFLAGS += -fno-tree-scev-cprop
|
||||||
|
CFLAGS += -fno-inline-small-functions
|
||||||
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "i2c_simple.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void i2c_init(){
|
|
||||||
//TODO: implement
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data){
|
|
||||||
return 0; //TODO: implement
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data){
|
|
||||||
return 0; //TODO: implement
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t* writedata, uint8_t readlen,
|
|
||||||
uint8_t* readdata){
|
|
||||||
return 0; //TODO: implement
|
|
||||||
}
|
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
# masterchip-makefile
|
||||||
|
include ../Makefile.inc
|
||||||
|
|
||||||
|
COMPILE = avr-gcc $(CFLAGS) $(DEFINES)
|
||||||
|
|
||||||
|
OBJECTS = usbdrv/usbdrvasm.o usbdrv/usbdrv.o main.o display.o lcd/lcd.o usb.o
|
||||||
|
|
||||||
|
# symbolic targets:
|
||||||
|
all: firmware.hex
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) -c $< -o $@
|
||||||
|
|
||||||
|
.S.o:
|
||||||
|
$(COMPILE) -x assembler-with-cpp -c $< -o $@
|
||||||
|
# "-x assembler-with-cpp" should not be necessary since this is the default
|
||||||
|
# file type for the .S (with capital S) extension. However, upper case
|
||||||
|
# characters are not always preserved on Windows. To ensure WinAVR
|
||||||
|
# compatibility define the file type manually.
|
||||||
|
|
||||||
|
.c.s:
|
||||||
|
$(COMPILE) -S $< -o $@
|
||||||
|
|
||||||
|
flash: all
|
||||||
|
avrdude -c usbasp -p m88 -U flash:w:firmware.hex
|
||||||
|
|
||||||
|
fuses:
|
||||||
|
avrdude -c usbasp -p m88 -U lfuse:w:0xdf:m -U hfuse:w:0xde:m # external oscillator
|
||||||
|
|
||||||
|
|
||||||
|
## what are the source dependencies
|
||||||
|
%.d: %.c
|
||||||
|
@set -e; rm -f $@; \
|
||||||
|
$(COMPILE) -MM $< | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@;
|
||||||
|
# line 1: exits if anything goes wrong
|
||||||
|
# line 2a: gcc -MM outputs dependencies
|
||||||
|
# line 2b: insert the %.d into dependency list
|
||||||
|
|
||||||
|
#main.c: version.h
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.hex *.obj *.i *.s *.d */*.i */*.s */*.o */*.d version.h
|
||||||
|
|
||||||
|
# file targets:
|
||||||
|
firmware.bin: $(OBJECTS)
|
||||||
|
$(COMPILE) -o firmware.bin $(OBJECTS)
|
||||||
|
|
||||||
|
firmware.hex: firmware.bin
|
||||||
|
rm -f firmware.hex firmware.eep.hex
|
||||||
|
avr-objcopy -j .text -j .data -O ihex firmware.bin firmware.hex
|
||||||
|
avr-size firmware.bin
|
||||||
|
# ./checksize firmware.bin 8192 960
|
||||||
|
# do the checksize script as our last action to allow successful compilation
|
||||||
|
# on Windows with WinAVR where the Unix commands will fail.
|
||||||
|
|
||||||
|
disasm: firmware.bin
|
||||||
|
avr-objdump -d firmware.bin >disasm
|
||||||
|
|
||||||
|
functionsize: disasm
|
||||||
|
python ../avrbuild/functionsize.py
|
||||||
|
|
||||||
|
countregs: disasm
|
||||||
|
python ../avrbuild/countregs.py
|
||||||
|
|
||||||
|
# for depends:
|
||||||
|
-include $(OBJECTS:.o=.d)
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../shared/softtimer.c
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../shared/softtimer.h
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../shared/spi.c
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../shared/spi.h
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../../vusb-20100715/usbdrv
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
#include "softtimer.h"
|
||||||
|
|
||||||
|
volatile uint16_t timer1_acc;
|
||||||
|
uint16_t softtimer_last[SOFTTIMERNUMS];
|
||||||
|
|
||||||
|
void softtimer_reset(uint8_t timernum){
|
||||||
|
softtimer_last[timernum] = timer1_acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t softtimer(uint8_t timernum, uint16_t interval){
|
||||||
|
uint16_t timer1_acc_tmp = timer1_acc; // because of volatile
|
||||||
|
if((uint16_t)(timer1_acc_tmp - (uint16_t)(softtimer_last[timernum]) >= interval )){
|
||||||
|
softtimer_last[timernum] = timer1_acc_tmp;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SOFTTIMER( <YOUR TIMER NUM>, <YOUR INTERVAL>);
|
||||||
|
// #define SOFTTIMER(n,a) if(softtimer((n),(a*8)))
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// NOTES:
|
||||||
|
// Please #define SOFTTIMERNUMS aNum before including this!
|
||||||
|
|
||||||
|
#ifndef __SOFTTIMER_H
|
||||||
|
#define __SOFTTIMER_H
|
||||||
|
|
||||||
|
extern volatile uint16_t timer1_acc;
|
||||||
|
extern uint16_t softtimer_last[SOFTTIMERNUMS];
|
||||||
|
|
||||||
|
|
||||||
|
void softtimer_reset(uint8_t timernum);
|
||||||
|
uint8_t softtimer(uint8_t timernum, uint16_t interval);
|
||||||
|
|
||||||
|
// SOFTTIMER( <YOUR TIMER NUM>, <YOUR INTERVAL>);
|
||||||
|
#define SOFTTIMER(n,a) if(softtimer((n),(a*8)))
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
#include <avr/io.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <spi.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* SPI framework.
|
||||||
|
*
|
||||||
|
* currently alpha, uses interrupts, single master/single slave operation
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t * volatile spi_writeptr;
|
||||||
|
uint8_t * volatile spi_readptr;
|
||||||
|
uint8_t volatile spi_writelen;
|
||||||
|
uint8_t volatile spi_readlen;
|
||||||
|
uint8_t spi_readbuf[SPI_READBUF_LEN];
|
||||||
|
|
||||||
|
|
||||||
|
void spi_init(){
|
||||||
|
uint8_t spcr, spsr, d;
|
||||||
|
|
||||||
|
/* calculate clock divisor,
|
||||||
|
* gcc with optimize will do that calculation compile-time. */
|
||||||
|
uint8_t spi_clock_divisor(){
|
||||||
|
double d;
|
||||||
|
d = F_CPU / SPI_BAUDRATE;
|
||||||
|
d = ceil((log(d)/log(2))*0.95); // clock needs dividing by 2^d
|
||||||
|
// the 0.95 to avoid ceil issues
|
||||||
|
return d-1; // the -1 because minimum divisor is /2
|
||||||
|
}
|
||||||
|
|
||||||
|
d = spi_clock_divisor();
|
||||||
|
if(d>7){
|
||||||
|
#warning "spi baudrate too slow, cannot be set"
|
||||||
|
d=7;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: DDRs setzen
|
||||||
|
spsr = 0;
|
||||||
|
spsr |= (d & 1) ? 0 : _BV(SPI2X);
|
||||||
|
spcr = 0 | _BV(SPIE) | _BV(SPE);
|
||||||
|
spcr |= (d & 2) ? _BV(SPR0) : 0;
|
||||||
|
spcr |= (d & 4) ? _BV(SPR1) : 0;
|
||||||
|
|
||||||
|
#ifdef SPI_MASTER
|
||||||
|
spcr |= _BV(MSTR);
|
||||||
|
#endif
|
||||||
|
SPCR = spcr;
|
||||||
|
SPSR = spsr;
|
||||||
|
|
||||||
|
// initialize interface for ISR:
|
||||||
|
spi_readptr = spi_readbuf;
|
||||||
|
spi_readlen = SPI_READBUF_LEN;
|
||||||
|
spi_writeptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return true on success, false on error
|
||||||
|
uint8_t spi_write(uint8_t *data, uint8_t len){
|
||||||
|
if(spi_writeptr != NULL){
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
spi_writeptr = data;
|
||||||
|
spi_writelen = len;
|
||||||
|
//TODO: handle SS, write out first byte
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SPI_MASTER
|
||||||
|
ISR(SPI_vector){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif //SPI_MASTER
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
#define SPI_BAUDRATE 1000000
|
||||||
|
#define SPI_MASTER 1
|
||||||
|
#define SPI_READBUF_LEN 32
|
||||||
|
|
||||||
|
uint8_t spi_write(uint8_t *data, uint8_t len);
|
||||||
|
void spi_init();
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
include ../Makefile.inc
|
||||||
|
|
||||||
|
COMPILE = avr-gcc $(CFLAGS) $(DEFINES)
|
||||||
|
|
||||||
|
OBJECTS = main.o mcp_adc.o i2c_simple.o
|
||||||
|
|
||||||
|
# symbolic targets:
|
||||||
|
all: firmware.hex
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) -c $< -o $@
|
||||||
|
|
||||||
|
.S.o:
|
||||||
|
$(COMPILE) -x assembler-with-cpp -c $< -o $@
|
||||||
|
# "-x assembler-with-cpp" should not be necessary since this is the default
|
||||||
|
# file type for the .S (with capital S) extension. However, upper case
|
||||||
|
# characters are not always preserved on Windows. To ensure WinAVR
|
||||||
|
# compatibility define the file type manually.
|
||||||
|
|
||||||
|
.c.s:
|
||||||
|
$(COMPILE) -S $< -o $@
|
||||||
|
|
||||||
|
flash: all
|
||||||
|
avrdude -c usbasp -p m88 -U flash:w:firmware.hex
|
||||||
|
|
||||||
|
fuses:
|
||||||
|
avrdude -c usbasp -p m88 -U lfuse:w:0xdf:m -U hfuse:w:0xde:m # external oscillator
|
||||||
|
|
||||||
|
|
||||||
|
## what are the source dependencies
|
||||||
|
%.d: %.c
|
||||||
|
@set -e; rm -f $@; \
|
||||||
|
$(COMPILE) -MM $< | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@;
|
||||||
|
# line 1: exits if anything goes wrong
|
||||||
|
# line 2a: gcc -MM outputs dependencies
|
||||||
|
# line 2b: insert the %.d into dependency list
|
||||||
|
|
||||||
|
#main.c: version.h
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.hex *.obj *.i *.s *.d */*.i */*.s */*.o */*.d version.h
|
||||||
|
|
||||||
|
# file targets:
|
||||||
|
firmware.bin: $(OBJECTS)
|
||||||
|
$(COMPILE) -o firmware.bin $(OBJECTS)
|
||||||
|
|
||||||
|
firmware.hex: firmware.bin
|
||||||
|
rm -f firmware.hex firmware.eep.hex
|
||||||
|
avr-objcopy -j .text -j .data -O ihex firmware.bin firmware.hex
|
||||||
|
avr-size firmware.bin
|
||||||
|
# ./checksize firmware.bin 8192 960
|
||||||
|
# do the checksize script as our last action to allow successful compilation
|
||||||
|
# on Windows with WinAVR where the Unix commands will fail.
|
||||||
|
|
||||||
|
disasm: firmware.bin
|
||||||
|
avr-objdump -d firmware.bin >disasm
|
||||||
|
|
||||||
|
functionsize: disasm
|
||||||
|
python ../avrbuild/functionsize.py
|
||||||
|
|
||||||
|
countregs: disasm
|
||||||
|
python ../avrbuild/countregs.py
|
||||||
|
|
||||||
|
# for depends:
|
||||||
|
-include $(OBJECTS:.o=.d)
|
||||||
@ -0,0 +1,97 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "i2c_simple.h"
|
||||||
|
|
||||||
|
void i2c_init()
|
||||||
|
{
|
||||||
|
TWBR = 0;//bit rate
|
||||||
|
TWSR = 0;//Prescaler
|
||||||
|
|
||||||
|
TWAR = 0x80;//our address 1000 000, don't listen to general call
|
||||||
|
TWAMR = 0;
|
||||||
|
|
||||||
|
TWCR = TWEA | TWEN;/* TWINT clear -> we must do something; unset TWSTA manually!, TWSTO */
|
||||||
|
//TWDR - data
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data)
|
||||||
|
{
|
||||||
|
TWCR &= ~TWSTO;
|
||||||
|
TWCR |= TWINT | TWSTA;
|
||||||
|
while(~TWCR & TWINT) {;}/* get bus access */
|
||||||
|
/* no error possible */
|
||||||
|
|
||||||
|
TWDR = addr | 1;
|
||||||
|
TWCR &= ~(TWSTA | TWSTO);
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* transmit address */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MR_SLA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MR_ARB_LOST) {return 0;}
|
||||||
|
|
||||||
|
uint8_t done = 0;
|
||||||
|
while(done + 1 < len)
|
||||||
|
{
|
||||||
|
TWCR |= TWEA | TWINT;/* send ack after byte */
|
||||||
|
while(~TWCR & TWINT) {;}/* read data */
|
||||||
|
data[done] = TWDR;
|
||||||
|
done++;
|
||||||
|
TWCR |= TWINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWCR &= ~TWEA;
|
||||||
|
TWCR |= TWINT;/* send nak after byte */
|
||||||
|
while(~TWCR & TWINT) {;}/* read data */
|
||||||
|
data[done] = TWDR;
|
||||||
|
done++;
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data)
|
||||||
|
{
|
||||||
|
TWCR &= ~TWSTO;
|
||||||
|
TWCR |= TWINT | TWSTA;
|
||||||
|
while(~TWCR & TWINT) {;}/* get bus access */
|
||||||
|
/* no error possible */
|
||||||
|
|
||||||
|
TWDR = addr;
|
||||||
|
TWCR &= ~(TWSTA | TWSTO);
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* transmit address */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MT_SLA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MT_ARB_LOST) {return 0;}
|
||||||
|
|
||||||
|
uint8_t done = 0;
|
||||||
|
while(done < len)
|
||||||
|
{
|
||||||
|
TWDR = data[done];
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* write data */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MT_DATA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MT_ARB_LOST) {return done;}
|
||||||
|
done++;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata)
|
||||||
|
{
|
||||||
|
return 0; //TODO: implement
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
#include "main.h"
|
||||||
|
#include "spi.h"
|
||||||
|
|
||||||
|
|
||||||
|
void hardinit() {
|
||||||
|
/* initializes the hardware */
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
void softinit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int __attribute__((noreturn)) main(void) {
|
||||||
|
hardinit();
|
||||||
|
softinit();
|
||||||
|
|
||||||
|
for(;;){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef __MAIN_H
|
||||||
|
#define __MAIN_H
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <util/atomic.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define SOFTTIMERNUMS 4
|
||||||
|
|
||||||
|
#endif //__MAIN_H
|
||||||
@ -1 +0,0 @@
|
|||||||
../vusb-20100715/usbdrv/
|
|
||||||
Loading…
Reference in new issue