📄 put_data.c
字号:
//get_data.c
//
// Project Red 2002: High Performance OFDM Modem
// Against Channel Imperfections
// Auther: Linus Falk
#include "ofdm.h"
volatile unsigned int LoadHostBuffer1[HostBufferSize]; //buffer 1, +1 for register
volatile unsigned int LoadHostBuffer2[HostBufferSize]; //buffer 2, -----||--------
volatile unsigned int *CurrentLoadHostBuffer; //current buffer used
static unsigned char word_offset;
static unsigned char bit_offset;
void put_change_word(void);
//function to write data bitwise to host
void put_data(unsigned char nr_of_bits, unsigned int indata){
unsigned int data = 0;
unsigned int temp_data = 0;
char start_bits = 0;
char end_bits = 0;
char next_bit_offset = bit_offset + nr_of_bits;
if(next_bit_offset <= 32){ //can be written in this word
data = (unsigned int)indata;
LOAD_FIELD(CurrentLoadHostBuffer + word_offset, data,bit_offset, nr_of_bits); //load data
if(next_bit_offset == 32){ //if this word is written
put_change_word(); //change word
}else{ //bits left to write in word
bit_offset = next_bit_offset; //increase bit offset
}
}else{ //split, write to 2 words
end_bits = next_bit_offset - 32; //nr of bits to be read in next word
start_bits = nr_of_bits - end_bits; //nr of bits left to read in this buffer
data = GET_FIELD(&indata,0,start_bits);
LOAD_FIELD(CurrentLoadHostBuffer + word_offset, data,bit_offset, start_bits); //load data
put_change_word();
temp_data = GET_FIELD(&indata, start_bits, end_bits); //get last bits
LOAD_FIELD(CurrentLoadHostBuffer + word_offset, temp_data, 0, end_bits);
bit_offset = end_bits;
}
}
void put_change_word(void){
word_offset++;
bit_offset=0;
if(word_offset == HostBufferSize){ //Buffer used up
//CurrentLoadHostBuffer[HostBufferSize-1] = 0; //set host registry to 0
//byt buffer
if(CurrentLoadHostBuffer == LoadHostBuffer1){
CurrentLoadHostBuffer = LoadHostBuffer2;
pci_message_send(FILL_HOSTBUFFER1_MM); //Send fill buffer1 message to host
}else{
CurrentLoadHostBuffer = LoadHostBuffer1;
pci_message_send(FILL_HOSTBUFFER2_MM); //Send fill buffer2 message to host
}
word_offset = 0;
}
}
#pragma CODE_SECTION(init_put_data,"SBSRAM_PROG_MEM");
void init_put_data(void){
CurrentLoadHostBuffer = LoadHostBuffer1; //At startup set current buffer to HostBuffer1
word_offset = 0; //Begining of buffer
bit_offset = 0;
memset(LoadHostBuffer1,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 1
memset(LoadHostBuffer2,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 2
//fill HostBuffer1
//pci_message_sync_send(FILL_HOSTBUFFER1_MM);//send mailbox message to host
//fill HostBuffer2
//pci_message_sync_send(FILL_HOSTBUFFER2_MM);//send mailbox message to host
}
/*#pragma CODE_SECTION(init_put_data_dummy,"SBSRAM_PROG_MEM");
void init_put_data_dummy(void){
CurrentLoadHostBuffer = LoadHostBuffer1;
word_offset = 0;
bit_offset = 0;
memset(LoadHostBuffer1,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 1
memset(LoadHostBuffer2,0x00, HostBufferSize*sizeof(unsigned int)); //Fill buffer 2
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -