Merge branch 'master' of ghostdub.de:gg-button

master
Paul Goeser 14 years ago
commit 678e37800d

@ -1,7 +1,7 @@
CFLAGS += -Wall -Os -I. -mmcu=attiny26 -std=c99
DEFINES += -DF_CPU=16e6
OBJECTS = gg.o mmc.o
OBJECTS = gg.o mmc.o ringbuf_small.o
# further optimization:
# this removes dead code and does global linker optimization

34
gg.c

@ -2,7 +2,7 @@
#include <util/delay.h>
#include <avr/interrupt.h>
#include "ringbuf_small.c"
#include "ringbuf_small.h"
#include "mmc.h"
#include "gg.h"
@ -32,13 +32,8 @@ uint32_t mmc_position;/* current reading position on mmc */
uint8_t overflows = 1;/* remaining counter overflows until next sample */
#define SAMPLE_BITS 11
#define BUFFER_SIZE 64
#define REFRESH_AMOUNT 32
#define REFRESH_SIZE (BUFFER_SIZE - REFRESH_AMOUNT)
uint8_t buffer[BUFFER_SIZE];/* buffer for mmc data */
uint8_t pos = 0;/* current playing position */
uint8_t refresh_buffer = 0;/* position to start buffer refreshing */
#define BUFFER_SIZE 32
uint16_t buffer[BUFFER_SIZE];/* buffer for mmc data */
/*ISR(TIMER1_OVF1_vect, ISR_NAKED)
{
@ -53,7 +48,7 @@ uint8_t refresh_buffer = 0;/* position to start buffer refreshing */
cnt_to_next = 8;
needs_new_data_flag = 1;
}
__asm__("out 0x2f,r2"); // restore sreg
__asm__("out 0x3f,r2"); // restore sreg
reti();
}//*/
@ -77,26 +72,21 @@ ISR(TIMER1_OVF1_vect){
int main(void) __attribute__((noreturn));
int main(void)
{
uint8_t ref; // TODO: what does this do?
ringbuf_t rb;
ringbuf_init(&rb, buffer, BUFFER_SIZE);
if(mmc_init() != 0) {/* mmc fail */;}
mmc_read_part(0, length, 4);
timer_init_tiny26();
sei();
for(;;)
unsigned long block = 0;
for(;; block++)
{
if(pos == refresh_buffer)/* refresh buffer if running low */
{
/* TODO: this won't do. we don't have enough time to read unnecessary bytes -> read data with the same speed as we consume it, keeping a small buffer. */
/* expect 2 bit read from mmc between 2 timer interrupts --> 2 byte read per sample played */
mmc_read_sector(mmc_position, buffer + (ref + REFRESH_SIZE) % BUFFER_SIZE);//, BUFFER_SIZE - ref), buffer, REFRESH_AMOUNT - (BUFFER_SIZE - ref));
/* pos on sd , first buffer address , 1st buffer size ,2nd buf, 2nd buffer size */
refresh_buffer = (refresh_buffer + REFRESH_AMOUNT) % BUFFER_SIZE;
}
mmc_read_to_ringbuffer(block, &rb);
}
}

107
mmc.c

@ -187,6 +187,7 @@ void mmc_write_byte (unsigned char Byte)
#endif
}
#if 0
//############################################################################
//Routine zum schreiben eines Blocks(512Byte) auf die MMC/SD-Karte
unsigned char mmc_write_sector (unsigned long addr,unsigned char *Buffer)
@ -243,6 +244,7 @@ unsigned char mmc_write_sector (unsigned long addr,unsigned char *Buffer)
return(0);
}
#endif
//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
@ -297,6 +299,111 @@ unsigned char mmc_read_sector (unsigned long addr,unsigned char *Buffer)
return(0);
}
//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
void mmc_read_block_part(unsigned char *cmd,unsigned char *Buffer,uint16_t count, unsigned int Bytes)
//############################################################################
{
//Sendet Commando cmd an MMC/SD-Karte
if (mmc_write_command (cmd) != 0)
{
return;
}
//Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
while (mmc_read_byte() != 0xfe){};
//Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte
for (unsigned int a=0;a<Bytes;a++)
{
if(Bytes < count) {*Buffer++ = mmc_read_byte();}
else {mmc_read_byte();}
}
//CRC-Byte auslesen
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
MMC_Disable();
return;
}
//############################################################################
//Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
void mmc_read_part(unsigned long addr,unsigned char *Buffer, uint16_t count)
//############################################################################
{
//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
unsigned char cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingefügt*/
addr = addr << 9; //addr = addr * 512
cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 );
mmc_read_block_part(cmd, Buffer, count, 512);
}
//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
void mmc_read_block_to_ringbuffer(unsigned char *cmd, ringbuf_t *buffer, unsigned int Bytes)
//############################################################################
{
//Sendet Commando cmd an MMC/SD-Karte
if (mmc_write_command (cmd) != 0)
{
return;
}
//Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
while(mmc_read_byte() != 0xfe) {;}
uint16_t data = 0;
//Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte
for (unsigned int a=0;a<Bytes;a++)
{
data <<= 8;
data |= mmc_read_byte();
if(a & 1) {while(ringbuf_put(buffer, data)) {;}}
}
//CRC-Byte auslesen
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
MMC_Disable();
return;
}
//############################################################################
//Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
void mmc_read_to_ringbuffer(unsigned long addr, ringbuf_t *buffer)
//############################################################################
{
//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
unsigned char cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingefügt*/
addr = addr << 9; //addr = addr * 512
cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 );
mmc_read_block_to_ringbuffer(cmd, buffer, 512);
}
//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
unsigned char mmc_read_cid (unsigned char *Buffer)

10
mmc.h

@ -9,6 +9,8 @@ Copyright (C) 2004 Ulrich Radig
#include <avr/io.h>
#include "ringbuf_small.h"
//#define SPI_Mode 1 //1 = Hardware SPI | 0 = Software SPI
#define SPI_Mode 0
@ -60,6 +62,14 @@ extern unsigned char mmc_init(void);
extern unsigned char mmc_read_sector (unsigned long,unsigned char *);
extern void mmc_read_block_part(unsigned char *, unsigned char *, uint16_t, unsigned int);
extern void mmc_read_part(unsigned long, unsigned char *, uint16_t);
extern void mmc_read_block_to_ringbuffer(unsigned char *, ringbuf_t *, unsigned int);
extern void mmc_read_to_ringbuffer(unsigned long, ringbuf_t *);
extern unsigned char mmc_write_sector (unsigned long,unsigned char *);
extern unsigned char mmc_write_command (unsigned char *);

@ -10,11 +10,11 @@
* - reading of pointers allowed at any time
* - volatile not really necessary, unless you really need the functions to
* react to freespace/newdata while they're running
*
*
* PUT AND GET ARE NOT REENTRANT!
*/
void ringbuf_init(ringbuf_t *rb, uint16_t * buf, uint8_t size){
void ringbuf_init(ringbuf_t *rb, uint16_t *buf, uint8_t size){
rb->startptr = buf;
rb->size = size;
rb->readpos = 0;
@ -41,9 +41,9 @@ uint8_t ringbuf_put(ringbuf_t *rb, uint16_t value){
}
/* gets a value from the ringbuffer
* returns 0 on success, -1 on buffer empty
* returns 0 on success, 1 on buffer empty
*/
int8_t ringbuf_get(ringbuf_t *rb, uint16_t* data){
uint8_t ringbuf_get(ringbuf_t *rb, uint16_t *data){
//uint16_t value;
uint8_t next;
// calculate next ptr pos
@ -53,16 +53,9 @@ int8_t ringbuf_get(ringbuf_t *rb, uint16_t* data){
}
//check for empty
if(rb->readpos == rb->writepos){
return(-1);
return(1);
}
*data = *(rb->startptr + rb->readpos);
rb->readpos = next;
return(0);
}

@ -5,14 +5,14 @@
typedef struct {
uint16_t* startptr;
uint16_t size;
uint16_t readpos;
uint16_t writepos;
uint8_t size;
uint8_t readpos;
uint8_t writepos;
} ringbuf_t;
void ringbuf_init(ringbuf_t* rb, uint16_t* buf, uint8_t size);
void ringbuf_init(ringbuf_t* rb, uint16_t *buf, uint8_t size);
uint8_t ringbuf_put(ringbuf_t *rb, uint16_t value);
int8_t ringbuf_get(ringbuf_t *rb, uint16_t* data);
uint8_t ringbuf_get(ringbuf_t *rb, uint16_t *data);
#endif

Loading…
Cancel
Save