]> git.zerfleddert.de Git - proxmark3-svn/blame - armsrc/BigBuf.c
Merge branch 'master' into GenericTracing
[proxmark3-svn] / armsrc / BigBuf.c
CommitLineData
117d9ec2 1//-----------------------------------------------------------------------------
2// Jonathan Westhues, Aug 2005
3// Gerhard de Koning Gans, April 2008, May 2011
4//
5// This code is licensed to you under the terms of the GNU GPL, version 2 or,
6// at your option, any later version. See the LICENSE.txt file for the text of
7// the license.
8//-----------------------------------------------------------------------------
9// BigBuf and functions to allocate/free parts of it.
10//-----------------------------------------------------------------------------
11
12#include <stdint.h>
13#include "proxmark3.h"
14#include "apps.h"
15#include "string.h"
16
f71f4deb 17// BigBuf is the large multi-purpose buffer, typically used to hold A/D samples or traces.
18// Also used to hold various smaller buffers and the Mifare Emulator Memory.
19
20// declare it as uint32_t to achieve alignment to 4 Byte boundary
21static uint32_t BigBuf[BIGBUF_SIZE/sizeof(uint32_t)];
117d9ec2 22
23// High memory mark
24static uint16_t BigBuf_hi = BIGBUF_SIZE;
25
f71f4deb 26// pointer to the emulator memory.
27static uint8_t *emulator_memory = NULL;
28
29// trace related global variables
30// (only one left). ToDo: make this static as well?
31uint16_t traceLen = 0;
117d9ec2 32
33
34// get the address of BigBuf
35uint8_t *BigBuf_get_addr(void)
36{
f71f4deb 37 return (uint8_t *)BigBuf;
38}
39
40
41// get the address of the emulator memory. Allocate part of Bigbuf for it, if not yet done
42uint8_t *BigBuf_get_EM_addr(void)
43{
44 if (emulator_memory == NULL) { // not yet allocated
45 emulator_memory = BigBuf_malloc(CARD_MEMORY_SIZE);
46 }
47
48 return emulator_memory;
117d9ec2 49}
50
51
52// clear ALL of BigBuf
53void BigBuf_Clear(void)
54{
55 memset(BigBuf,0,BIGBUF_SIZE);
56 Dbprintf("Buffer cleared (%i bytes)",BIGBUF_SIZE);
57}
58
59
f71f4deb 60// allocate a chunk of memory from BigBuf. We allocate high memory first. The unallocated memory
61// at the beginning of BigBuf is always for traces/samples
117d9ec2 62uint8_t *BigBuf_malloc(uint16_t chunksize)
63{
64 if (BigBuf_hi - chunksize < 0) {
f71f4deb 65 return NULL; // no memory left
117d9ec2 66 } else {
f71f4deb 67 chunksize = (chunksize + 3) & 0xfffc; // round to next multiple of 4
68 BigBuf_hi -= chunksize; // aligned to 4 Byte boundary
69 return (uint8_t *)BigBuf + BigBuf_hi;
117d9ec2 70 }
71}
72
73
f71f4deb 74// free ALL allocated chunks. The whole BigBuf is available for traces or samples again.
117d9ec2 75void BigBuf_free(void)
76{
77 BigBuf_hi = BIGBUF_SIZE;
f71f4deb 78 emulator_memory = NULL;
79}
80
81
82// free allocated chunks EXCEPT the emulator memory
83void BigBuf_free_keep_EM(void)
84{
85 if (emulator_memory != NULL) {
86 BigBuf_hi = emulator_memory - (uint8_t *)BigBuf;
87 } else {
88 BigBuf_hi = BIGBUF_SIZE;
89 }
117d9ec2 90}
91
92
93// return the maximum trace length (i.e. the unallocated size of BigBuf)
f71f4deb 94uint16_t BigBuf_max_traceLen(void)
117d9ec2 95{
96 return BigBuf_hi;
f71f4deb 97}
Impressum, Datenschutz