From b866ada6b3a87537bdd17c7b1e1e341e7fce1d23 Mon Sep 17 00:00:00 2001 From: Nidan Date: Fri, 13 Jan 2012 22:17:39 +0100 Subject: [PATCH 1/2] feeding read bytes from mmc into ringbuffer --- Makefile | 2 +- gg.c | 28 ++++++--------- mmc.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ mmc.h | 10 ++++++ 4 files changed, 128 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index b874eeb..ac49a35 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/gg.c b/gg.c index db968ba..64a095f 100644 --- a/gg.c +++ b/gg.c @@ -2,7 +2,7 @@ #include #include -#include "ringbuf_small.c" +#include "ringbuf_small.h" #include "mmc.h" #include "gg.h" @@ -33,13 +33,8 @@ 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 */ - ISR(TIMER1_OVF1_vect, ISR_NAKED) { __asm__("in r2, 0x3f"); // save sreg @@ -52,7 +47,7 @@ ISR(TIMER1_OVF1_vect, ISR_NAKED) cnt_to_next = 8; needs_new_data_flag = 1; } - __asm__("out 0x2f,r2"); // restore sreg + __asm__("out 0x3f,r2"); // restore sreg reti(); } @@ -61,21 +56,18 @@ ISR(TIMER1_OVF1_vect, ISR_NAKED) 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); } } diff --git a/mmc.c b/mmc.c index d31b202..2065452 100644 --- a/mmc.c +++ b/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>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>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) diff --git a/mmc.h b/mmc.h index 11dd25a..908cd47 100644 --- a/mmc.h +++ b/mmc.h @@ -9,6 +9,8 @@ Copyright (C) 2004 Ulrich Radig #include +#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 *); From 1e15396abf51c580e290bd997c38e1fd6cba7d20 Mon Sep 17 00:00:00 2001 From: Nidan Date: Fri, 13 Jan 2012 22:29:18 +0100 Subject: [PATCH 2/2] adapting to new ringbuffer --- gg.c | 6 ++---- ringbuf_small.c | 17 +++++------------ ringbuf_small.h | 10 +++++----- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/gg.c b/gg.c index 64a095f..4788a54 100644 --- a/gg.c +++ b/gg.c @@ -32,8 +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 -uint8_t buffer[BUFFER_SIZE];/* buffer for mmc data */ +#define BUFFER_SIZE 32 +uint16_t buffer[BUFFER_SIZE];/* buffer for mmc data */ ISR(TIMER1_OVF1_vect, ISR_NAKED) { @@ -51,8 +51,6 @@ ISR(TIMER1_OVF1_vect, ISR_NAKED) reti(); } - - int main(void) __attribute__((noreturn)); int main(void) { diff --git a/ringbuf_small.c b/ringbuf_small.c index 360d3e9..9be5caa 100644 --- a/ringbuf_small.c +++ b/ringbuf_small.c @@ -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); } - - - - - - - diff --git a/ringbuf_small.h b/ringbuf_small.h index 220c43f..9c3bf5e 100644 --- a/ringbuf_small.h +++ b/ringbuf_small.h @@ -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